diff --git a/.browserslistrc b/.browserslistrc new file mode 100644 index 0000000..0ccadaf --- /dev/null +++ b/.browserslistrc @@ -0,0 +1,18 @@ +# This file is used by the build system to adjust CSS and JS output to support the specified browsers below. +# For additional information regarding the format and rule options, please see: +# https://github.com/browserslist/browserslist#queries + +# For the full list of supported browsers by the Angular framework, please see: +# https://angular.io/guide/browser-support + +# You can see what browsers were selected by your queries by running: +# npx browserslist + +last 1 Chrome version +last 1 Firefox version +last 2 Edge major versions +last 2 Safari major versions +last 2 iOS major versions +Firefox ESR +not IE 9-10 # Angular support for IE 9-10 has been deprecated and will be removed as of Angular v11. To opt-in, remove the 'not' prefix on this line. +not IE 11 # Angular supports IE 11 only as an opt-in. To opt-in, remove the 'not' prefix on this line. diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 0000000..fb0b8e3 --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,21 @@ +version: 2.1 + +jobs: + build-and-test: + environment: + _JAVA_OPTIONS: '-Dspring.profiles.active=prod' + docker: + - image: cimg/openjdk:11.0 + steps: + - checkout + - run: + name: Build + command: mvn -B -DskipTests clean package -P prod + - run: + name: Test + command: mvn test -P prod + +workflows: + datasurvey: + jobs: + - build-and-test diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..c2fa6a2 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,23 @@ +# EditorConfig helps developers define and maintain consistent +# coding styles between different editors and IDEs +# editorconfig.org + +root = true + +[*] + +# We recommend you to keep these unchanged +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +# Change these settings to your own preference +indent_style = space +indent_size = 4 + +[*.{ts,tsx,js,jsx,json,css,scss,yml,html,vue}] +indent_size = 2 + +[*.md] +trim_trailing_whitespace = false diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..0f4bda1 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,8 @@ +node_modules/ +src/main/docker/ +jest.conf.js +webpack/ +target/ +build/ +node/ +postcss.config.js diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..ee330c2 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,98 @@ +{ + "parser": "@typescript-eslint/parser", + "plugins": ["@angular-eslint/eslint-plugin", "@typescript-eslint"], + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "plugin:@typescript-eslint/recommended-requiring-type-checking", + "plugin:@angular-eslint/recommended", + "prettier", + "eslint-config-prettier" + ], + "env": { + "browser": true, + "es6": true, + "commonjs": true + }, + "parserOptions": { + "ecmaVersion": 2018, + "sourceType": "module", + "project": "./tsconfig.json" + }, + "rules": { + "@angular-eslint/component-selector": [ + "error", + { + "type": "element", + "prefix": "jhi", + "style": "kebab-case" + } + ], + "@angular-eslint/directive-selector": [ + "error", + { + "type": "attribute", + "prefix": "jhi", + "style": "camelCase" + } + ], + "@angular-eslint/relative-url-prefix": "error", + "@typescript-eslint/ban-types": [ + "error", + { + "extendDefaults": true, + "types": { + "{}": false + } + } + ], + "@typescript-eslint/explicit-function-return-type": ["error", { "allowExpressions": true }], + "@typescript-eslint/explicit-module-boundary-types": "off", + "@typescript-eslint/member-ordering": [ + "error", + { + "default": [ + "public-static-field", + "protected-static-field", + "private-static-field", + "public-instance-field", + "protected-instance-field", + "private-instance-field", + "constructor", + "public-static-method", + "protected-static-method", + "private-static-method", + "public-instance-method", + "protected-instance-method", + "private-instance-method" + ] + } + ], + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-floating-promises": "off", + "@typescript-eslint/no-non-null-assertion": "off", + "@typescript-eslint/no-parameter-properties": ["warn", { "allows": ["public", "private", "protected"] }], + "@typescript-eslint/no-shadow": ["error"], + "@typescript-eslint/no-unnecessary-condition": "error", + "@typescript-eslint/no-unsafe-assignment": "off", + "@typescript-eslint/no-unsafe-call": "off", + "@typescript-eslint/no-unsafe-member-access": "off", + "@typescript-eslint/prefer-nullish-coalescing": "error", + "@typescript-eslint/prefer-optional-chain": "error", + "@typescript-eslint/unbound-method": "off", + "arrow-body-style": "error", + "curly": "error", + "eqeqeq": ["error", "always", { "null": "ignore" }], + "guard-for-in": "error", + "no-bitwise": "error", + "no-caller": "error", + "no-console": ["error", { "allow": ["warn", "error"] }], + "no-eval": "error", + "no-labels": "error", + "no-new": "error", + "no-new-wrappers": "error", + "object-shorthand": ["error", "always", { "avoidExplicitReturnArrows": true }], + "radix": "error", + "spaced-comment": ["warn", "always"] + } +} diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..ca61722 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,150 @@ +# This file is inspired by https://github.com/alexkaratarakis/gitattributes +# +# Auto detect text files and perform LF normalization +# http://davidlaing.com/2012/09/19/customise-your-gitattributes-to-become-a-git-ninja/ +* text=auto + +# The above will handle all files NOT found below +# These files are text and should be normalized (Convert crlf => lf) + +*.bat text eol=crlf +*.cmd text eol=crlf +*.ps1 text eol=crlf +*.coffee text +*.css text +*.cql text +*.df text +*.ejs text +*.html text +*.java text +*.js text +*.json text +*.less text +*.properties text +*.sass text +*.scss text +*.sh text eol=lf +*.sql text +*.txt text +*.ts text +*.xml text +*.yaml text +*.yml text + +# Documents +*.doc diff=astextplain +*.DOC diff=astextplain +*.docx diff=astextplain +*.DOCX diff=astextplain +*.dot diff=astextplain +*.DOT diff=astextplain +*.pdf diff=astextplain +*.PDF diff=astextplain +*.rtf diff=astextplain +*.RTF diff=astextplain +*.markdown text +*.md text +*.adoc text +*.textile text +*.mustache text +*.csv text +*.tab text +*.tsv text +*.txt text +AUTHORS text +CHANGELOG text +CHANGES text +CONTRIBUTING text +COPYING text +copyright text +*COPYRIGHT* text +INSTALL text +license text +LICENSE text +NEWS text +readme text +*README* text +TODO text + +# Graphics +*.png binary +*.jpg binary +*.jpeg binary +*.gif binary +*.tif binary +*.tiff binary +*.ico binary +# SVG treated as an asset (binary) by default. If you want to treat it as text, +# comment-out the following line and uncomment the line after. +*.svg binary +#*.svg text +*.eps binary + +# These files are binary and should be left untouched +# (binary is a macro for -text -diff) +*.class binary +*.jar binary +*.war binary + +## LINTERS +.csslintrc text +.eslintrc text +.jscsrc text +.jshintrc text +.jshintignore text +.stylelintrc text + +## CONFIGS +*.conf text +*.config text +.editorconfig text +.gitattributes text +.gitconfig text +.gitignore text +.htaccess text +*.npmignore text + +## HEROKU +Procfile text +.slugignore text + +## AUDIO +*.kar binary +*.m4a binary +*.mid binary +*.midi binary +*.mp3 binary +*.ogg binary +*.ra binary + +## VIDEO +*.3gpp binary +*.3gp binary +*.as binary +*.asf binary +*.asx binary +*.fla binary +*.flv binary +*.m4v binary +*.mng binary +*.mov binary +*.mp4 binary +*.mpeg binary +*.mpg binary +*.swc binary +*.swf binary +*.webm binary + +## ARCHIVES +*.7z binary +*.gz binary +*.rar binary +*.tar binary +*.zip binary + +## FONTS +*.ttf binary +*.eot binary +*.otf binary +*.woff binary +*.woff2 binary diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..50f7684 --- /dev/null +++ b/.gitignore @@ -0,0 +1,159 @@ +###################### +# Project Specific +###################### +/src/main/webapp/content/css/main.css +/target/classes/static/** +/src/test/javascript/coverage/ + +###################### +# Node +###################### +/node/ +node_tmp/ +node_modules/ +npm-debug.log.* +/.awcache/* +/.cache-loader/* + +###################### +# SASS +###################### +.sass-cache/ + +###################### +# Eclipse +###################### +*.pydevproject +.project +.metadata +tmp/ +tmp/**/* +*.tmp +*.bak +*.swp +*~.nib +local.properties +.classpath +.settings/ +.loadpath +.factorypath +/src/main/resources/rebel.xml + +# External tool builders +.externalToolBuilders/** + +# Locally stored "Eclipse launch configurations" +*.launch + +# CDT-specific +.cproject + +# PDT-specific +.buildpath + +# STS-specific +/.sts4-cache/* + +###################### +# IntelliJ +###################### +.idea/ +*.iml +*.iws +*.ipr +*.ids +*.orig +classes/ +out/ + +###################### +# Visual Studio Code +###################### +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +*.code-workspace + +###################### +# Maven +###################### +/log/ +/target/ + +###################### +# Gradle +###################### +.gradle/ +/build/ + +###################### +# Package Files +###################### +*.jar +*.war +*.ear +*.db + +###################### +# Windows +###################### +# Windows image file caches +Thumbs.db + +# Folder config file +Desktop.ini + +###################### +# Mac OSX +###################### +.DS_Store +.svn + +# Thumbnails +._* + +# Files that might appear on external disk +.Spotlight-V100 +.Trashes + +###################### +# Directories +###################### +/bin/ +/deploy/ + +###################### +# Logs +###################### +*.log* + +###################### +# Others +###################### +*.class +*.*~ +*~ +.merge_file* + +###################### +# Gradle Wrapper +###################### +!gradle/wrapper/gradle-wrapper.jar + +###################### +# Maven Wrapper +###################### +!.mvn/wrapper/maven-wrapper.jar + +###################### +# ESLint +###################### +.eslintcache + +###################### +# Code coverage +###################### +/coverage/ +/.nyc_output/ diff --git a/.huskyrc b/.huskyrc new file mode 100644 index 0000000..4d077c8 --- /dev/null +++ b/.huskyrc @@ -0,0 +1,5 @@ +{ + "hooks": { + "pre-commit": "lint-staged" + } +} diff --git a/.jhipster/Categoria.json b/.jhipster/Categoria.json new file mode 100644 index 0000000..8d596a7 --- /dev/null +++ b/.jhipster/Categoria.json @@ -0,0 +1,40 @@ +{ + "name": "Categoria", + "fields": [ + { + "fieldName": "nombre", + "fieldType": "String", + "fieldValidateRules": ["required"] + }, + { + "fieldName": "estado", + "fieldType": "EstadoCategoria", + "fieldValues": "ACTIVE,INACTIVE", + "fieldValidateRules": ["required"] + } + ], + "relationships": [ + { + "relationshipType": "one-to-many", + "otherEntityName": "encuesta", + "otherEntityRelationshipName": "categoria", + "relationshipName": "encuesta" + }, + { + "relationshipType": "one-to-many", + "otherEntityName": "plantilla", + "otherEntityRelationshipName": "categoria", + "relationshipName": "plantilla" + } + ], + "entityTableName": "categoria", + "dto": "no", + "pagination": "no", + "service": "serviceClass", + "jpaMetamodelFiltering": true, + "fluentMethods": true, + "readOnly": false, + "embedded": false, + "applications": "*", + "changelogDate": "20210703210927" +} diff --git a/.jhipster/EPreguntaAbierta.json b/.jhipster/EPreguntaAbierta.json new file mode 100644 index 0000000..d060532 --- /dev/null +++ b/.jhipster/EPreguntaAbierta.json @@ -0,0 +1,46 @@ +{ + "name": "EPreguntaAbierta", + "fields": [ + { + "fieldName": "nombre", + "fieldType": "String", + "fieldValidateRules": ["required", "maxlength", "minlength"], + "fieldValidateRulesMaxlength": "500", + "fieldValidateRulesMinlength": "1" + }, + { + "fieldName": "opcional", + "fieldType": "Boolean", + "fieldValidateRules": ["required"] + }, + { + "fieldName": "orden", + "fieldType": "Integer", + "fieldValidateRules": ["required"] + } + ], + "relationships": [ + { + "relationshipType": "one-to-many", + "otherEntityName": "ePreguntaAbiertaRespuesta", + "otherEntityRelationshipName": "ePreguntaAbierta", + "relationshipName": "ePreguntaAbiertaRespuesta" + }, + { + "relationshipType": "many-to-one", + "otherEntityName": "encuesta", + "otherEntityRelationshipName": "ePreguntaAbierta", + "relationshipName": "encuesta" + } + ], + "entityTableName": "e_pregunta_abierta", + "dto": "no", + "pagination": "no", + "service": "serviceClass", + "jpaMetamodelFiltering": true, + "fluentMethods": true, + "readOnly": false, + "embedded": false, + "applications": "*", + "changelogDate": "20210703210922" +} diff --git a/.jhipster/EPreguntaAbiertaRespuesta.json b/.jhipster/EPreguntaAbiertaRespuesta.json new file mode 100644 index 0000000..3665276 --- /dev/null +++ b/.jhipster/EPreguntaAbiertaRespuesta.json @@ -0,0 +1,28 @@ +{ + "name": "EPreguntaAbiertaRespuesta", + "fields": [ + { + "fieldName": "respuesta", + "fieldType": "String", + "fieldValidateRules": ["required"] + } + ], + "relationships": [ + { + "relationshipType": "many-to-one", + "otherEntityName": "ePreguntaAbierta", + "otherEntityRelationshipName": "ePreguntaAbiertaRespuesta", + "relationshipName": "ePreguntaAbierta" + } + ], + "entityTableName": "e_pregunta_abierta_respuesta", + "dto": "no", + "pagination": "no", + "service": "serviceClass", + "jpaMetamodelFiltering": true, + "fluentMethods": true, + "readOnly": false, + "embedded": false, + "applications": "*", + "changelogDate": "20210703210923" +} diff --git a/.jhipster/EPreguntaCerrada.json b/.jhipster/EPreguntaCerrada.json new file mode 100644 index 0000000..3c2fe50 --- /dev/null +++ b/.jhipster/EPreguntaCerrada.json @@ -0,0 +1,52 @@ +{ + "name": "EPreguntaCerrada", + "fields": [ + { + "fieldName": "nombre", + "fieldType": "String", + "fieldValidateRules": ["required", "maxlength", "minlength"], + "fieldValidateRulesMaxlength": "500", + "fieldValidateRulesMinlength": "1" + }, + { + "fieldName": "tipo", + "fieldType": "PreguntaCerradaTipo", + "fieldValues": "SINGLE,MULTIPLE", + "fieldValidateRules": ["required"] + }, + { + "fieldName": "opcional", + "fieldType": "Boolean", + "fieldValidateRules": ["required"] + }, + { + "fieldName": "orden", + "fieldType": "Integer", + "fieldValidateRules": ["required"] + } + ], + "relationships": [ + { + "relationshipType": "one-to-many", + "otherEntityName": "ePreguntaCerradaOpcion", + "otherEntityRelationshipName": "ePreguntaCerrada", + "relationshipName": "ePreguntaCerradaOpcion" + }, + { + "relationshipType": "many-to-one", + "otherEntityName": "encuesta", + "otherEntityRelationshipName": "ePreguntaCerrada", + "relationshipName": "encuesta" + } + ], + "entityTableName": "e_pregunta_cerrada", + "dto": "no", + "pagination": "no", + "service": "serviceClass", + "jpaMetamodelFiltering": true, + "fluentMethods": true, + "readOnly": false, + "embedded": false, + "applications": "*", + "changelogDate": "20210703210924" +} diff --git a/.jhipster/EPreguntaCerradaOpcion.json b/.jhipster/EPreguntaCerradaOpcion.json new file mode 100644 index 0000000..0655ea2 --- /dev/null +++ b/.jhipster/EPreguntaCerradaOpcion.json @@ -0,0 +1,40 @@ +{ + "name": "EPreguntaCerradaOpcion", + "fields": [ + { + "fieldName": "nombre", + "fieldType": "String", + "fieldValidateRules": ["required", "maxlength", "minlength"], + "fieldValidateRulesMaxlength": "500", + "fieldValidateRulesMinlength": "1" + }, + { + "fieldName": "orden", + "fieldType": "Integer", + "fieldValidateRules": ["required"] + }, + { + "fieldName": "cantidad", + "fieldType": "Integer", + "fieldValidateRules": ["required"] + } + ], + "relationships": [ + { + "relationshipType": "many-to-one", + "otherEntityName": "ePreguntaCerrada", + "otherEntityRelationshipName": "ePreguntaCerradaOpcion", + "relationshipName": "ePreguntaCerrada" + } + ], + "entityTableName": "e_pregunta_cerrada_opcion", + "dto": "no", + "pagination": "no", + "service": "serviceClass", + "jpaMetamodelFiltering": true, + "fluentMethods": true, + "readOnly": false, + "embedded": false, + "applications": "*", + "changelogDate": "20210703210925" +} diff --git a/.jhipster/Encuesta.json b/.jhipster/Encuesta.json new file mode 100644 index 0000000..8d5bcbf --- /dev/null +++ b/.jhipster/Encuesta.json @@ -0,0 +1,97 @@ +{ + "name": "Encuesta", + "fields": [ + { + "fieldName": "nombre", + "fieldType": "String", + "fieldValidateRules": ["required", "maxlength", "minlength"], + "fieldValidateRulesMaxlength": "50", + "fieldValidateRulesMinlength": "1" + }, + { + "fieldName": "descripcion", + "fieldType": "String" + }, + { + "fieldName": "fechaCreacion", + "fieldType": "ZonedDateTime", + "fieldValidateRules": ["required"] + }, + { + "fieldName": "fechaPublicacion", + "fieldType": "ZonedDateTime" + }, + { + "fieldName": "fechaFinalizar", + "fieldType": "ZonedDateTime" + }, + { + "fieldName": "fechaFinalizada", + "fieldType": "ZonedDateTime" + }, + { + "fieldName": "calificacion", + "fieldType": "Double", + "fieldValidateRules": ["required"] + }, + { + "fieldName": "acceso", + "fieldType": "AccesoEncuesta", + "fieldValues": "PUBLIC,PRIVATE", + "fieldValidateRules": ["required"] + }, + { + "fieldName": "contrasenna", + "fieldType": "String" + }, + { + "fieldName": "estado", + "fieldType": "EstadoEncuesta", + "fieldValues": "DRAFT,ACTIVE,FINISHED,DELETED", + "fieldValidateRules": ["required"] + } + ], + "relationships": [ + { + "relationshipType": "one-to-many", + "otherEntityName": "usuarioEncuesta", + "otherEntityRelationshipName": "encuesta", + "relationshipName": "usuarioEncuesta" + }, + { + "relationshipType": "one-to-many", + "otherEntityName": "ePreguntaAbierta", + "otherEntityRelationshipName": "encuesta", + "relationshipName": "ePreguntaAbierta" + }, + { + "relationshipType": "one-to-many", + "otherEntityName": "ePreguntaCerrada", + "otherEntityRelationshipName": "encuesta", + "relationshipName": "ePreguntaCerrada" + }, + { + "relationshipType": "many-to-one", + "otherEntityName": "categoria", + "otherEntityRelationshipName": "encuesta", + "relationshipName": "categoria", + "otherEntityField": "nombre" + }, + { + "relationshipType": "many-to-one", + "otherEntityName": "usuarioExtra", + "otherEntityRelationshipName": "encuesta", + "relationshipName": "usuarioExtra" + } + ], + "entityTableName": "encuesta", + "dto": "no", + "pagination": "no", + "service": "serviceClass", + "jpaMetamodelFiltering": true, + "fluentMethods": true, + "readOnly": false, + "embedded": false, + "applications": "*", + "changelogDate": "20210703210921" +} diff --git a/.jhipster/Factura.json b/.jhipster/Factura.json new file mode 100644 index 0000000..fe04c81 --- /dev/null +++ b/.jhipster/Factura.json @@ -0,0 +1,36 @@ +{ + "name": "Factura", + "fields": [ + { + "fieldName": "nombreUsuario", + "fieldType": "String", + "fieldValidateRules": ["required"] + }, + { + "fieldName": "nombrePlantilla", + "fieldType": "String", + "fieldValidateRules": ["required"] + }, + { + "fieldName": "costo", + "fieldType": "Double", + "fieldValidateRules": ["required"] + }, + { + "fieldName": "fecha", + "fieldType": "ZonedDateTime", + "fieldValidateRules": ["required"] + } + ], + "relationships": [], + "entityTableName": "factura", + "dto": "no", + "pagination": "no", + "service": "serviceClass", + "jpaMetamodelFiltering": true, + "fluentMethods": true, + "readOnly": false, + "embedded": false, + "applications": "*", + "changelogDate": "20210703210928" +} diff --git a/.jhipster/PPreguntaAbierta.json b/.jhipster/PPreguntaAbierta.json new file mode 100644 index 0000000..7a3ca61 --- /dev/null +++ b/.jhipster/PPreguntaAbierta.json @@ -0,0 +1,40 @@ +{ + "name": "PPreguntaAbierta", + "fields": [ + { + "fieldName": "nombre", + "fieldType": "String", + "fieldValidateRules": ["required", "maxlength", "minlength"], + "fieldValidateRulesMaxlength": "500", + "fieldValidateRulesMinlength": "1" + }, + { + "fieldName": "opcional", + "fieldType": "Boolean", + "fieldValidateRules": ["required"] + }, + { + "fieldName": "orden", + "fieldType": "Integer", + "fieldValidateRules": ["required"] + } + ], + "relationships": [ + { + "relationshipType": "many-to-one", + "otherEntityName": "plantilla", + "otherEntityRelationshipName": "pPreguntaAbierta", + "relationshipName": "plantilla" + } + ], + "entityTableName": "p_pregunta_abierta", + "dto": "no", + "pagination": "no", + "service": "serviceClass", + "jpaMetamodelFiltering": true, + "fluentMethods": true, + "readOnly": false, + "embedded": false, + "applications": "*", + "changelogDate": "20210703210930" +} diff --git a/.jhipster/PPreguntaCerrada.json b/.jhipster/PPreguntaCerrada.json new file mode 100644 index 0000000..9e7d61c --- /dev/null +++ b/.jhipster/PPreguntaCerrada.json @@ -0,0 +1,52 @@ +{ + "name": "PPreguntaCerrada", + "fields": [ + { + "fieldName": "nombre", + "fieldType": "String", + "fieldValidateRules": ["required", "maxlength", "minlength"], + "fieldValidateRulesMaxlength": "500", + "fieldValidateRulesMinlength": "1" + }, + { + "fieldName": "tipo", + "fieldType": "PreguntaCerradaTipo", + "fieldValues": "SINGLE,MULTIPLE", + "fieldValidateRules": ["required"] + }, + { + "fieldName": "opcional", + "fieldType": "Boolean", + "fieldValidateRules": ["required"] + }, + { + "fieldName": "orden", + "fieldType": "Integer", + "fieldValidateRules": ["required"] + } + ], + "relationships": [ + { + "relationshipType": "one-to-many", + "otherEntityName": "pPreguntaCerradaOpcion", + "otherEntityRelationshipName": "pPreguntaCerrada", + "relationshipName": "pPreguntaCerradaOpcion" + }, + { + "relationshipType": "many-to-one", + "otherEntityName": "plantilla", + "otherEntityRelationshipName": "pPreguntaCerrada", + "relationshipName": "plantilla" + } + ], + "entityTableName": "p_pregunta_cerrada", + "dto": "no", + "pagination": "no", + "service": "serviceClass", + "jpaMetamodelFiltering": true, + "fluentMethods": true, + "readOnly": false, + "embedded": false, + "applications": "*", + "changelogDate": "20210703210931" +} diff --git a/.jhipster/PPreguntaCerradaOpcion.json b/.jhipster/PPreguntaCerradaOpcion.json new file mode 100644 index 0000000..fef612b --- /dev/null +++ b/.jhipster/PPreguntaCerradaOpcion.json @@ -0,0 +1,35 @@ +{ + "name": "PPreguntaCerradaOpcion", + "fields": [ + { + "fieldName": "nombre", + "fieldType": "String", + "fieldValidateRules": ["required", "maxlength", "minlength"], + "fieldValidateRulesMaxlength": "500", + "fieldValidateRulesMinlength": "1" + }, + { + "fieldName": "orden", + "fieldType": "Integer", + "fieldValidateRules": ["required"] + } + ], + "relationships": [ + { + "relationshipType": "many-to-one", + "otherEntityName": "pPreguntaCerrada", + "otherEntityRelationshipName": "pPreguntaCerradaOpcion", + "relationshipName": "pPreguntaCerrada" + } + ], + "entityTableName": "p_pregunta_cerrada_opcion", + "dto": "no", + "pagination": "no", + "service": "serviceClass", + "jpaMetamodelFiltering": true, + "fluentMethods": true, + "readOnly": false, + "embedded": false, + "applications": "*", + "changelogDate": "20210703210932" +} diff --git a/.jhipster/ParametroAplicacion.json b/.jhipster/ParametroAplicacion.json new file mode 100644 index 0000000..e2d9f9a --- /dev/null +++ b/.jhipster/ParametroAplicacion.json @@ -0,0 +1,36 @@ +{ + "name": "ParametroAplicacion", + "fields": [ + { + "fieldName": "maxDiasEncuesta", + "fieldType": "Integer", + "fieldValidateRules": ["required"] + }, + { + "fieldName": "minDiasEncuesta", + "fieldType": "Integer", + "fieldValidateRules": ["required"] + }, + { + "fieldName": "maxCantidadPreguntas", + "fieldType": "Integer", + "fieldValidateRules": ["required"] + }, + { + "fieldName": "minCantidadPreguntas", + "fieldType": "Integer", + "fieldValidateRules": ["required"] + } + ], + "relationships": [], + "entityTableName": "parametro_aplicacion", + "dto": "no", + "pagination": "no", + "service": "serviceClass", + "jpaMetamodelFiltering": true, + "fluentMethods": true, + "readOnly": false, + "embedded": false, + "applications": "*", + "changelogDate": "20210703210919" +} diff --git a/.jhipster/Plantilla.json b/.jhipster/Plantilla.json new file mode 100644 index 0000000..209123b --- /dev/null +++ b/.jhipster/Plantilla.json @@ -0,0 +1,74 @@ +{ + "name": "Plantilla", + "fields": [ + { + "fieldName": "nombre", + "fieldType": "String", + "fieldValidateRules": ["maxlength", "minlength"], + "fieldValidateRulesMaxlength": "50", + "fieldValidateRulesMinlength": "1" + }, + { + "fieldName": "descripcion", + "fieldType": "String" + }, + { + "fieldName": "fechaCreacion", + "fieldType": "ZonedDateTime", + "fieldValidateRules": ["required"] + }, + { + "fieldName": "fechaPublicacionTienda", + "fieldType": "ZonedDateTime" + }, + { + "fieldName": "estado", + "fieldType": "EstadoPlantilla", + "fieldValues": "DRAFT,ACTIVE,DELETED,DISABLED", + "fieldValidateRules": ["required"] + }, + { + "fieldName": "precio", + "fieldType": "Double", + "fieldValidateRules": ["required"] + } + ], + "relationships": [ + { + "relationshipType": "one-to-many", + "otherEntityName": "pPreguntaCerrada", + "otherEntityRelationshipName": "plantilla", + "relationshipName": "pPreguntaCerrada" + }, + { + "relationshipType": "one-to-many", + "otherEntityName": "pPreguntaAbierta", + "otherEntityRelationshipName": "plantilla", + "relationshipName": "pPreguntaAbierta" + }, + { + "relationshipType": "many-to-one", + "otherEntityName": "categoria", + "otherEntityRelationshipName": "plantilla", + "relationshipName": "categoria", + "otherEntityField": "nombre" + }, + { + "relationshipType": "many-to-many", + "otherEntityName": "usuarioExtra", + "otherEntityRelationshipName": "plantilla", + "relationshipName": "usuarioExtra", + "ownerSide": false + } + ], + "entityTableName": "plantilla", + "dto": "no", + "pagination": "no", + "service": "serviceClass", + "jpaMetamodelFiltering": true, + "fluentMethods": true, + "readOnly": false, + "embedded": false, + "applications": "*", + "changelogDate": "20210703210929" +} diff --git a/.jhipster/UsuarioEncuesta.json b/.jhipster/UsuarioEncuesta.json new file mode 100644 index 0000000..496c7bc --- /dev/null +++ b/.jhipster/UsuarioEncuesta.json @@ -0,0 +1,46 @@ +{ + "name": "UsuarioEncuesta", + "fields": [ + { + "fieldName": "rol", + "fieldType": "RolColaborador", + "fieldValues": "READ,WRITE", + "fieldValidateRules": ["required"] + }, + { + "fieldName": "estado", + "fieldType": "EstadoColaborador", + "fieldValues": "PENDING,ACTIVE", + "fieldValidateRules": ["required"] + }, + { + "fieldName": "fechaAgregado", + "fieldType": "ZonedDateTime", + "fieldValidateRules": ["required"] + } + ], + "relationships": [ + { + "relationshipType": "many-to-one", + "otherEntityName": "usuarioExtra", + "otherEntityRelationshipName": "usuarioEncuesta", + "relationshipName": "usuarioExtra" + }, + { + "relationshipType": "many-to-one", + "otherEntityName": "encuesta", + "otherEntityRelationshipName": "usuarioEncuesta", + "relationshipName": "encuesta" + } + ], + "entityTableName": "usuario_encuesta", + "dto": "no", + "pagination": "no", + "service": "serviceClass", + "jpaMetamodelFiltering": true, + "fluentMethods": true, + "readOnly": false, + "embedded": false, + "applications": "*", + "changelogDate": "20210703210926" +} diff --git a/.jhipster/UsuarioExtra.json b/.jhipster/UsuarioExtra.json new file mode 100644 index 0000000..eae921e --- /dev/null +++ b/.jhipster/UsuarioExtra.json @@ -0,0 +1,62 @@ +{ + "name": "UsuarioExtra", + "fields": [ + { + "fieldName": "nombre", + "fieldType": "String", + "fieldValidateRules": ["required"] + }, + { + "fieldName": "iconoPerfil", + "fieldType": "String" + }, + { + "fieldName": "fechaNacimiento", + "fieldType": "ZonedDateTime" + }, + { + "fieldName": "estado", + "fieldType": "EstadoUsuario", + "fieldValues": "ACTIVE,SUSPENDED", + "fieldValidateRules": ["required"] + } + ], + "relationships": [ + { + "relationshipType": "one-to-one", + "otherEntityName": "user", + "otherEntityRelationshipName": "usuarioExtra", + "relationshipName": "user", + "ownerSide": true + }, + { + "relationshipType": "one-to-many", + "otherEntityName": "encuesta", + "otherEntityRelationshipName": "usuarioExtra", + "relationshipName": "encuesta" + }, + { + "relationshipType": "one-to-many", + "otherEntityName": "usuarioEncuesta", + "otherEntityRelationshipName": "usuarioExtra", + "relationshipName": "usuarioEncuesta" + }, + { + "relationshipType": "many-to-many", + "otherEntityName": "plantilla", + "otherEntityRelationshipName": "usuarioExtra", + "relationshipName": "plantilla", + "ownerSide": true + } + ], + "entityTableName": "usuario_extra", + "dto": "no", + "pagination": "no", + "service": "serviceClass", + "jpaMetamodelFiltering": true, + "fluentMethods": true, + "readOnly": false, + "embedded": false, + "applications": "*", + "changelogDate": "20210703210920" +} diff --git a/.lintstagedrc.js b/.lintstagedrc.js new file mode 100644 index 0000000..dfb4f84 --- /dev/null +++ b/.lintstagedrc.js @@ -0,0 +1,3 @@ +module.exports = { + '{,src/**/,webpack/}*.{md,json,yml,html,js,ts,tsx,css,scss,java}': ['prettier --write'], +}; diff --git a/.mvn/wrapper/MavenWrapperDownloader.java b/.mvn/wrapper/MavenWrapperDownloader.java new file mode 100644 index 0000000..b901097 --- /dev/null +++ b/.mvn/wrapper/MavenWrapperDownloader.java @@ -0,0 +1,117 @@ +/* + * Copyright 2007-present the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import java.net.*; +import java.io.*; +import java.nio.channels.*; +import java.util.Properties; + +public class MavenWrapperDownloader { + + private static final String WRAPPER_VERSION = "0.5.6"; + /** + * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. + */ + private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/" + + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar"; + + /** + * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to + * use instead of the default one. + */ + private static final String MAVEN_WRAPPER_PROPERTIES_PATH = + ".mvn/wrapper/maven-wrapper.properties"; + + /** + * Path where the maven-wrapper.jar will be saved to. + */ + private static final String MAVEN_WRAPPER_JAR_PATH = + ".mvn/wrapper/maven-wrapper.jar"; + + /** + * Name of the property which should be used to override the default download url for the wrapper. + */ + private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; + + public static void main(String args[]) { + System.out.println("- Downloader started"); + File baseDirectory = new File(args[0]); + System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); + + // If the maven-wrapper.properties exists, read it and check if it contains a custom + // wrapperUrl parameter. + File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); + String url = DEFAULT_DOWNLOAD_URL; + if(mavenWrapperPropertyFile.exists()) { + FileInputStream mavenWrapperPropertyFileInputStream = null; + try { + mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); + Properties mavenWrapperProperties = new Properties(); + mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); + url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); + } catch (IOException e) { + System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); + } finally { + try { + if(mavenWrapperPropertyFileInputStream != null) { + mavenWrapperPropertyFileInputStream.close(); + } + } catch (IOException e) { + // Ignore ... + } + } + } + System.out.println("- Downloading from: " + url); + + File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); + if(!outputFile.getParentFile().exists()) { + if(!outputFile.getParentFile().mkdirs()) { + System.out.println( + "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'"); + } + } + System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); + try { + downloadFileFromURL(url, outputFile); + System.out.println("Done"); + System.exit(0); + } catch (Throwable e) { + System.out.println("- Error downloading"); + e.printStackTrace(); + System.exit(1); + } + } + + private static void downloadFileFromURL(String urlString, File destination) throws Exception { + if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) { + String username = System.getenv("MVNW_USERNAME"); + char[] password = System.getenv("MVNW_PASSWORD").toCharArray(); + Authenticator.setDefault(new Authenticator() { + @Override + protected PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication(username, password); + } + }); + } + URL website = new URL(urlString); + ReadableByteChannel rbc; + rbc = Channels.newChannel(website.openStream()); + FileOutputStream fos = new FileOutputStream(destination); + fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); + fos.close(); + rbc.close(); + } + +} diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..ffdc10e --- /dev/null +++ b/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,2 @@ +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.1/apache-maven-3.8.1-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..80bcbed --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +legacy-peer-deps = true diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..ab0567f --- /dev/null +++ b/.prettierignore @@ -0,0 +1,8 @@ +node_modules +target +build +package-lock.json +.git +.mvn +gradle +.gradle diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..f9b9911 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,18 @@ +# Prettier configuration + +printWidth: 140 +singleQuote: true +tabWidth: 2 +useTabs: false + +# js and ts rules: +arrowParens: avoid + +# jsx and tsx rules: +jsxBracketSameLine: false + +# java rules: +overrides: + - files: "*.java" + options: + tabWidth: 4 diff --git a/.yo-rc.json b/.yo-rc.json new file mode 100644 index 0000000..4cdc194 --- /dev/null +++ b/.yo-rc.json @@ -0,0 +1,65 @@ +{ + "generator-jhipster": { + "applicationType": "monolith", + "gitCompany": "", + "baseName": "DataSurvey", + "packageName": "org.datasurvey", + "packageFolder": "org/datasurvey", + "serverPort": 8080, + "serviceDiscoveryType": false, + "authenticationType": "jwt", + "cacheProvider": "ehcache", + "enableHibernateCache": true, + "websocket": "spring-websocket", + "databaseType": "sql", + "devDatabaseType": "mysql", + "prodDatabaseType": "mysql", + "searchEngine": false, + "enableSwaggerCodegen": false, + "messageBroker": false, + "buildTool": "maven", + "useSass": true, + "clientPackageManager": "npm", + "testFrameworks": [], + "enableTranslation": true, + "nativeLanguage": "es", + "languages": ["es"], + "clientFramework": "angularX", + "jhiPrefix": "jhi", + "withAdminUi": true, + "jhipsterVersion": "7.1.0", + "skipClient": false, + "skipServer": false, + "skipUserManagement": false, + "skipCheckLengthOfIdentifier": false, + "skipFakeData": false, + "entitySuffix": "", + "dtoSuffix": "DTO", + "blueprints": [], + "otherModules": [], + "pages": [], + "creationTimestamp": 1624822968886, + "jwtSecretKey": "ZjRmZGRhNzFhNDI5OTRmYjkzZmQ0NzI5Yzc3YTYyODBkMjFjZGY1OWMwNzY5YTJkOTA1ZDY3YzE1MWEwMGRkYzg4ZTNlOGUwNTAzMzdiMWVjNDA4NjFiY2JhNTNhYzhkZjQ3N2MyMmY5YzA5ZTFiNzIzMjJjMTg4MmFlNTUyOTY=", + "devServerPort": 4200, + "clientTheme": "none", + "clientThemeVariant": "", + "reactive": false, + "entities": [ + "ParametroAplicacion", + "UsuarioExtra", + "Encuesta", + "EPreguntaAbierta", + "EPreguntaAbiertaRespuesta", + "EPreguntaCerrada", + "EPreguntaCerradaOpcion", + "UsuarioEncuesta", + "Categoria", + "Factura", + "Plantilla", + "PPreguntaAbierta", + "PPreguntaCerrada", + "PPreguntaCerradaOpcion" + ], + "lastLiquibaseTimestamp": 1625346572000 + } +} diff --git a/Procfile b/Procfile new file mode 100644 index 0000000..aa868b3 --- /dev/null +++ b/Procfile @@ -0,0 +1 @@ +web: java $JAVA_OPTS -Xmx256m -jar target/*.jar --spring.profiles.active=prod --server.port=$PORT \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..fc63540 --- /dev/null +++ b/README.md @@ -0,0 +1,217 @@ +# DataSurvey + +This application was generated using JHipster 7.1.0, you can find documentation and help at [https://www.jhipster.tech/documentation-archive/v7.1.0](https://www.jhipster.tech/documentation-archive/v7.1.0). + +## Development + +Before you can build this project, you must install and configure the following dependencies on your machine: + +1. [Node.js][]: We use Node to run a development web server and build the project. + Depending on your system, you can install Node either from source or as a pre-packaged bundle. + +After installing Node, you should be able to run the following command to install development tools. +You will only need to run this command when dependencies change in [package.json](package.json). + +``` +npm install +``` + +We use npm scripts and [Angular CLI][] with [Webpack][] as our build system. + +Run the following commands in two separate terminals to create a blissful development experience where your browser +auto-refreshes when files change on your hard drive. + +``` +./mvnw +npm start +``` + +Npm is also used to manage CSS and JavaScript dependencies used in this application. You can upgrade dependencies by +specifying a newer version in [package.json](package.json). You can also run `npm update` and `npm install` to manage dependencies. +Add the `help` flag on any command to see how you can use it. For example, `npm help update`. + +The `npm run` command will list all of the scripts available to run for this project. + +### PWA Support + +JHipster ships with PWA (Progressive Web App) support, and it's turned off by default. One of the main components of a PWA is a service worker. + +The service worker initialization code is disabled by default. To enable it, uncomment the following code in `src/main/webapp/app/app.module.ts`: + +```typescript +ServiceWorkerModule.register('ngsw-worker.js', { enabled: false }), +``` + +### Managing dependencies + +For example, to add [Leaflet][] library as a runtime dependency of your application, you would run following command: + +``` +npm install --save --save-exact leaflet +``` + +To benefit from TypeScript type definitions from [DefinitelyTyped][] repository in development, you would run following command: + +``` +npm install --save-dev --save-exact @types/leaflet +``` + +Then you would import the JS and CSS files specified in library's installation instructions so that [Webpack][] knows about them: +Edit [src/main/webapp/app/app.module.ts](src/main/webapp/app/app.module.ts) file: + +``` +import 'leaflet/dist/leaflet.js'; +``` + +Edit [src/main/webapp/content/scss/vendor.scss](src/main/webapp/content/scss/vendor.scss) file: + +``` +@import '~leaflet/dist/leaflet.css'; +``` + +Note: There are still a few other things remaining to do for Leaflet that we won't detail here. + +For further instructions on how to develop with JHipster, have a look at [Using JHipster in development][]. + +### Using Angular CLI + +You can also use [Angular CLI][] to generate some custom client code. + +For example, the following command: + +``` +ng generate component my-component +``` + +will generate few files: + +``` +create src/main/webapp/app/my-component/my-component.component.html +create src/main/webapp/app/my-component/my-component.component.ts +update src/main/webapp/app/app.module.ts +``` + +## Building for production + +### Packaging as jar + +To build the final jar and optimize the DataSurvey application for production, run: + +``` +./mvnw -Pprod clean verify +``` + +This will concatenate and minify the client CSS and JavaScript files. It will also modify `index.html` so it references these new files. +To ensure everything worked, run: + +``` +java -jar target/*.jar +``` + +Then navigate to [http://localhost:8080](http://localhost:8080) in your browser. + +Refer to [Using JHipster in production][] for more details. + +### Packaging as war + +To package your application as a war in order to deploy it to an application server, run: + +``` +./mvnw -Pprod,war clean verify +``` + +## Testing + +To launch your application's tests, run: + +``` +./mvnw verify +``` + +### Client tests + +Unit tests are run by [Jest][]. They're located in [src/test/javascript/](src/test/javascript/) and can be run with: + +``` +npm test +``` + +For more information, refer to the [Running tests page][]. + +### Code quality + +Sonar is used to analyse code quality. You can start a local Sonar server (accessible on http://localhost:9001) with: + +``` +docker-compose -f src/main/docker/sonar.yml up -d +``` + +Note: we have turned off authentication in [src/main/docker/sonar.yml](src/main/docker/sonar.yml) for out of the box experience while trying out SonarQube, for real use cases turn it back on. + +You can run a Sonar analysis with using the [sonar-scanner](https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner) or by using the maven plugin. + +Then, run a Sonar analysis: + +``` +./mvnw -Pprod clean verify sonar:sonar +``` + +If you need to re-run the Sonar phase, please be sure to specify at least the `initialize` phase since Sonar properties are loaded from the sonar-project.properties file. + +``` +./mvnw initialize sonar:sonar +``` + +For more information, refer to the [Code quality page][]. + +## Using Docker to simplify development (optional) + +You can use Docker to improve your JHipster development experience. A number of docker-compose configuration are available in the [src/main/docker](src/main/docker) folder to launch required third party services. + +For example, to start a mysql database in a docker container, run: + +``` +docker-compose -f src/main/docker/mysql.yml up -d +``` + +To stop it and remove the container, run: + +``` +docker-compose -f src/main/docker/mysql.yml down +``` + +You can also fully dockerize your application and all the services that it depends on. +To achieve this, first build a docker image of your app by running: + +``` +./mvnw -Pprod verify jib:dockerBuild +``` + +Then run: + +``` +docker-compose -f src/main/docker/app.yml up -d +``` + +For more information refer to [Using Docker and Docker-Compose][], this page also contains information on the docker-compose sub-generator (`jhipster docker-compose`), which is able to generate docker configurations for one or several JHipster applications. + +## Continuous Integration (optional) + +To configure CI for your project, run the ci-cd sub-generator (`jhipster ci-cd`), this will let you generate configuration files for a number of Continuous Integration systems. Consult the [Setting up Continuous Integration][] page for more information. + +[jhipster homepage and latest documentation]: https://www.jhipster.tech +[jhipster 7.1.0 archive]: https://www.jhipster.tech/documentation-archive/v7.1.0 +[using jhipster in development]: https://www.jhipster.tech/documentation-archive/v7.1.0/development/ +[using docker and docker-compose]: https://www.jhipster.tech/documentation-archive/v7.1.0/docker-compose +[using jhipster in production]: https://www.jhipster.tech/documentation-archive/v7.1.0/production/ +[running tests page]: https://www.jhipster.tech/documentation-archive/v7.1.0/running-tests/ +[code quality page]: https://www.jhipster.tech/documentation-archive/v7.1.0/code-quality/ +[setting up continuous integration]: https://www.jhipster.tech/documentation-archive/v7.1.0/setting-up-ci/ +[node.js]: https://nodejs.org/ +[webpack]: https://webpack.github.io/ +[angular cli]: https://cli.angular.io/ +[browsersync]: https://www.browsersync.io/ +[jest]: https://facebook.github.io/jest/ +[jasmine]: https://jasmine.github.io/2.0/introduction.html +[leaflet]: https://leafletjs.com/ +[definitelytyped]: https://definitelytyped.org/ diff --git a/angular.json b/angular.json new file mode 100644 index 0000000..416e94a --- /dev/null +++ b/angular.json @@ -0,0 +1,114 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "data-survey": { + "projectType": "application", + "schematics": { + "@schematics/angular:component": { + "style": "scss" + }, + "@schematics/angular:application": { + "strict": true + } + }, + "root": "", + "sourceRoot": "src/main/webapp", + "prefix": "jhi", + "architect": { + "build": { + "builder": "@angular-builders/custom-webpack:browser", + "options": { + "customWebpackConfig": { + "path": "./webpack/webpack.custom.js" + }, + "outputPath": "target/classes/static/", + "index": "src/main/webapp/index.html", + "main": "src/main/webapp/main.ts", + "polyfills": "src/main/webapp/polyfills.ts", + "tsConfig": "tsconfig.app.json", + "inlineStyleLanguage": "scss", + "assets": [ + "src/main/webapp/content", + "src/main/webapp/favicon.ico", + "src/main/webapp/manifest.webapp", + "src/main/webapp/robots.txt", + { + "glob": "*.{js,css,html,png}", + "input": "./node_modules/swagger-ui-dist", + "output": "swagger-ui", + "ignore": ["**/index.html"] + }, + { "glob": "axios.min.js", "input": "./node_modules/axios/dist", "output": "swagger-ui" }, + { "glob": "**/*", "input": "src/main/webapp/swagger-ui/", "output": "swagger-ui" } + ], + "styles": ["src/main/webapp/content/scss/vendor.scss", "src/main/webapp/content/scss/global.scss"], + "scripts": [] + }, + "configurations": { + "production": { + "optimization": true, + "outputHashing": "all", + "sourceMap": false, + "namedChunks": false, + "extractLicenses": true, + "vendorChunk": false, + "buildOptimizer": true, + "serviceWorker": true, + "ngswConfigPath": "ngsw-config.json", + "budgets": [ + { + "type": "initial", + "maximumWarning": "500kb", + "maximumError": "1mb" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "2kb", + "maximumError": "4kb" + } + ] + }, + "development": { + "buildOptimizer": false, + "optimization": false, + "vendorChunk": true, + "extractLicenses": false, + "sourceMap": true, + "namedChunks": true + } + }, + "defaultConfiguration": "production" + }, + "serve": { + "builder": "@angular-builders/custom-webpack:dev-server", + "options": { + "browserTarget": "data-survey:build:development", + "proxyConfig": "./webpack/proxy.conf.js", + "port": 4200 + }, + "configurations": { + "production": { + "browserTarget": "data-survey:build:production" + }, + "development": { + "browserTarget": "data-survey:build:development" + } + }, + "defaultConfiguration": "development" + }, + "test": { + "builder": "@angular-builders/jest:run", + "options": { + "configPath": "jest.conf.js" + } + } + } + } + }, + "defaultProject": "data-survey", + "cli": { + "packageManager": "npm" + } +} diff --git a/checkstyle.xml b/checkstyle.xml new file mode 100644 index 0000000..5d5ae65 --- /dev/null +++ b/checkstyle.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + diff --git a/datasurvey-ent.jdl b/datasurvey-ent.jdl new file mode 100644 index 0000000..cb26b3f --- /dev/null +++ b/datasurvey-ent.jdl @@ -0,0 +1,196 @@ + + +DEFAULT_MIN_LENGTH = 1 +DEFAULT_MAX_LENGTH = 999 + +ENCUESTA_MAX_NOMBRE = 50 +ENCUESTA_MIN_NOMBRE = 1 +PREGUNTA_MAX_NOMBRE = 500 +PREGUNTA_MIN_NOMBRE = 1 + +// ENUMS +enum EstadoUsuario { + ACTIVE, SUSPENDED +} + +enum PreguntaCerradaTipo { + SINGLE, MULTIPLE +} + +enum EstadoEncuesta { + DRAFT, ACTIVE, FINISHED, DELETED +} + +enum EstadoPlantilla { + DRAFT, ACTIVE, DELETED, DISABLED +} + +enum RolColaborador { + READ, WRITE +} + +enum EstadoColaborador { + PENDING, ACTIVE +} + +enum EstadoCategoria { + ACTIVE, INACTIVE +} + +enum AccesoEncuesta { + PUBLIC, PRIVATE +} + +// ENTITIES +entity ParametroAplicacion { + maxDiasEncuesta Integer required, + minDiasEncuesta Integer required, + maxCantidadPreguntas Integer required, + minCantidadPreguntas Integer required +} + +entity UsuarioExtra { + nombre String required, + iconoPerfil String, + fechaNacimiento ZonedDateTime, + estado EstadoUsuario required, + // JHI_USER +} + +// ENCUESTA +entity Encuesta { + nombre String required maxlength(ENCUESTA_MAX_NOMBRE) minlength(ENCUESTA_MIN_NOMBRE), + descripcion String, + fechaCreacion ZonedDateTime required, + fechaPublicacion ZonedDateTime, + fechaFinalizar ZonedDateTime, + fechaFinalizada ZonedDateTime, + calificacion Double required, + acceso AccesoEncuesta required, + contrasenna String, + estado EstadoEncuesta required + // ID_CATEGORIA +} + +entity EPreguntaAbierta { + nombre String required maxlength(PREGUNTA_MAX_NOMBRE) minlength(PREGUNTA_MIN_NOMBRE), + opcional Boolean required, + orden Integer required + // ID_ENCUESTA +} + +entity EPreguntaAbiertaRespuesta { + respuesta String required + // ID_ENCUESTA_PREGUNTA_ABIERTA +} + +entity EPreguntaCerrada { + nombre String required maxlength(PREGUNTA_MAX_NOMBRE) minlength(PREGUNTA_MIN_NOMBRE), + tipo PreguntaCerradaTipo required + opcional Boolean required, + orden Integer required + // ID_ENCUESTA +} + +entity EPreguntaCerradaOpcion { + nombre String required maxlength(PREGUNTA_MAX_NOMBRE) minlength(PREGUNTA_MIN_NOMBRE), + orden Integer required, + cantidad Integer required + // ID_ENCUESTA_PREGUNTA_CERRADA +} + +entity UsuarioEncuesta { + rol RolColaborador required, + estado EstadoColaborador required, + fechaAgregado ZonedDateTime required +} +// ----------------------------------------- + +entity Categoria { + nombre String required + estado EstadoCategoria required +} + +entity Factura { + nombreUsuario String required, + nombrePlantilla String required, + costo Double required, + fecha ZonedDateTime required, + // ID_USUARIO_EXTRA +} + +// PLANTILLAS +entity Plantilla { + nombre String maxlength(ENCUESTA_MAX_NOMBRE) minlength(ENCUESTA_MIN_NOMBRE), + descripcion String, + fechaCreacion ZonedDateTime required, + fechaPublicacionTienda ZonedDateTime, + estado EstadoPlantilla required, + precio Double required + // ID_CATEGORIA +} + +entity PPreguntaAbierta { + nombre String required maxlength(PREGUNTA_MAX_NOMBRE) minlength(PREGUNTA_MIN_NOMBRE), + opcional Boolean required, + orden Integer required + // ID_PLANTILLA +} + +entity PPreguntaCerrada { + nombre String required maxlength(PREGUNTA_MAX_NOMBRE) minlength(PREGUNTA_MIN_NOMBRE), + tipo PreguntaCerradaTipo required, + opcional Boolean required, + orden Integer required + // ID_PLANTILLA +} + +entity PPreguntaCerradaOpcion { + nombre String required maxlength(PREGUNTA_MAX_NOMBRE) minlength(PREGUNTA_MIN_NOMBRE), + orden Integer required + // ID_PLANTILLA_PREGUNTA_CERRADA +} +// ----------------------------------------- + +// Filters +filter ParametroAplicacion, UsuarioExtra, Encuesta, EPreguntaAbierta, EPreguntaAbiertaRespuesta +filter EPreguntaCerrada, EPreguntaCerradaOpcion, UsuarioEncuesta, Categoria, Factura +filter Plantilla, PPreguntaAbierta, PPreguntaCerrada, PPreguntaCerradaOpcion + +// Relationship between UsuarioExtra and default User table to extend fields +relationship OneToOne { + UsuarioExtra to User +} + +// UsuarioExtra +relationship OneToMany { + Categoria to Encuesta{categoria(nombre)} + Categoria to Plantilla{categoria(nombre)} + + // Encuesta + UsuarioExtra to Encuesta + UsuarioExtra to UsuarioEncuesta + Encuesta to UsuarioEncuesta + + Encuesta to EPreguntaAbierta + Encuesta to EPreguntaCerrada + + EPreguntaAbierta to EPreguntaAbiertaRespuesta + EPreguntaCerrada to EPreguntaCerradaOpcion + + // Plantilla + Plantilla to PPreguntaCerrada + Plantilla to PPreguntaAbierta + + PPreguntaCerrada to PPreguntaCerradaOpcion +} + +relationship ManyToMany { + UsuarioExtra to Plantilla +} +// ----------------------------------------- + + + + + diff --git a/jest.conf.js b/jest.conf.js new file mode 100644 index 0000000..f121144 --- /dev/null +++ b/jest.conf.js @@ -0,0 +1,22 @@ +const { pathsToModuleNameMapper } = require('ts-jest/utils'); + +const { + compilerOptions: { paths = {}, baseUrl = './' }, +} = require('./tsconfig.json'); +const environment = require('./webpack/environment'); + +module.exports = { + globals: { + ...environment, + }, + roots: ['', `/${baseUrl}`], + modulePaths: [`/${baseUrl}`], + setupFiles: ['jest-date-mock'], + cacheDirectory: '/target/jest-cache', + coverageDirectory: '/target/test-results/', + moduleNameMapper: pathsToModuleNameMapper(paths, { prefix: `/${baseUrl}/` }), + reporters: ['default', ['jest-junit', { outputDirectory: '/target/test-results/', outputName: 'TESTS-results-jest.xml' }]], + testResultsProcessor: 'jest-sonar-reporter', + testMatch: ['/src/main/webapp/app/**/@(*.)@(spec.ts)'], + testURL: 'http://localhost/', +}; diff --git a/mvnw b/mvnw new file mode 100644 index 0000000..41c0f0c --- /dev/null +++ b/mvnw @@ -0,0 +1,310 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget "$jarUrl" -O "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl -o "$wrapperJarPath" "$jarUrl" -f + else + curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f + fi + + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/mvnw.cmd b/mvnw.cmd new file mode 100644 index 0000000..8611571 --- /dev/null +++ b/mvnw.cmd @@ -0,0 +1,182 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + +FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %DOWNLOAD_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE% diff --git a/ngsw-config.json b/ngsw-config.json new file mode 100644 index 0000000..8d57602 --- /dev/null +++ b/ngsw-config.json @@ -0,0 +1,21 @@ +{ + "$schema": "./node_modules/@angular/service-worker/config/schema.json", + "index": "/index.html", + "assetGroups": [ + { + "name": "app", + "installMode": "prefetch", + "resources": { + "files": ["/favicon.ico", "/index.html", "/manifest.webapp", "/*.css", "/*.js"] + } + }, + { + "name": "assets", + "installMode": "lazy", + "updateMode": "prefetch", + "resources": { + "files": ["/content/**", "/*.(eot|svg|cur|jpg|png|webp|gif|otf|ttf|woff|woff2|ani)"] + } + } + ] +} diff --git a/npmw b/npmw new file mode 100644 index 0000000..c9f12d7 --- /dev/null +++ b/npmw @@ -0,0 +1,25 @@ +#!/bin/sh + +basedir=`dirname "$0"` + +if [ -f "$basedir/mvnw" ]; then + builddir="target/node" + installCommand="$basedir/mvnw frontend:install-node-and-npm@install-node-and-npm" +else + builddir=".gradle/npm" + installCommand="$basedir/gradlew npmSetup" +fi + +NPM_EXE="$basedir/$builddir/npm" + +if ! [ -x "$NPM_EXE" ]; then + $installCommand || true +fi + +if ! [ -x "$NPM_EXE" ]; then + echo "Using npm installed globally" + npm "$@" +else + echo "Using npm installed locally $($NPM_EXE --version)" + $NPM_EXE "$@" +fi diff --git a/npmw.cmd b/npmw.cmd new file mode 100644 index 0000000..f0c285c --- /dev/null +++ b/npmw.cmd @@ -0,0 +1,24 @@ +@echo off + +@setlocal + +set NPMW_DIR=%~dp0 + +if exist "%NPMW_DIR%\mvnw.cmd" ( + set NPM_EXE=%NPMW_DIR%\target\node\npm.cmd + set INSTALL_NPM_COMMAND=%NPMW_DIR%\mvnw.cmd frontend:install-node-and-npm@install-node-and-npm +) else ( + set NPM_EXE=%NPMW_DIR%\.gradle\npm\npm.cmd + set INSTALL_NPM_COMMAND=%NPMW_DIR%\gradlew.bat npmSetup +) + +if not exist %NPM_EXE% ( + call %INSTALL_NPM_COMMAND% +) + +if not exist %NPM_EXE% goto globalNpm + +%NPM_EXE% %* + +:globalNpm +npm %* diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..d9af944 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,47988 @@ +{ + "name": "data-survey", + "version": "0.0.1-SNAPSHOT", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "data-survey", + "version": "0.0.1-SNAPSHOT", + "license": "UNLICENSED", + "dependencies": { + "@angular/common": "12.0.5", + "@angular/compiler": "12.0.5", + "@angular/core": "12.0.5", + "@angular/forms": "12.0.5", + "@angular/localize": "12.0.5", + "@angular/platform-browser": "12.0.5", + "@angular/platform-browser-dynamic": "12.0.5", + "@angular/router": "12.0.5", + "@fortawesome/angular-fontawesome": "0.9.0", + "@fortawesome/fontawesome-svg-core": "1.2.35", + "@fortawesome/free-solid-svg-icons": "5.15.3", + "@ng-bootstrap/ng-bootstrap": "9.1.3", + "@ngx-translate/core": "13.0.0", + "@ngx-translate/http-loader": "6.0.0", + "bootstrap": "4.6.0", + "dayjs": "1.10.5", + "ngx-infinite-scroll": "10.0.1", + "ngx-webstorage": "8.0.0", + "rxjs": "6.6.7", + "sockjs-client": "1.5.0", + "swagger-ui-dist": "3.50.0", + "tslib": "2.3.0", + "webstomp-client": "1.2.6", + "zone.js": "0.11.4" + }, + "devDependencies": { + "@angular-builders/custom-webpack": "12.1.0", + "@angular-builders/jest": "12.1.0", + "@angular-eslint/eslint-plugin": "12.1.0", + "@angular/cli": "12.0.4", + "@angular/compiler-cli": "12.0.5", + "@angular/service-worker": "12.0.5", + "@types/jest": "26.0.23", + "@types/node": "15.12.2", + "@types/sockjs-client": "1.5.0", + "@typescript-eslint/eslint-plugin": "4.27.0", + "@typescript-eslint/parser": "4.27.0", + "browser-sync": "2.26.14", + "browser-sync-webpack-plugin": "2.3.0", + "concurrently": "6.2.0", + "copy-webpack-plugin": "9.0.0", + "eslint": "7.28.0", + "eslint-config-prettier": "8.3.0", + "eslint-webpack-plugin": "2.5.4", + "generator-jhipster": "7.1.0", + "husky": "4.3.8", + "jest": "27.0.4", + "jest-date-mock": "1.0.8", + "jest-junit": "12.2.0", + "jest-sonar-reporter": "2.0.0", + "lint-staged": "11.0.0", + "merge-jsons-webpack-plugin": "1.0.21", + "prettier": "2.3.1", + "prettier-plugin-java": "1.2.0", + "prettier-plugin-packagejson": "2.2.11", + "rimraf": "3.0.2", + "ts-jest": "27.0.3", + "typescript": "4.2.4", + "wait-on": "5.3.0", + "webpack-bundle-analyzer": "4.4.2", + "webpack-merge": "5.8.0", + "webpack-notifier": "1.13.0" + }, + "engines": { + "node": ">=14.17.1" + } + }, + "node_modules/@angular-builders/custom-webpack": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/@angular-builders/custom-webpack/-/custom-webpack-12.1.0.tgz", + "integrity": "sha512-7tq0q4PN0L3rTTRxWz5f9xWGt2duYCutDhuRc6Rac6yG13SiTirawqUg2ROx0T3qFjo2G8IWzAageIEzHjl5DA==", + "dev": true, + "dependencies": { + "@angular-devkit/architect": ">=0.1200.0 < 0.1300.0", + "@angular-devkit/build-angular": "^12.0.0", + "@angular-devkit/core": "^12.0.0", + "lodash": "^4.17.15", + "ts-node": "^10.0.0", + "tsconfig-paths": "^3.9.0", + "webpack-merge": "^5.7.3" + }, + "engines": { + "node": ">=12.14.1" + } + }, + "node_modules/@angular-builders/jest": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/@angular-builders/jest/-/jest-12.1.0.tgz", + "integrity": "sha512-QdMfC2Xk6jD84gcCPdzgpfRTBfnp7QI0JnKEFmKTeTPyYSPWXCLm91lIv0m3JU7bS3NPHDq+VXupRqOXi96tZQ==", + "dev": true, + "dependencies": { + "@angular-devkit/architect": ">=0.1200.0 < 0.1300.0", + "@angular-devkit/core": "^12.0.0", + "jest-preset-angular": "^9.0.1", + "lodash": "^4.17.15" + }, + "engines": { + "node": ">=12.14.1" + }, + "peerDependencies": { + "jest": ">=27" + } + }, + "node_modules/@angular-devkit/architect": { + "version": "0.1201.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1201.1.tgz", + "integrity": "sha512-n7ycxrIPbtnV7q8PH5Uvs8Jd++u6hWUiB+8EUxznSfdHGA+fE7TTnJTkc27LoMlYZAImc/Axp/uyYZ6Awt72ZQ==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "12.1.1", + "rxjs": "6.6.7" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0", + "npm": "^6.11.0 || ^7.5.6", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/build-angular": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-12.1.1.tgz", + "integrity": "sha512-mJjpPuJlS55gwi/W2g8CIMjPVtUjKCKJdjn34eeYk1Kgw9JYRIsiEivx1hcGyLmiSTF8gRGvW1TEyO+k55/QqA==", + "dev": true, + "dependencies": { + "@angular-devkit/architect": "0.1201.1", + "@angular-devkit/build-optimizer": "0.1201.1", + "@angular-devkit/build-webpack": "0.1201.1", + "@angular-devkit/core": "12.1.1", + "@babel/core": "7.14.6", + "@babel/generator": "7.14.5", + "@babel/helper-annotate-as-pure": "7.14.5", + "@babel/plugin-proposal-async-generator-functions": "7.14.7", + "@babel/plugin-transform-async-to-generator": "7.14.5", + "@babel/plugin-transform-runtime": "7.14.5", + "@babel/preset-env": "7.14.7", + "@babel/runtime": "7.14.6", + "@babel/template": "7.14.5", + "@discoveryjs/json-ext": "0.5.3", + "@jsdevtools/coverage-istanbul-loader": "3.0.5", + "@ngtools/webpack": "12.1.1", + "ansi-colors": "4.1.1", + "babel-loader": "8.2.2", + "browserslist": "^4.9.1", + "cacache": "15.2.0", + "caniuse-lite": "^1.0.30001032", + "circular-dependency-plugin": "5.2.2", + "copy-webpack-plugin": "9.0.0", + "core-js": "3.15.1", + "critters": "0.0.10", + "css-loader": "5.2.6", + "css-minimizer-webpack-plugin": "3.0.1", + "find-cache-dir": "3.3.1", + "glob": "7.1.7", + "https-proxy-agent": "5.0.0", + "inquirer": "8.1.1", + "jest-worker": "27.0.2", + "karma-source-map-support": "1.4.0", + "less": "4.1.1", + "less-loader": "10.0.0", + "license-webpack-plugin": "2.3.19", + "loader-utils": "2.0.0", + "mini-css-extract-plugin": "1.6.2", + "minimatch": "3.0.4", + "open": "8.2.1", + "ora": "5.4.1", + "parse5-html-rewriting-stream": "6.0.1", + "postcss": "8.3.5", + "postcss-import": "14.0.2", + "postcss-loader": "6.1.0", + "postcss-preset-env": "6.7.0", + "raw-loader": "4.0.2", + "regenerator-runtime": "0.13.7", + "resolve-url-loader": "4.0.0", + "rxjs": "6.6.7", + "sass": "1.35.1", + "sass-loader": "12.1.0", + "semver": "7.3.5", + "source-map": "0.7.3", + "source-map-loader": "3.0.0", + "source-map-support": "0.5.19", + "style-loader": "2.0.0", + "stylus": "0.54.8", + "stylus-loader": "6.1.0", + "terser": "5.7.0", + "terser-webpack-plugin": "5.1.3", + "text-table": "0.2.0", + "tree-kill": "1.2.2", + "tslib": "2.3.0", + "webpack": "5.41.1", + "webpack-dev-middleware": "5.0.0", + "webpack-dev-server": "3.11.2", + "webpack-merge": "5.8.0", + "webpack-subresource-integrity": "1.5.2" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0", + "npm": "^6.11.0 || ^7.5.6", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "@angular/compiler-cli": "^12.0.0 || ^12.1.0-next", + "@angular/localize": "^12.0.0 || ^12.1.0-next", + "@angular/service-worker": "^12.0.0 || ^12.1.0-next", + "karma": "^6.3.0", + "ng-packagr": "^12.0.0 || ^12.1.0-next", + "protractor": "^7.0.0", + "tailwindcss": "^2.0.0", + "tslint": "^6.1.0", + "typescript": "~4.2.3 || ~4.3.2" + }, + "peerDependenciesMeta": { + "@angular/localize": { + "optional": true + }, + "@angular/service-worker": { + "optional": true + }, + "karma": { + "optional": true + }, + "ng-packagr": { + "optional": true + }, + "protractor": { + "optional": true + }, + "tailwindcss": { + "optional": true + }, + "tslint": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/build-optimizer": { + "version": "0.1201.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.1201.1.tgz", + "integrity": "sha512-SdAffCpjRNFKwnEq8xdPdCWPgdrfY8rlmTZXGY7e1whR4vnyZi+afk1BAsmbNyWlHYVv0Zcnh+Q1VH3OBDLwhw==", + "dev": true, + "dependencies": { + "source-map": "0.7.3", + "tslib": "2.3.0", + "typescript": "4.3.4" + }, + "bin": { + "build-optimizer": "src/build-optimizer/cli.js" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0", + "npm": "^6.11.0 || ^7.5.6", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "webpack": "^5.30.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/build-optimizer/node_modules/typescript": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.4.tgz", + "integrity": "sha512-uauPG7XZn9F/mo+7MrsRjyvbxFpzemRjKEZXS4AK83oP2KKOJPvb+9cO/gmnv8arWZvhnjVOXz7B49m1l0e9Ew==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/@angular-devkit/build-webpack": { + "version": "0.1201.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1201.1.tgz", + "integrity": "sha512-isgj6bSFr16tuXEoX0VypvsQmg3uDOdvYDQZvkwzUrIyvQo5TeoOy/MLgrb9v+tXjEA7oZrzuigE4Hjzn466bQ==", + "dev": true, + "dependencies": { + "@angular-devkit/architect": "0.1201.1", + "rxjs": "6.6.7" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0", + "npm": "^6.11.0 || ^7.5.6", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "webpack": "^5.30.0", + "webpack-dev-server": "^3.1.4" + } + }, + "node_modules/@angular-devkit/core": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-12.1.1.tgz", + "integrity": "sha512-z5+O3ugXbo8djKPjUtf/UfnYCmco2K1LVhQ6cWLhKi3NKRBiHeNmZh5nAycqFD8/Q+oI/+Ao40MkmkK1Tq0jsw==", + "dev": true, + "dependencies": { + "ajv": "8.6.0", + "ajv-formats": "2.1.0", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.7", + "source-map": "0.7.3" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0", + "npm": "^6.11.0 || ^7.5.6", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/schematics": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-12.0.4.tgz", + "integrity": "sha512-MEAAcOh1Y4R6O7HWo7mMXgRK9BSbCZ3rlx+aHmtWpNXohw0TRhNY5WmRnQTRvMA3qjR9nh0Uo7BkRpgwRfqmBw==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "12.0.4", + "ora": "5.4.0", + "rxjs": "6.6.7" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0", + "npm": "^6.11.0 || ^7.5.6", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/@angular-devkit/core": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-12.0.4.tgz", + "integrity": "sha512-gtQkLXuQK7NPkurw49//MFZWoRa9aVCIbxE2uxbDAzzQengx9nLUoezS2xVdM7m/SqVK72YL+ZFfSTXzfiSdnA==", + "dev": true, + "dependencies": { + "ajv": "8.2.0", + "ajv-formats": "2.0.2", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.7", + "source-map": "0.7.3" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0", + "npm": "^6.11.0 || ^7.5.6", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/ajv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.2.0.tgz", + "integrity": "sha512-WSNGFuyWd//XO8n/m/EaOlNLtO0yL8EXT/74LqT4khdhpZjP7lkj/kT5uwRmGitKEVp/Oj7ZUHeGfPtgHhQ5CA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/ajv-formats": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.0.2.tgz", + "integrity": "sha512-Brah4Uo5/U8v76c6euTwtjVFFaVishwnJrQBYpev1JRh4vjA1F4HY3UzQez41YUCszUCXKagG8v6eVRBHV1gkw==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/schematics/node_modules/ansi-styles": { + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/color-convert": { + "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" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@angular-devkit/schematics/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 + }, + "node_modules/@angular-devkit/schematics/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" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/ora": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.0.tgz", + "integrity": "sha512-1StwyXQGoU6gdjYkyVcqOLnVlbKj+6yPNNOxJVgpt9t4eksKjiriiHuxktLYkgllwk+D6MbC4ihH84L1udRXPg==", + "dev": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@angular-eslint/eslint-plugin": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-12.1.0.tgz", + "integrity": "sha512-l/WzdB8KMohKFB6ts3wfiAgdbhf2lxNQ1zKn/E5buDoLCbptHYEZN7eKqUNaQdWoT5mSlAQOGpliiSKuytdHWw==", + "dev": true, + "dependencies": { + "@typescript-eslint/experimental-utils": "4.23.0" + }, + "peerDependencies": { + "@angular/compiler": ">= 12.0.0 < 13.0.0", + "eslint": "*", + "typescript": "*" + } + }, + "node_modules/@angular/cli": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-12.0.4.tgz", + "integrity": "sha512-kZaJ55udB/AjQ+q8CrQfk6JGWdnJpH3c2VtbvSuR/ihiG6zMSxwpXqt1rImQN0RfffG3bsHD2SpM+T7/LKPemw==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@angular-devkit/architect": "0.1200.4", + "@angular-devkit/core": "12.0.4", + "@angular-devkit/schematics": "12.0.4", + "@schematics/angular": "12.0.4", + "@yarnpkg/lockfile": "1.1.0", + "ansi-colors": "4.1.1", + "debug": "4.3.1", + "ini": "2.0.0", + "inquirer": "8.0.0", + "jsonc-parser": "3.0.0", + "npm-package-arg": "8.1.2", + "npm-pick-manifest": "6.1.1", + "open": "8.0.2", + "ora": "5.4.0", + "pacote": "11.3.2", + "resolve": "1.20.0", + "rimraf": "3.0.2", + "semver": "7.3.5", + "symbol-observable": "4.0.0", + "uuid": "8.3.2" + }, + "bin": { + "ng": "bin/ng" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0", + "npm": "^6.11.0 || ^7.5.6", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/cli/node_modules/@angular-devkit/architect": { + "version": "0.1200.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1200.4.tgz", + "integrity": "sha512-/BKaVlpbZYb65elZ+xHoKB2J2DuTstMU++dqE9T/7E0CevuMoOdkLQFQm71Kjl3eFI4i6T5d8mlLVPNE/ZWm7w==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "12.0.4", + "rxjs": "6.6.7" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0", + "npm": "^6.11.0 || ^7.5.6", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/cli/node_modules/@angular-devkit/core": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-12.0.4.tgz", + "integrity": "sha512-gtQkLXuQK7NPkurw49//MFZWoRa9aVCIbxE2uxbDAzzQengx9nLUoezS2xVdM7m/SqVK72YL+ZFfSTXzfiSdnA==", + "dev": true, + "dependencies": { + "ajv": "8.2.0", + "ajv-formats": "2.0.2", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.7", + "source-map": "0.7.3" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0", + "npm": "^6.11.0 || ^7.5.6", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/cli/node_modules/ajv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.2.0.tgz", + "integrity": "sha512-WSNGFuyWd//XO8n/m/EaOlNLtO0yL8EXT/74LqT4khdhpZjP7lkj/kT5uwRmGitKEVp/Oj7ZUHeGfPtgHhQ5CA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@angular/cli/node_modules/ajv-formats": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.0.2.tgz", + "integrity": "sha512-Brah4Uo5/U8v76c6euTwtjVFFaVishwnJrQBYpev1JRh4vjA1F4HY3UzQez41YUCszUCXKagG8v6eVRBHV1gkw==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/@angular/cli/node_modules/ansi-styles": { + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@angular/cli/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@angular/cli/node_modules/color-convert": { + "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" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@angular/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==", + "dev": true + }, + "node_modules/@angular/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" + } + }, + "node_modules/@angular/cli/node_modules/inquirer": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.0.0.tgz", + "integrity": "sha512-ON8pEJPPCdyjxj+cxsYRe6XfCJepTxANdNnTebsTuQgXpRyZRRT9t4dJwjRubgmvn20CLSEnozRUayXyM9VTXA==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.6", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@angular/cli/node_modules/open": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.0.2.tgz", + "integrity": "sha512-NV5QmWJrTaNBLHABJyrb+nd5dXI5zfea/suWawBhkHzAbVhLLiJdrqMgxMypGK9Eznp2Ltoh7SAVkQ3XAucX7Q==", + "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular/cli/node_modules/ora": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.0.tgz", + "integrity": "sha512-1StwyXQGoU6gdjYkyVcqOLnVlbKj+6yPNNOxJVgpt9t4eksKjiriiHuxktLYkgllwk+D6MbC4ihH84L1udRXPg==", + "dev": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular/cli/node_modules/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@angular/common": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-12.0.5.tgz", + "integrity": "sha512-jKiPjWVL3jXVKgXwINlsF5O0r9gX/mAoa5UVy57O8jcg+ENbH9LLSOikgiF/0HPxk2uvRV5OYmbBgOY1xT41kQ==", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0" + }, + "peerDependencies": { + "@angular/core": "12.0.5", + "rxjs": "^6.5.3" + } + }, + "node_modules/@angular/compiler": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-12.0.5.tgz", + "integrity": "sha512-G255aP4hhQ04hSQ1/JgiKNeTzRCuLgK220lJXkHubpu+f67os5LArhFNxZaUC/EVa/sloOT7Fo5tn8C5gy7iLA==", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0" + } + }, + "node_modules/@angular/compiler-cli": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-12.0.5.tgz", + "integrity": "sha512-XBZWU2S7N2kvQJK0H5KyLHiLVhYJrjh3NtbVBv67sCY9Ft8fv2jjbozTgXqeoYZ1xAxcZ2ZAB0n5SkhmY75Mow==", + "dev": true, + "dependencies": { + "@babel/core": "^7.8.6", + "@babel/types": "^7.8.6", + "canonical-path": "1.0.0", + "chokidar": "^3.0.0", + "convert-source-map": "^1.5.1", + "dependency-graph": "^0.11.0", + "magic-string": "^0.25.0", + "minimist": "^1.2.0", + "reflect-metadata": "^0.1.2", + "semver": "^7.0.0", + "source-map": "^0.6.1", + "sourcemap-codec": "^1.4.8", + "tslib": "^2.1.0", + "yargs": "^16.2.0" + }, + "bin": { + "ivy-ngcc": "ngcc/main-ivy-ngcc.js", + "ng-xi18n": "src/extract_i18n.js", + "ngc": "src/main.js", + "ngcc": "ngcc/main-ngcc.js" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0" + }, + "peerDependencies": { + "@angular/compiler": "12.0.5", + "typescript": ">=4.2.3 <4.3" + } + }, + "node_modules/@angular/compiler-cli/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@angular/core": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-12.0.5.tgz", + "integrity": "sha512-uVYsZa1VqVw8vNcjUYgfjXBc1M3WaxLXoLnCsDvutJiln4csa8Yw8p7RqQSrZ6AgQ8o2LHD2JJ5kus3EDMwfcA==", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0" + }, + "peerDependencies": { + "rxjs": "^6.5.3", + "zone.js": "~0.11.4" + } + }, + "node_modules/@angular/forms": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-12.0.5.tgz", + "integrity": "sha512-Ew/fGPTsywoYnm6DFPA/DyLl4Sb+1/uzpledrbxUHzaSKIrnXFrjQiUTmsbbq+8qono3JzbUIblqH1DrNThYiA==", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0" + }, + "peerDependencies": { + "@angular/common": "12.0.5", + "@angular/core": "12.0.5", + "@angular/platform-browser": "12.0.5", + "rxjs": "^6.5.3" + } + }, + "node_modules/@angular/localize": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-12.0.5.tgz", + "integrity": "sha512-CRyXsNJYV7TJBsbG/Sn6lW9qMQCa+lw5SSNKHvnmfCTyd5p3DV8AdjOYkyWM5tfB4wg/aOc4C1ynDom4TmKv+w==", + "dependencies": { + "@babel/core": "7.8.3", + "glob": "7.1.7", + "yargs": "^16.2.0" + }, + "bin": { + "localize-extract": "src/tools/src/extract/main.js", + "localize-migrate": "src/tools/src/migrate/main.js", + "localize-translate": "src/tools/src/translate/main.js" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0" + }, + "peerDependencies": { + "@angular/compiler": "12.0.5", + "@angular/compiler-cli": "12.0.5" + } + }, + "node_modules/@angular/localize/node_modules/@babel/core": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.3.tgz", + "integrity": "sha512-4XFkf8AwyrEG7Ziu3L2L0Cv+WyY47Tcsp70JFmpftbAA1K7YL/sgE9jh9HyNj08Y/U50ItUchpN0w6HxAoX1rA==", + "dependencies": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.3", + "@babel/helpers": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.0", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@angular/localize/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@angular/localize/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@angular/platform-browser": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-12.0.5.tgz", + "integrity": "sha512-MLioK9gcdZOKINE8OmIHZICRnFySaWyCBeVbHS4Z4Vxgr+E2S2eO1IxBmGyQpJq1wDPBP9A/9LVLMUNbHu4Cdw==", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0" + }, + "peerDependencies": { + "@angular/animations": "12.0.5", + "@angular/common": "12.0.5", + "@angular/core": "12.0.5" + }, + "peerDependenciesMeta": { + "@angular/animations": { + "optional": true + } + } + }, + "node_modules/@angular/platform-browser-dynamic": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-12.0.5.tgz", + "integrity": "sha512-sYkOJxXj4vEZICT2oODkQF9wNaKoScSkiw2ooBYN0UX02mFKlWKa9vkzp6JmN1EF8YOWF0JnRqBPAi1WbOnAMw==", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0" + }, + "peerDependencies": { + "@angular/common": "12.0.5", + "@angular/compiler": "12.0.5", + "@angular/core": "12.0.5", + "@angular/platform-browser": "12.0.5" + } + }, + "node_modules/@angular/router": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-12.0.5.tgz", + "integrity": "sha512-2jiaT+OxCmJbeJ0MTPmIHBsTFLysenvPZteozYsjcmUo9mOzJHAjqHLJvTC+Ri+E9xvnplh+8BPETRleV1pAFw==", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0" + }, + "peerDependencies": { + "@angular/common": "12.0.5", + "@angular/core": "12.0.5", + "@angular/platform-browser": "12.0.5", + "rxjs": "^6.5.3" + } + }, + "node_modules/@angular/service-worker": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-12.0.5.tgz", + "integrity": "sha512-ZJ8EhuTaktZgoo1ZylmiTlxmALaAiK7ow0vTInfuRSkVbrUhuJQv3qqAEoGAgLH5a3QW+E8/8CoMzNMDcwpWXQ==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + }, + "bin": { + "ngsw-config": "ngsw-config.js" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0" + }, + "peerDependencies": { + "@angular/common": "12.0.5", + "@angular/core": "12.0.5" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", + "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "dependencies": { + "@babel/highlight": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.7.tgz", + "integrity": "sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.6.tgz", + "integrity": "sha512-gJnOEWSqTk96qG5BoIrl5bVtc23DCycmIePPYnamY9RboYdI4nFy5vAQMSl81O5K/W0sLDWfGysnOECC+KUUCA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.14.5", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helpers": "^7.14.6", + "@babel/parser": "^7.14.6", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/core/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.5.tgz", + "integrity": "sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA==", + "dependencies": { + "@babel/types": "^7.14.5", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz", + "integrity": "sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.14.5.tgz", + "integrity": "sha512-YTA/Twn0vBXDVGJuAX6PwW7x5zQei1luDDo2Pl6q1qZ7hVNl0RZrhHCQG/ArGpR29Vl7ETiB8eJyrvpuRp300w==", + "dev": true, + "dependencies": { + "@babel/helper-explode-assignable-expression": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.5.tgz", + "integrity": "sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.16.6", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.6.tgz", + "integrity": "sha512-Z6gsfGofTxH/+LQXqYEK45kxmcensbzmk/oi8DmaQytlQCgqNZt9XQF8iqlI/SeXWVjaMNxvYvzaYw+kh42mDg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-member-expression-to-functions": "^7.14.5", + "@babel/helper-optimise-call-expression": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz", + "integrity": "sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "regexpu-core": "^4.7.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz", + "integrity": "sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0-0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-explode-assignable-expression": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.14.5.tgz", + "integrity": "sha512-Htb24gnGJdIGT4vnRKMdoXiOIlqOLmdiUYpAQ0mYfgVT/GDm8GOYhgi4GL+hMKrkiPRohO4ts34ELFsGAPQLDQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", + "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", + "dependencies": { + "@babel/helper-get-function-arity": "^7.14.5", + "@babel/template": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-get-function-arity": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", + "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", + "dependencies": { + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", + "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", + "dependencies": { + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz", + "integrity": "sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", + "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.5.tgz", + "integrity": "sha512-iXpX4KW8LVODuAieD7MzhNjmM6dzYY5tfRqT+R9HDXWl0jPn/djKmA+G9s/2C2T9zggw5tK1QNqZ70USfedOwA==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5", + "@babel/helper-simple-access": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.5", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", + "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", + "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.14.5.tgz", + "integrity": "sha512-rLQKdQU+HYlxBwQIj8dk4/0ENOUEhA/Z0l4hN8BexpvmSMN9oA9EagjnhnDpNsRdWCfjwa4mn/HyBXO9yhQP6A==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-wrap-function": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz", + "integrity": "sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow==", + "dev": true, + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.14.5", + "@babel/helper-optimise-call-expression": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.5.tgz", + "integrity": "sha512-nfBN9xvmCt6nrMZjfhkl7i0oTV3yxR4/FztsbOASyTvVcoYd0TRHh7eMLdlEcCqobydC0LAF3LtC92Iwxo0wyw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz", + "integrity": "sha512-dmqZB7mrb94PZSAOYtr+ZN5qt5owZIAgqtoTuqiFbHFtxgEcmQlRJVI+bO++fciBunXtB6MK7HrzrfcAzIz2NQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", + "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", + "dependencies": { + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", + "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.14.5.tgz", + "integrity": "sha512-YEdjTCq+LNuNS1WfxsDCNpgXkJaIyqco6DAelTUjT4f2KIWC1nBcaCaSdHTBqQVLnTBexBcVcFhLSU1KnYuePQ==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.14.5", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.6.tgz", + "integrity": "sha512-yesp1ENQBiLI+iYHSJdoZKUtRpfTlL1grDIX9NRlAVppljLw/4tTyYupIB7uIYmC3stW/imAv8EqaKaS/ibmeA==", + "dependencies": { + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.7.tgz", + "integrity": "sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.14.5.tgz", + "integrity": "sha512-ZoJS2XCKPBfTmL122iP6NM9dOg+d4lc9fFk3zxc8iDjvt8Pk4+TlsHSKhIPf6X+L5ORCdBzqMZDjL/WHj7WknQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", + "@babel/plugin-proposal-optional-chaining": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.7.tgz", + "integrity": "sha512-RK8Wj7lXLY3bqei69/cc25gwS5puEc3dknoFPFbqfy3XxYQBQFvu4ioWpafMBAB+L9NyptQK4nMOa5Xz16og8Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.14.5", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz", + "integrity": "sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.14.5.tgz", + "integrity": "sha512-KBAH5ksEnYHCegqseI5N9skTdxgJdmDoAOc0uXa+4QMYKeZD0w5IARh4FMlTNtaHhbB8v+KzMdTgxMMzsIy6Yg==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-proposal-dynamic-import": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz", + "integrity": "sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-export-namespace-from": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz", + "integrity": "sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-json-strings": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz", + "integrity": "sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz", + "integrity": "sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz", + "integrity": "sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz", + "integrity": "sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.7.tgz", + "integrity": "sha512-082hsZz+sVabfmDWo1Oct1u1AgbKbUAyVgmX4otIc7bdsRgHBXwTwb3DpDmD4Eyyx6DNiuz5UAATT655k+kL5g==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.14.7", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz", + "integrity": "sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz", + "integrity": "sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz", + "integrity": "sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-62EyfyA3WA0mZiF2e2IV9mc9Ghwxcg8YTu8BS4Wss4Y3PY725OmS9M0qLORbJwLqFtGh+jiE4wAmocK2CTUK2Q==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz", + "integrity": "sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "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" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "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" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "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" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "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" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "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" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "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" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "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" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "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" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "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" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "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" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "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" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "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" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz", + "integrity": "sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz", + "integrity": "sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz", + "integrity": "sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz", + "integrity": "sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.5.tgz", + "integrity": "sha512-LBYm4ZocNgoCqyxMLoOnwpsmQ18HWTQvql64t3GvMUzLQrNoV1BDG0lNftC8QKYERkZgCCT/7J5xWGObGAyHDw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.5.tgz", + "integrity": "sha512-J4VxKAMykM06K/64z9rwiL6xnBHgB1+FVspqvlgCdwD1KUbQNfszeKVVOMh59w3sztHYIZDgnhOC4WbdEfHFDA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-optimise-call-expression": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz", + "integrity": "sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz", + "integrity": "sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz", + "integrity": "sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz", + "integrity": "sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz", + "integrity": "sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA==", + "dev": true, + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.14.5.tgz", + "integrity": "sha512-CfmqxSUZzBl0rSjpoQSFoR9UEj3HzbGuGNL21/iFTmjb5gFggJp3ph0xR1YBhexmLoKRHzgxuFvty2xdSt6gTA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz", + "integrity": "sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz", + "integrity": "sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz", + "integrity": "sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz", + "integrity": "sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.5.tgz", + "integrity": "sha512-en8GfBtgnydoao2PS+87mKyw62k02k7kJ9ltbKe0fXTHrQmG6QZZflYuGI1VVG7sVpx4E1n7KBpNlPb8m78J+A==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-simple-access": "^7.14.5", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.14.5.tgz", + "integrity": "sha512-mNMQdvBEE5DcMQaL5LbzXFMANrQjd2W7FPzg34Y4yEz7dBgdaC+9B84dSO+/1Wba98zoDbInctCDo4JGxz1VYA==", + "dev": true, + "dependencies": { + "@babel/helper-hoist-variables": "^7.14.5", + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.5", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz", + "integrity": "sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.7.tgz", + "integrity": "sha512-DTNOTaS7TkW97xsDMrp7nycUVh6sn/eq22VaxWfEdzuEbRsiaOU0pqU7DlyUGHVsbQbSghvjKRpEl+nUCKGQSg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz", + "integrity": "sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz", + "integrity": "sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.5.tgz", + "integrity": "sha512-Tl7LWdr6HUxTmzQtzuU14SqbgrSKmaR77M0OKyq4njZLQTPfOvzblNKyNkGwOfEFCEx7KeYHQHDI0P3F02IVkA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz", + "integrity": "sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz", + "integrity": "sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg==", + "dev": true, + "dependencies": { + "regenerator-transform": "^0.14.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz", + "integrity": "sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.14.5.tgz", + "integrity": "sha512-fPMBhh1AV8ZyneiCIA+wYYUH1arzlXR1UMcApjvchDhfKxhy2r2lReJv8uHEyihi4IFIGlr1Pdx7S5fkESDQsg==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.2", + "babel-plugin-polyfill-regenerator": "^0.2.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz", + "integrity": "sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz", + "integrity": "sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz", + "integrity": "sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz", + "integrity": "sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz", + "integrity": "sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz", + "integrity": "sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz", + "integrity": "sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.14.7.tgz", + "integrity": "sha512-itOGqCKLsSUl0Y+1nSfhbuuOlTs0MJk2Iv7iSH+XT/mR8U1zRLO7NjWlYXB47yhK4J/7j+HYty/EhFZDYKa/VA==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.14.7", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-async-generator-functions": "^7.14.7", + "@babel/plugin-proposal-class-properties": "^7.14.5", + "@babel/plugin-proposal-class-static-block": "^7.14.5", + "@babel/plugin-proposal-dynamic-import": "^7.14.5", + "@babel/plugin-proposal-export-namespace-from": "^7.14.5", + "@babel/plugin-proposal-json-strings": "^7.14.5", + "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", + "@babel/plugin-proposal-numeric-separator": "^7.14.5", + "@babel/plugin-proposal-object-rest-spread": "^7.14.7", + "@babel/plugin-proposal-optional-catch-binding": "^7.14.5", + "@babel/plugin-proposal-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-private-methods": "^7.14.5", + "@babel/plugin-proposal-private-property-in-object": "^7.14.5", + "@babel/plugin-proposal-unicode-property-regex": "^7.14.5", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.14.5", + "@babel/plugin-transform-async-to-generator": "^7.14.5", + "@babel/plugin-transform-block-scoped-functions": "^7.14.5", + "@babel/plugin-transform-block-scoping": "^7.14.5", + "@babel/plugin-transform-classes": "^7.14.5", + "@babel/plugin-transform-computed-properties": "^7.14.5", + "@babel/plugin-transform-destructuring": "^7.14.7", + "@babel/plugin-transform-dotall-regex": "^7.14.5", + "@babel/plugin-transform-duplicate-keys": "^7.14.5", + "@babel/plugin-transform-exponentiation-operator": "^7.14.5", + "@babel/plugin-transform-for-of": "^7.14.5", + "@babel/plugin-transform-function-name": "^7.14.5", + "@babel/plugin-transform-literals": "^7.14.5", + "@babel/plugin-transform-member-expression-literals": "^7.14.5", + "@babel/plugin-transform-modules-amd": "^7.14.5", + "@babel/plugin-transform-modules-commonjs": "^7.14.5", + "@babel/plugin-transform-modules-systemjs": "^7.14.5", + "@babel/plugin-transform-modules-umd": "^7.14.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.7", + "@babel/plugin-transform-new-target": "^7.14.5", + "@babel/plugin-transform-object-super": "^7.14.5", + "@babel/plugin-transform-parameters": "^7.14.5", + "@babel/plugin-transform-property-literals": "^7.14.5", + "@babel/plugin-transform-regenerator": "^7.14.5", + "@babel/plugin-transform-reserved-words": "^7.14.5", + "@babel/plugin-transform-shorthand-properties": "^7.14.5", + "@babel/plugin-transform-spread": "^7.14.6", + "@babel/plugin-transform-sticky-regex": "^7.14.5", + "@babel/plugin-transform-template-literals": "^7.14.5", + "@babel/plugin-transform-typeof-symbol": "^7.14.5", + "@babel/plugin-transform-unicode-escapes": "^7.14.5", + "@babel/plugin-transform-unicode-regex": "^7.14.5", + "@babel/preset-modules": "^0.1.4", + "@babel/types": "^7.14.5", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.2", + "babel-plugin-polyfill-regenerator": "^0.2.2", + "core-js-compat": "^3.15.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", + "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.6.tgz", + "integrity": "sha512-/PCB2uJ7oM44tz8YhC4Z/6PeOKXp4K588f+5M3clr1M4zbqztlo0XEfJ2LEzj/FgwfgGcIdl8n7YYjTCI0BYwg==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", + "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", + "dependencies": { + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.7.tgz", + "integrity": "sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ==", + "dependencies": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.14.5", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-hoist-variables": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/parser": "^7.14.7", + "@babel/types": "^7.14.5", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", + "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.5", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "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==", + "dev": true + }, + "node_modules/@chevrotain/types": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-9.0.2.tgz", + "integrity": "sha512-lo1dQPX7DQffJb26eaYLEy4/jUTFmsGKa43mDvMNAHwItEgUQHUkTZR0iAkHG0aJv8ejM/KqYpRVSNetrOK8qw==", + "dev": true + }, + "node_modules/@chevrotain/utils": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-9.0.2.tgz", + "integrity": "sha512-iTju1VpbGruWagXS/XswuqeimOCRNeDvrXLlWHYsHp1qTU8sJfAfLiX5vs7DNxB1px6N8VWVI0SD8vMUksNBYw==", + "dev": true + }, + "node_modules/@csstools/convert-colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz", + "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/@dabh/diagnostics": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.2.tgz", + "integrity": "sha512-+A1YivoVDNNVCdfozHSR8v/jyuuLTMXwjWuxPFlFlUapXoGc+Gj9mDlTDDfrwl7rXCl2tNZ0kE8sIBO6YOn96Q==", + "dev": true, + "dependencies": { + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.3.tgz", + "integrity": "sha512-Fxt+AfXgjMoin2maPIYzFZnQjAXjAL0PHscM5pRTtatFqB+vZxAM9tLp2Optnuw3QOQC40jTNeGYFOMvyf7v9g==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.2.tgz", + "integrity": "sha512-8nmGq/4ycLpIwzvhI4tNDmQztZ8sp+hI7cyG8i1nQDhkAbRzHpXPidRAHlNvCZQpJTKw5ItIpMw9RSToGF00mg==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.9.0.tgz", + "integrity": "sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@fortawesome/angular-fontawesome": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@fortawesome/angular-fontawesome/-/angular-fontawesome-0.9.0.tgz", + "integrity": "sha512-pJNJqxRTJChkUtywbqRuJRpmK/WNwqFqeN/GMmJmy3gHeCnWQ4SG0BwPJqaWqhi4gqII5dADijGts6wqeusxeQ==", + "dependencies": { + "tslib": "^2.2.0" + }, + "peerDependencies": { + "@angular/core": "^12.0.0", + "@fortawesome/fontawesome-svg-core": "^1.2.27" + } + }, + "node_modules/@fortawesome/fontawesome-common-types": { + "version": "0.2.35", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.35.tgz", + "integrity": "sha512-IHUfxSEDS9dDGqYwIW7wTN6tn/O8E0n5PcAHz9cAaBoZw6UpG20IG/YM3NNLaGPwPqgjBAFjIURzqoQs3rrtuw==", + "hasInstallScript": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/fontawesome-svg-core": { + "version": "1.2.35", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.35.tgz", + "integrity": "sha512-uLEXifXIL7hnh2sNZQrIJWNol7cTVIzwI+4qcBIq9QWaZqUblm0IDrtSqbNg+3SQf8SMGHkiSigD++rHmCHjBg==", + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "^0.2.35" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-solid-svg-icons": { + "version": "5.15.3", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.3.tgz", + "integrity": "sha512-XPeeu1IlGYqz4VWGRAT5ukNMd4VHUEEJ7ysZ7pSSgaEtNvSo+FLurybGJVmiqkQdK50OkSja2bfZXOeyMGRD8Q==", + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "^0.2.35" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@hapi/hoek": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.2.0.tgz", + "integrity": "sha512-sqKVVVOe5ivCaXDWivIJYVSaEgdQK9ul7a4Kity5Iw7u9+wBAPbX1RMSnLLmp7O4Vzj0WOWwMAJsTL00xwaNug==", + "dev": true + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "dev": true, + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "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", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/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, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "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" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "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" + } + }, + "node_modules/@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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.0.6.tgz", + "integrity": "sha512-fMlIBocSHPZ3JxgWiDNW/KPj6s+YRd0hicb33IrmelCcjXo/pXPwvuiKFmZz+XuqI/1u7nbUK10zSsWL/1aegg==", + "dev": true, + "dependencies": { + "@jest/types": "^27.0.6", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.0.6", + "jest-util": "^27.0.6", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/console/node_modules/ansi-styles": { + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/console/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/console/node_modules/color-convert": { + "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" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "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==", + "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" + } + }, + "node_modules/@jest/console/node_modules/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.0.6.tgz", + "integrity": "sha512-SsYBm3yhqOn5ZLJCtccaBcvD/ccTLCeuDv8U41WJH/V1MW5eKUkeMHT9U+Pw/v1m1AIWlnIW/eM2XzQr0rEmow==", + "dev": true, + "dependencies": { + "@jest/console": "^27.0.6", + "@jest/reporters": "^27.0.6", + "@jest/test-result": "^27.0.6", + "@jest/transform": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-changed-files": "^27.0.6", + "jest-config": "^27.0.6", + "jest-haste-map": "^27.0.6", + "jest-message-util": "^27.0.6", + "jest-regex-util": "^27.0.6", + "jest-resolve": "^27.0.6", + "jest-resolve-dependencies": "^27.0.6", + "jest-runner": "^27.0.6", + "jest-runtime": "^27.0.6", + "jest-snapshot": "^27.0.6", + "jest-util": "^27.0.6", + "jest-validate": "^27.0.6", + "jest-watcher": "^27.0.6", + "micromatch": "^4.0.4", + "p-each-series": "^2.1.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/core/node_modules/ansi-styles": { + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/color-convert": { + "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" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "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==", + "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" + } + }, + "node_modules/@jest/core/node_modules/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/environment": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.0.6.tgz", + "integrity": "sha512-4XywtdhwZwCpPJ/qfAkqExRsERW+UaoSRStSHCCiQTUpoYdLukj+YJbQSFrZjhlUDRZeNiU9SFH0u7iNimdiIg==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/node": "*", + "jest-mock": "^27.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.0.6.tgz", + "integrity": "sha512-sqd+xTWtZ94l3yWDKnRTdvTeZ+A/V7SSKrxsrOKSqdyddb9CeNRF8fbhAU0D7ZJBpTTW2nbp6MftmKJDZfW2LQ==", + "dev": true, + "dependencies": { + "@jest/types": "^27.0.6", + "@sinonjs/fake-timers": "^7.0.2", + "@types/node": "*", + "jest-message-util": "^27.0.6", + "jest-mock": "^27.0.6", + "jest-util": "^27.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.0.6.tgz", + "integrity": "sha512-DdTGCP606rh9bjkdQ7VvChV18iS7q0IMJVP1piwTWyWskol4iqcVwthZmoJEf7obE1nc34OpIyoVGPeqLC+ryw==", + "dev": true, + "dependencies": { + "@jest/environment": "^27.0.6", + "@jest/types": "^27.0.6", + "expect": "^27.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.0.6.tgz", + "integrity": "sha512-TIkBt09Cb2gptji3yJXb3EE+eVltW6BjO7frO7NEfjI9vSIYoISi5R3aI3KpEDXlB1xwB+97NXIqz84qYeYsfA==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^27.0.6", + "@jest/test-result": "^27.0.6", + "@jest/transform": "^27.0.6", + "@jest/types": "^27.0.6", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.4", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.3", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^27.0.6", + "jest-resolve": "^27.0.6", + "jest-util": "^27.0.6", + "jest-worker": "^27.0.6", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^8.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/node_modules/ansi-styles": { + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/reporters/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/reporters/node_modules/color-convert": { + "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" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "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==", + "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" + } + }, + "node_modules/@jest/reporters/node_modules/jest-worker": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.0.6.tgz", + "integrity": "sha512-qupxcj/dRuA3xHPMUd40gr2EaAurFbkwzOh7wfPaeE9id7hyjURRQoqNfHifHK3XjJU6YJJUQKILGUnwGPEOCA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/@jest/reporters/node_modules/jest-worker/node_modules/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/@jest/reporters/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/reporters/node_modules/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/source-map": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.0.6.tgz", + "integrity": "sha512-Fek4mi5KQrqmlY07T23JRi0e7Z9bXTOOD86V/uS0EIW4PClvPDqZOyFlLpNJheS6QI0FNX1CgmPjtJ4EA/2M+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.4", + "source-map": "^0.6.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/source-map/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/test-result": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.0.6.tgz", + "integrity": "sha512-ja/pBOMTufjX4JLEauLxE3LQBPaI2YjGFtXexRAjt1I/MbfNlMx0sytSX3tn5hSLzQsR3Qy2rd0hc1BWojtj9w==", + "dev": true, + "dependencies": { + "@jest/console": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.0.6.tgz", + "integrity": "sha512-bISzNIApazYOlTHDum9PwW22NOyDa6VI31n6JucpjTVM0jD6JDgqEZ9+yn575nDdPF0+4csYDxNNW13NvFQGZA==", + "dev": true, + "dependencies": { + "@jest/test-result": "^27.0.6", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^27.0.6", + "jest-runtime": "^27.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.0.6.tgz", + "integrity": "sha512-rj5Dw+mtIcntAUnMlW/Vju5mr73u8yg+irnHwzgtgoeI6cCPOvUwQ0D1uQtc/APmWgvRweEb1g05pkUpxH3iCA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/types": "^27.0.6", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^27.0.6", + "jest-regex-util": "^27.0.6", + "jest-util": "^27.0.6", + "micromatch": "^4.0.4", + "pirates": "^4.0.1", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/transform/node_modules/ansi-styles": { + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/transform/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/transform/node_modules/color-convert": { + "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" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "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==", + "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" + } + }, + "node_modules/@jest/transform/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/transform/node_modules/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/types": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.0.6.tgz", + "integrity": "sha512-aSquT1qa9Pik26JK5/3rvnYb4bGtm1VFNesHKmNTwmPIgOrixvhL2ghIvFRNEpzy3gU+rUgjIF/KodbkFAl++g==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/types/node_modules/ansi-styles": { + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/types/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/types/node_modules/color-convert": { + "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" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "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==", + "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" + } + }, + "node_modules/@jest/types/node_modules/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jsdevtools/coverage-istanbul-loader": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@jsdevtools/coverage-istanbul-loader/-/coverage-istanbul-loader-3.0.5.tgz", + "integrity": "sha512-EUCPEkaRPvmHjWAAZkWMT7JDzpw7FKB00WTISaiXsbNOd5hCHg77XLA8sLYLFDo1zepYLo2w7GstN8YBqRXZfA==", + "dev": true, + "dependencies": { + "convert-source-map": "^1.7.0", + "istanbul-lib-instrument": "^4.0.3", + "loader-utils": "^2.0.0", + "merge-source-map": "^1.1.0", + "schema-utils": "^2.7.0" + } + }, + "node_modules/@ng-bootstrap/ng-bootstrap": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-9.1.3.tgz", + "integrity": "sha512-Sl4lis1F5uSPrd4WsLEMX8b3fqzeHr4rgTFhocpx/IedZPaPdGec4a91TjdqcM/fNwzoXj1AdGrcMLpFFOxmvw==", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "@angular/common": "^11.0.0", + "@angular/core": "^11.0.0", + "@angular/forms": "^11.0.0", + "@angular/localize": "^11.0.0", + "rxjs": "^6.5.5" + } + }, + "node_modules/@ngtools/webpack": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-12.1.1.tgz", + "integrity": "sha512-NOHTBEjUkawQSU6sHA7EJSi5Ixw+oVmlYi17HXAhGRY1czasLQMiKQPnigbSgMLBR9Jhez7TttqAUtx6Pey2FQ==", + "dev": true, + "dependencies": { + "enhanced-resolve": "5.8.2" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0", + "npm": "^6.11.0 || ^7.5.6", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "@angular/compiler-cli": "^12.0.0 || ^12.1.0-next", + "typescript": "~4.2.3 || ~4.3.2", + "webpack": "^5.30.0" + } + }, + "node_modules/@ngx-translate/core": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@ngx-translate/core/-/core-13.0.0.tgz", + "integrity": "sha512-+tzEp8wlqEnw0Gc7jtVRAJ6RteUjXw6JJR4O65KlnxOmJrCGPI0xjV/lKRnQeU0w4i96PQs/jtpL921Wrb7PWg==", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "@angular/core": ">=10.0.0", + "rxjs": ">=6.5.3" + } + }, + "node_modules/@ngx-translate/http-loader": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@ngx-translate/http-loader/-/http-loader-6.0.0.tgz", + "integrity": "sha512-LCekn6qCbeXWlhESCxU1rAbZz33WzDG0lI7Ig0pYC1o5YxJWrkU9y3Y4tNi+jakQ7R6YhTR2D3ox6APxDtA0wA==", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "@angular/common": ">=10.0.0", + "@ngx-translate/core": ">=13.0.0", + "rxjs": ">=6.5.3" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.7.tgz", + "integrity": "sha512-BTIhocbPBSrRmHxOAJFtR18oLhxTtAFDAvL8hY1S3iU8k+E60W/YFs4jrixGzQjMpF4qPXxIQHcjVD9dz1C2QA==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/arborist": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/@npmcli/arborist/-/arborist-2.6.4.tgz", + "integrity": "sha512-A/pDQ/VZpdxaqsQS5XOWrhrPuC+ER7HLq+4ZkEmnO2yo/USFCWEsiUPYKhfY+sWXK3pgKjN7B7CEFmAnSoAt3g==", + "dev": true, + "dependencies": { + "@npmcli/installed-package-contents": "^1.0.7", + "@npmcli/map-workspaces": "^1.0.2", + "@npmcli/metavuln-calculator": "^1.1.0", + "@npmcli/move-file": "^1.1.0", + "@npmcli/name-from-folder": "^1.0.1", + "@npmcli/node-gyp": "^1.0.1", + "@npmcli/package-json": "^1.0.1", + "@npmcli/run-script": "^1.8.2", + "bin-links": "^2.2.1", + "cacache": "^15.0.3", + "common-ancestor-path": "^1.0.1", + "json-parse-even-better-errors": "^2.3.1", + "json-stringify-nice": "^1.1.4", + "mkdirp-infer-owner": "^2.0.0", + "npm-install-checks": "^4.0.0", + "npm-package-arg": "^8.1.0", + "npm-pick-manifest": "^6.1.0", + "npm-registry-fetch": "^11.0.0", + "pacote": "^11.2.6", + "parse-conflict-json": "^1.1.1", + "proc-log": "^1.0.0", + "promise-all-reject-late": "^1.0.0", + "promise-call-limit": "^1.0.1", + "read-package-json-fast": "^2.0.2", + "readdir-scoped-modules": "^1.1.0", + "semver": "^7.3.5", + "tar": "^6.1.0", + "treeverse": "^1.0.4", + "walk-up-path": "^1.0.0" + }, + "bin": { + "arborist": "bin/index.js" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@npmcli/arborist/node_modules/make-fetch-happen": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.0.3.tgz", + "integrity": "sha512-uZ/9Cf2vKqsSWZyXhZ9wHHyckBrkntgbnqV68Bfe8zZenlf7D6yuGMXvHZQ+jSnzPkjosuNP1HGasj1J4h8OlQ==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^5.0.0", + "ssri": "^8.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@npmcli/arborist/node_modules/npm-registry-fetch": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-11.0.0.tgz", + "integrity": "sha512-jmlgSxoDNuhAtxUIG6pVwwtz840i994dL14FoNVZisrmZW5kWd63IUTNv1m/hyRSGSqWjCUp/YZlS1BJyNp9XA==", + "dev": true, + "dependencies": { + "make-fetch-happen": "^9.0.1", + "minipass": "^3.1.3", + "minipass-fetch": "^1.3.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.0.0", + "npm-package-arg": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/git": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-2.1.0.tgz", + "integrity": "sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw==", + "dev": true, + "dependencies": { + "@npmcli/promise-spawn": "^1.3.2", + "lru-cache": "^6.0.0", + "mkdirp": "^1.0.4", + "npm-pick-manifest": "^6.1.1", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^2.0.2" + } + }, + "node_modules/@npmcli/installed-package-contents": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz", + "integrity": "sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==", + "dev": true, + "dependencies": { + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + }, + "bin": { + "installed-package-contents": "index.js" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@npmcli/map-workspaces": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-1.0.3.tgz", + "integrity": "sha512-SdlRlOoQw4WKD4vtb/n5gUkobEABYBEOo8fRE4L8CtBkyWDSvIrReTfKvQ/Jc/LQqDaaZ5iv1iMSQzKCUr1n1A==", + "dev": true, + "dependencies": { + "@npmcli/name-from-folder": "^1.0.1", + "glob": "^7.1.6", + "minimatch": "^3.0.4", + "read-package-json-fast": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/metavuln-calculator": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-1.1.1.tgz", + "integrity": "sha512-9xe+ZZ1iGVaUovBVFI9h3qW+UuECUzhvZPxK9RaEA2mjU26o5D0JloGYWwLYvQELJNmBdQB6rrpuN8jni6LwzQ==", + "dev": true, + "dependencies": { + "cacache": "^15.0.5", + "pacote": "^11.1.11", + "semver": "^7.3.2" + } + }, + "node_modules/@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "dev": true, + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/name-from-folder": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-1.0.1.tgz", + "integrity": "sha512-qq3oEfcLFwNfEYOQ8HLimRGKlD8WSeGEdtUa7hmzpR8Sa7haL1KVQrvgO6wqMjhWFFVjgtrh1gIxDz+P8sjUaA==", + "dev": true + }, + "node_modules/@npmcli/node-gyp": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-1.0.2.tgz", + "integrity": "sha512-yrJUe6reVMpktcvagumoqD9r08fH1iRo01gn1u0zoCApa9lnZGEigVKUd2hzsCId4gdtkZZIVscLhNxMECKgRg==", + "dev": true + }, + "node_modules/@npmcli/package-json": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-1.0.1.tgz", + "integrity": "sha512-y6jnu76E9C23osz8gEMBayZmaZ69vFOIk8vR1FJL/wbEJ54+9aVG9rLTjQKSXfgYZEr50nw1txBBFfBZZe+bYg==", + "dev": true, + "dependencies": { + "json-parse-even-better-errors": "^2.3.1" + } + }, + "node_modules/@npmcli/promise-spawn": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz", + "integrity": "sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==", + "dev": true, + "dependencies": { + "infer-owner": "^1.0.4" + } + }, + "node_modules/@npmcli/run-script": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-1.8.5.tgz", + "integrity": "sha512-NQspusBCpTjNwNRFMtz2C5MxoxyzlbuJ4YEhxAKrIonTiirKDtatsZictx9RgamQIx6+QuHMNmPl0wQdoESs9A==", + "dev": true, + "dependencies": { + "@npmcli/node-gyp": "^1.0.2", + "@npmcli/promise-spawn": "^1.3.2", + "infer-owner": "^1.0.4", + "node-gyp": "^7.1.0", + "read-package-json-fast": "^2.0.1" + } + }, + "node_modules/@octokit/auth-token": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.4.5.tgz", + "integrity": "sha512-BpGYsPgJt05M7/L/5FoE1PiAbdxXFZkX/3kDYcsvd1v6UhlnE5e96dTDr0ezX/EFwciQxf3cNV0loipsURU+WA==", + "dev": true, + "dependencies": { + "@octokit/types": "^6.0.3" + } + }, + "node_modules/@octokit/core": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.5.1.tgz", + "integrity": "sha512-omncwpLVxMP+GLpLPgeGJBF6IWJFjXDS5flY5VbppePYX9XehevbDykRH9PdCdvqt9TS5AOTiDide7h0qrkHjw==", + "dev": true, + "dependencies": { + "@octokit/auth-token": "^2.4.4", + "@octokit/graphql": "^4.5.8", + "@octokit/request": "^5.6.0", + "@octokit/request-error": "^2.0.5", + "@octokit/types": "^6.0.3", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" + } + }, + "node_modules/@octokit/endpoint": { + "version": "6.0.12", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz", + "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==", + "dev": true, + "dependencies": { + "@octokit/types": "^6.0.3", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" + } + }, + "node_modules/@octokit/endpoint/node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@octokit/graphql": { + "version": "4.6.4", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.6.4.tgz", + "integrity": "sha512-SWTdXsVheRmlotWNjKzPOb6Js6tjSqA2a8z9+glDJng0Aqjzti8MEWOtuT8ZSu6wHnci7LZNuarE87+WJBG4vg==", + "dev": true, + "dependencies": { + "@octokit/request": "^5.6.0", + "@octokit/types": "^6.0.3", + "universal-user-agent": "^6.0.0" + } + }, + "node_modules/@octokit/openapi-types": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-8.2.0.tgz", + "integrity": "sha512-113BfIPwDYBAUA5bDSd4q/DzRDSZlUanupjLHeRAtb3Sw99XJwiP8KHGsGoOwPtzUaszVscf3wbfaA3VCR3uHA==", + "dev": true + }, + "node_modules/@octokit/plugin-paginate-rest": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.14.0.tgz", + "integrity": "sha512-S2uEu2uHeI7Vf+Lvj8tv3O5/5TCAa8GHS0dUQN7gdM7vKA6ZHAbR6HkAVm5yMb1mbedLEbxOuQ+Fa0SQ7tCDLA==", + "dev": true, + "dependencies": { + "@octokit/types": "^6.18.0" + }, + "peerDependencies": { + "@octokit/core": ">=2" + } + }, + "node_modules/@octokit/plugin-request-log": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", + "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", + "dev": true, + "peerDependencies": { + "@octokit/core": ">=3" + } + }, + "node_modules/@octokit/plugin-rest-endpoint-methods": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.3.7.tgz", + "integrity": "sha512-LAgTLOsJ86ig2wYSpcSx+UWt7aQYYsEZ/Tf/pksAVQWKNcGuTVCDl9OUiPhQ7DZelNozYVWTO9Iyjd/soe4tug==", + "dev": true, + "dependencies": { + "@octokit/types": "^6.17.4", + "deprecation": "^2.3.1" + }, + "peerDependencies": { + "@octokit/core": ">=3" + } + }, + "node_modules/@octokit/request": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.0.tgz", + "integrity": "sha512-4cPp/N+NqmaGQwbh3vUsYqokQIzt7VjsgTYVXiwpUP2pxd5YiZB2XuTedbb0SPtv9XS7nzAKjAuQxmY8/aZkiA==", + "dev": true, + "dependencies": { + "@octokit/endpoint": "^6.0.1", + "@octokit/request-error": "^2.1.0", + "@octokit/types": "^6.16.1", + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.1", + "universal-user-agent": "^6.0.0" + } + }, + "node_modules/@octokit/request-error": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz", + "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==", + "dev": true, + "dependencies": { + "@octokit/types": "^6.0.3", + "deprecation": "^2.0.0", + "once": "^1.4.0" + } + }, + "node_modules/@octokit/request/node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@octokit/rest": { + "version": "18.6.6", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.6.6.tgz", + "integrity": "sha512-kCLvz8MSh+KToXySdqUp80caBom1ZQmsX3gbT3osfbJy6fD86QObUjzAOD3D3Awz3X7ng24+lB+imvSr5EnM7g==", + "dev": true, + "dependencies": { + "@octokit/core": "^3.5.0", + "@octokit/plugin-paginate-rest": "^2.6.2", + "@octokit/plugin-request-log": "^1.0.2", + "@octokit/plugin-rest-endpoint-methods": "5.3.7" + } + }, + "node_modules/@octokit/types": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.18.0.tgz", + "integrity": "sha512-H2xk9vlPWrG1oRzWkOCI/lcYUzskmnrF+suUKaCz+XylmmjyZWl0l+RIuuWX8EGW+uX15kBTRNKE/jpSmPA0IA==", + "dev": true, + "dependencies": { + "@octokit/openapi-types": "^8.2.0" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.15", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.15.tgz", + "integrity": "sha512-15spi3V28QdevleWBNXE4pIls3nFZmBbUGrW9IVPwiQczuSb9n76TCB4bsk8TSel+I1OkHEdPhu5QKMfY6rQHA==", + "dev": true + }, + "node_modules/@scarf/scarf": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.1.1.tgz", + "integrity": "sha512-VGbKDbk1RFIaSmdVb0cNjjWJoRWRI/Weo23AjRCC2nryO0iAS8pzsToJfPVPtVs74WHw4L1UTADNdIYRLkirZQ==", + "hasInstallScript": true + }, + "node_modules/@schematics/angular": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-12.0.4.tgz", + "integrity": "sha512-rC4/+c6p3S/ezDeJzAstrwzdpYgcYzHumtzVSDDM+3Kx0QBUTq/Nj6sk1e2C/fgtV5Jb2INEkTvrih+HP7I0wA==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "12.0.4", + "@angular-devkit/schematics": "12.0.4", + "jsonc-parser": "3.0.0" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0", + "npm": "^6.11.0 || ^7.5.6", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@schematics/angular/node_modules/@angular-devkit/core": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-12.0.4.tgz", + "integrity": "sha512-gtQkLXuQK7NPkurw49//MFZWoRa9aVCIbxE2uxbDAzzQengx9nLUoezS2xVdM7m/SqVK72YL+ZFfSTXzfiSdnA==", + "dev": true, + "dependencies": { + "ajv": "8.2.0", + "ajv-formats": "2.0.2", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.7", + "source-map": "0.7.3" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0", + "npm": "^6.11.0 || ^7.5.6", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@schematics/angular/node_modules/ajv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.2.0.tgz", + "integrity": "sha512-WSNGFuyWd//XO8n/m/EaOlNLtO0yL8EXT/74LqT4khdhpZjP7lkj/kT5uwRmGitKEVp/Oj7ZUHeGfPtgHhQ5CA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@schematics/angular/node_modules/ajv-formats": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.0.2.tgz", + "integrity": "sha512-Brah4Uo5/U8v76c6euTwtjVFFaVishwnJrQBYpev1JRh4vjA1F4HY3UzQez41YUCszUCXKagG8v6eVRBHV1gkw==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/@sideway/address": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.2.tgz", + "integrity": "sha512-idTz8ibqWFrPU8kMirL0CoPH/A29XOzzAzpyN3zQ4kAWnzmNfFmRaoMNN6VI8ske5M73HZyhIaW4OuSFIdM4oA==", + "dev": true, + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz", + "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==", + "dev": true + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "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" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", + "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@tootallnate/once": { + "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" + } + }, + "node_modules/@trysound/sax": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.1.1.tgz", + "integrity": "sha512-Z6DoceYb/1xSg5+e+ZlPZ9v0N16ZvZ+wYMraFue4HYrE4ttONKtsvruIRf6t9TBR0YvSOfi1hUU0fJfBLCDYow==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", + "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", + "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", + "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.1.tgz", + "integrity": "sha512-FTgBI767POY/lKNDNbIzgAX6miIDBs6NTCbdlDb8TrWovHsSvaVIZDlTqym29C6UqhzwcJx4CYr+AlrMywA0cA==", + "dev": true + }, + "node_modules/@types/babel__core": { + "version": "7.1.14", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.14.tgz", + "integrity": "sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", + "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", + "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.0.tgz", + "integrity": "sha512-IilJZ1hJBUZwMOVDNTdflOOLzJB/ZtljYVa7k3gEZN/jqIJIPkWHC6dvbX+DD2CwZDHB9wAKzZPzzqMIkW37/w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.3.0" + } + }, + "node_modules/@types/concat-stream": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-OU2+C7X+5Gs42JZzXoto7yOQ0A0=", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "7.2.13", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.13.tgz", + "integrity": "sha512-LKmQCWAlnVHvvXq4oasNUMTJJb2GwSyTY8+1C7OH5ILR8mPLaljv1jxL1bXW3xB3jFbQxTKxJAvI8PyjB09aBg==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.0.tgz", + "integrity": "sha512-O/ql2+rrCUe2W2rs7wMR+GqPRcgB6UiqN5RhrR5xruFlY7l9YLMn0ZkDzjoHLeiFkR8MCQZVudUuuvQ2BLC9Qw==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "0.0.49", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.49.tgz", + "integrity": "sha512-K1AFuMe8a+pXmfHTtnwBvqoEylNKVeaiKYkjmcEAdytMQVJ/i9Fu7sc13GxgXdO49gkE7Hy8SyJonUZUn+eVaw==", + "dev": true + }, + "node_modules/@types/expect": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/@types/expect/-/expect-1.20.4.tgz", + "integrity": "sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==", + "dev": true + }, + "node_modules/@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha1-yayFsqX9GENbjIXZ7LUObWyJP/g=", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "dev": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/graceful-fs": { + "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": "*" + } + }, + "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==", + "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": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "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": "*" + } + }, + "node_modules/@types/jest": { + "version": "26.0.23", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.23.tgz", + "integrity": "sha512-ZHLmWMJ9jJ9PTiT58juykZpL7KjwJywFN3Rr2pTSkyQfydf/rk22yS7W8p5DaVUMQ2BQC7oYiU3FjbTM/mYrOA==", + "dev": true, + "dependencies": { + "jest-diff": "^26.0.0", + "pretty-format": "^26.0.0" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", + "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", + "dev": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, + "node_modules/@types/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==", + "dev": true + }, + "node_modules/@types/node": { + "version": "15.12.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.2.tgz", + "integrity": "sha512-zjQ69G564OCIWIOHSXyQEEDpdpGl+G348RAKY0XXy9Z5kU9Vzv1GMNnkar/ZJ8dzXB3COzD9Mo9NtRZ4xfgUww==", + "dev": true + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", + "dev": true + }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "node_modules/@types/prettier": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.3.1.tgz", + "integrity": "sha512-NVkb4p4YjI8E3O6+1m8I+8JlMpFZwfSbPGdaw0wXuyPRTEz0SLKwBUWNSO7Maoi8tQMPC8JLZNWkrcKPI7/sLA==", + "dev": true + }, + "node_modules/@types/qs": { + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.6.tgz", + "integrity": "sha512-0/HnwIfW4ki2D8L8c9GVcG5I72s9jP5GSLVF0VIXDW00kmIpA6O33G7a8n59Tmh7Nz0WUC3rSb7PTY/sdW2JzA==", + "dev": true + }, + "node_modules/@types/sockjs-client": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@types/sockjs-client/-/sockjs-client-1.5.0.tgz", + "integrity": "sha512-r8ENXtljrt8U6knz4fWsiuUVrDk9nkBeJOePWCzUJDRS20MN/OWoZj+gbsPhWSXSXF1aUaS4iAE4xa5jCFW9Dw==", + "dev": true + }, + "node_modules/@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", + "dev": true + }, + "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==", + "dev": true + }, + "node_modules/@types/vinyl": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/vinyl/-/vinyl-2.0.5.tgz", + "integrity": "sha512-1m6uReH8R/RuLVQGvTT/4LlWq67jZEUxp+FBHt0hYv2BT7TUwFbKI0wa7JZVEU/XtlcnX1QcTuZ36es4rGj7jg==", + "dev": true, + "dependencies": { + "@types/expect": "^1.20.4", + "@types/node": "*" + } + }, + "node_modules/@types/webpack-sources": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.9.tgz", + "integrity": "sha512-bvzMnzqoK16PQIC8AYHNdW45eREJQMd6WG/msQWX5V2+vZmODCOPb4TJcbgRljTZZTwTM4wUMcsI8FftNA7new==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.6.1" + } + }, + "node_modules/@types/webpack-sources/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@types/yargs": { + "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": "*" + } + }, + "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==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.27.0.tgz", + "integrity": "sha512-DsLqxeUfLVNp3AO7PC3JyaddmEHTtI9qTSAs+RB6ja27QvIM0TA8Cizn1qcS6vOu+WDLFJzkwkgweiyFhssDdQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/experimental-utils": "4.27.0", + "@typescript-eslint/scope-manager": "4.27.0", + "debug": "^4.3.1", + "functional-red-black-tree": "^1.0.1", + "lodash": "^4.17.21", + "regexpp": "^3.1.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^4.0.0", + "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/experimental-utils": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.27.0.tgz", + "integrity": "sha512-n5NlbnmzT2MXlyT+Y0Jf0gsmAQzCnQSWXKy4RGSXVStjDvS5we9IWbh7qRVKdGcxT0WYlgcCYUK/HRg7xFhvjQ==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.7", + "@typescript-eslint/scope-manager": "4.27.0", + "@typescript-eslint/types": "4.27.0", + "@typescript-eslint/typescript-estree": "4.27.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.27.0.tgz", + "integrity": "sha512-I4ps3SCPFCKclRcvnsVA/7sWzh7naaM/b4pBO2hVxnM3wrU51Lveybdw5WoIktU/V4KfXrTt94V9b065b/0+wA==", + "dev": true, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.27.0.tgz", + "integrity": "sha512-KH03GUsUj41sRLLEy2JHstnezgpS5VNhrJouRdmh6yNdQ+yl8w5LrSwBkExM+jWwCJa7Ct2c8yl8NdtNRyQO6g==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.27.0", + "@typescript-eslint/visitor-keys": "4.27.0", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/@typescript-eslint/experimental-utils": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.23.0.tgz", + "integrity": "sha512-WAFNiTDnQfrF3Z2fQ05nmCgPsO5o790vOhmWKXbbYQTO9erE1/YsFot5/LnOUizLzU2eeuz6+U/81KV5/hFTGA==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/scope-manager": "4.23.0", + "@typescript-eslint/types": "4.23.0", + "@typescript-eslint/typescript-estree": "4.23.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + } + }, + "node_modules/@typescript-eslint/experimental-utils/node_modules/@typescript-eslint/scope-manager": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.23.0.tgz", + "integrity": "sha512-ZZ21PCFxPhI3n0wuqEJK9omkw51wi2bmeKJvlRZPH5YFkcawKOuRMQMnI8mH6Vo0/DoHSeZJnHiIx84LmVQY+w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.23.0", + "@typescript-eslint/visitor-keys": "4.23.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/experimental-utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.23.0.tgz", + "integrity": "sha512-5PNe5cmX9pSifit0H+nPoQBXdbNzi5tOEec+3riK+ku4e3er37pKxMKDH5Ct5Y4fhWxcD4spnlYjxi9vXbSpwg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.23.0", + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.27.0.tgz", + "integrity": "sha512-XpbxL+M+gClmJcJ5kHnUpBGmlGdgNvy6cehgR6ufyxkEJMGP25tZKCaKyC0W/JVpuhU3VU1RBn7SYUPKSMqQvQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "4.27.0", + "@typescript-eslint/types": "4.27.0", + "@typescript-eslint/typescript-estree": "4.27.0", + "debug": "^4.3.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.27.0.tgz", + "integrity": "sha512-I4ps3SCPFCKclRcvnsVA/7sWzh7naaM/b4pBO2hVxnM3wrU51Lveybdw5WoIktU/V4KfXrTt94V9b065b/0+wA==", + "dev": true, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.27.0.tgz", + "integrity": "sha512-KH03GUsUj41sRLLEy2JHstnezgpS5VNhrJouRdmh6yNdQ+yl8w5LrSwBkExM+jWwCJa7Ct2c8yl8NdtNRyQO6g==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.27.0", + "@typescript-eslint/visitor-keys": "4.27.0", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.27.0.tgz", + "integrity": "sha512-DY73jK6SEH6UDdzc6maF19AHQJBFVRf6fgAXHPXCGEmpqD4vYgPEzqpFz1lf/daSbOcMpPPj9tyXXDPW2XReAw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.27.0", + "@typescript-eslint/visitor-keys": "4.27.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/scope-manager/node_modules/@typescript-eslint/types": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.27.0.tgz", + "integrity": "sha512-I4ps3SCPFCKclRcvnsVA/7sWzh7naaM/b4pBO2hVxnM3wrU51Lveybdw5WoIktU/V4KfXrTt94V9b065b/0+wA==", + "dev": true, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.23.0.tgz", + "integrity": "sha512-oqkNWyG2SLS7uTWLZf6Sr7Dm02gA5yxiz1RP87tvsmDsguVATdpVguHr4HoGOcFOpCvx9vtCSCyQUGfzq28YCw==", + "dev": true, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.23.0.tgz", + "integrity": "sha512-5Sty6zPEVZF5fbvrZczfmLCOcby3sfrSPu30qKoY1U3mca5/jvU5cwsPb/CO6Q3ByRjixTMIVsDkqwIxCf/dMw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.23.0", + "@typescript-eslint/visitor-keys": "4.23.0", + "debug": "^4.1.1", + "globby": "^11.0.1", + "is-glob": "^4.0.1", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/visitor-keys": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.23.0.tgz", + "integrity": "sha512-5PNe5cmX9pSifit0H+nPoQBXdbNzi5tOEec+3riK+ku4e3er37pKxMKDH5Ct5Y4fhWxcD4spnlYjxi9vXbSpwg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.23.0", + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.27.0.tgz", + "integrity": "sha512-es0GRYNZp0ieckZ938cEANfEhsfHrzuLrePukLKtY3/KPXcq1Xd555Mno9/GOgXhKzn0QfkDLVgqWO3dGY80bg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.27.0", + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/@typescript-eslint/types": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.27.0.tgz", + "integrity": "sha512-I4ps3SCPFCKclRcvnsVA/7sWzh7naaM/b4pBO2hVxnM3wrU51Lveybdw5WoIktU/V4KfXrTt94V9b065b/0+wA==", + "dev": true, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.0.tgz", + "integrity": "sha512-kX2W49LWsbthrmIRMbQZuQDhGtjyqXfEmmHyEi4XWnSZtPmxY0+3anPIzsnRb45VH/J55zlOfWvZuY47aJZTJg==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.0", + "@webassemblyjs/helper-wasm-bytecode": "1.11.0" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.0.tgz", + "integrity": "sha512-Q/aVYs/VnPDVYvsCBL/gSgwmfjeCb4LW8+TMrO3cSzJImgv8lxxEPM2JA5jMrivE7LSz3V+PFqtMbls3m1exDA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.0.tgz", + "integrity": "sha512-baT/va95eXiXb2QflSx95QGT5ClzWpGaa8L7JnJbgzoYeaA27FCvuBXU758l+KXWRndEmUXjP0Q5fibhavIn8w==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.0.tgz", + "integrity": "sha512-u9HPBEl4DS+vA8qLQdEQ6N/eJQ7gT7aNvMIo8AAWvAl/xMrcOSiI2M0MAnMCy3jIFke7bEee/JwdX1nUpCtdyA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.0.tgz", + "integrity": "sha512-DhRQKelIj01s5IgdsOJMKLppI+4zpmcMQ3XboFPLwCpSNH6Hqo1ritgHgD0nqHeSYqofA6aBN/NmXuGjM1jEfQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.0", + "@webassemblyjs/helper-api-error": "1.11.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.0.tgz", + "integrity": "sha512-MbmhvxXExm542tWREgSFnOVo07fDpsBJg3sIl6fSp9xuu75eGz5lz31q7wTLffwL3Za7XNRCMZy210+tnsUSEA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.0.tgz", + "integrity": "sha512-3Eb88hcbfY/FCukrg6i3EH8H2UsD7x8Vy47iVJrP967A9JGqgBVL9aH71SETPx1JrGsOUVLo0c7vMCN22ytJew==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.0", + "@webassemblyjs/helper-buffer": "1.11.0", + "@webassemblyjs/helper-wasm-bytecode": "1.11.0", + "@webassemblyjs/wasm-gen": "1.11.0" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.0.tgz", + "integrity": "sha512-KXzOqpcYQwAfeQ6WbF6HXo+0udBNmw0iXDmEK5sFlmQdmND+tr773Ti8/5T/M6Tl/413ArSJErATd8In3B+WBA==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.0.tgz", + "integrity": "sha512-aqbsHa1mSQAbeeNcl38un6qVY++hh8OpCOzxhixSYgbRfNWcxJNJQwe2rezK9XEcssJbbWIkblaJRwGMS9zp+g==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.0.tgz", + "integrity": "sha512-A/lclGxH6SpSLSyFowMzO/+aDEPU4hvEiooCMXQPcQFPPJaYcPQNKGOCLUySJsYJ4trbpr+Fs08n4jelkVTGVw==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.0.tgz", + "integrity": "sha512-JHQ0damXy0G6J9ucyKVXO2j08JVJ2ntkdJlq1UTiUrIgfGMmA7Ik5VdC/L8hBK46kVJgujkBIoMtT8yVr+yVOQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.0", + "@webassemblyjs/helper-buffer": "1.11.0", + "@webassemblyjs/helper-wasm-bytecode": "1.11.0", + "@webassemblyjs/helper-wasm-section": "1.11.0", + "@webassemblyjs/wasm-gen": "1.11.0", + "@webassemblyjs/wasm-opt": "1.11.0", + "@webassemblyjs/wasm-parser": "1.11.0", + "@webassemblyjs/wast-printer": "1.11.0" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.0.tgz", + "integrity": "sha512-BEUv1aj0WptCZ9kIS30th5ILASUnAPEvE3tVMTrItnZRT9tXCLW2LEXT8ezLw59rqPP9klh9LPmpU+WmRQmCPQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.0", + "@webassemblyjs/helper-wasm-bytecode": "1.11.0", + "@webassemblyjs/ieee754": "1.11.0", + "@webassemblyjs/leb128": "1.11.0", + "@webassemblyjs/utf8": "1.11.0" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.0.tgz", + "integrity": "sha512-tHUSP5F4ywyh3hZ0+fDQuWxKx3mJiPeFufg+9gwTpYp324mPCQgnuVKwzLTZVqj0duRDovnPaZqDwoyhIO8kYg==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.0", + "@webassemblyjs/helper-buffer": "1.11.0", + "@webassemblyjs/wasm-gen": "1.11.0", + "@webassemblyjs/wasm-parser": "1.11.0" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.0.tgz", + "integrity": "sha512-6L285Sgu9gphrcpDXINvm0M9BskznnzJTE7gYkjDbxET28shDqp27wpruyx3C2S/dvEwiigBwLA1cz7lNUi0kw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.0", + "@webassemblyjs/helper-api-error": "1.11.0", + "@webassemblyjs/helper-wasm-bytecode": "1.11.0", + "@webassemblyjs/ieee754": "1.11.0", + "@webassemblyjs/leb128": "1.11.0", + "@webassemblyjs/utf8": "1.11.0" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.0.tgz", + "integrity": "sha512-Fg5OX46pRdTgB7rKIUojkh9vXaVN6sGYCnEiJN1GYkb0RPwShZXp6KTDqmoMdQPKhcroOXh3fEzmkWmCYaKYhQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, + "node_modules/abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "dev": true + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "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" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/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, + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/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==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/adjust-sourcemap-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", + "dev": true, + "dependencies": { + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", + "dev": true + }, + "node_modules/agent-base": { + "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" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agentkeepalive": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.1.4.tgz", + "integrity": "sha512-+V/rGa3EuU74H6wR04plBb7Ks10FbtUQgRj/FQOG7uUIEuaINI+AiqJR1k6t3SVNs7o7ZjIdus6706qqzVq8jQ==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.0.tgz", + "integrity": "sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true, + "peerDependencies": { + "ajv": ">=5.0.0" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.0.tgz", + "integrity": "sha512-USH2jBb+C/hIpwD2iRjp0pe0k+MvzG0mlSn/FIdCgQhUb9ALPRjt2KIQdfZDS9r0ZIeUAg7gOu9KL0PFqGqr5Q==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", + "dev": true + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/anymatch": { + "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" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "node_modules/are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "dev": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "node_modules/are-we-there-yet/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/are-we-there-yet/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/argparse": { + "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" + } + }, + "node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-differ": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", + "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arraybuffer.slice": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", + "dev": true + }, + "node_modules/arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "dev": true + }, + "node_modules/asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "node_modules/async-each-series": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-0.1.1.tgz", + "integrity": "sha1-dhfBkXQB/Yykooqtzj266Yr+tDI=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true, + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/atomically": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/atomically/-/atomically-1.7.0.tgz", + "integrity": "sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==", + "dev": true, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/autoprefixer": { + "version": "9.8.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz", + "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==", + "dev": true, + "dependencies": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", + "colorette": "^1.2.1", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + }, + "node_modules/autoprefixer/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/autoprefixer/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/autoprefixer/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/aws-sdk": { + "version": "2.927.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.927.0.tgz", + "integrity": "sha512-S1dbpq26bQNYBQPHAsZBt0/L/e0FAWFdjjQoU3zdaVIXa08eA9d/oRI3kEs568ErJgBjwWU1CUUlr1byBxKjUQ==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "buffer": "4.9.2", + "events": "1.1.1", + "ieee754": "1.1.13", + "jmespath": "0.15.0", + "querystring": "0.2.0", + "sax": "1.2.1", + "url": "0.10.3", + "uuid": "3.3.2", + "xml2js": "0.4.19" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/aws-sdk/node_modules/uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true + }, + "node_modules/axios": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", + "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", + "dev": true, + "dependencies": { + "follow-redirects": "^1.10.0" + } + }, + "node_modules/babel-jest": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.0.6.tgz", + "integrity": "sha512-iTJyYLNc4wRofASmofpOc5NK9QunwMk+TLFgGXsTFS8uEqmd8wdI7sga0FPe2oVH3b5Agt/EAK1QjPEuKL8VfA==", + "dev": true, + "dependencies": { + "@jest/transform": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^27.0.6", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-jest/node_modules/ansi-styles": { + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/babel-jest/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/babel-jest/node_modules/color-convert": { + "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" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "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==", + "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" + } + }, + "node_modules/babel-jest/node_modules/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-loader": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz", + "integrity": "sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==", + "dev": true, + "dependencies": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^1.4.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "engines": { + "node": ">= 8.9" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "webpack": ">=2" + } + }, + "node_modules/babel-loader/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/babel-loader/node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", + "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^4.0.0", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.0.6.tgz", + "integrity": "sha512-CewFeM9Vv2gM7Yr9n5eyyLVPRSiBnk6lKZRjgwYnGKSl9M14TMn2vkN02wTF04OGuSDLEzlWiMzvjXuW9mB6Gw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz", + "integrity": "sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.2.2", + "semver": "^6.1.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.3.tgz", + "integrity": "sha512-rCOFzEIJpJEAU14XCcV/erIf/wZQMmMT5l5vXOpL5uoznyOGfDIjPj6FVytMvtzaKSTSVKouOCTPJ5OMUZH30g==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.2.2", + "core-js-compat": "^3.14.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz", + "integrity": "sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.2.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.0.6.tgz", + "integrity": "sha512-WObA0/Biw2LrVVwZkF/2GqbOdzhKD6Fkdwhoy9ASIrOWr/zodcSpQh72JOkEn6NWyjmnPDjNSqaGN4KnpKzhXw==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^27.0.6", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", + "dev": true + }, + "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==" + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base64-arraybuffer": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", + "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "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/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "dev": true, + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/before-after-hook": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.2.tgz", + "integrity": "sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ==", + "dev": true + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/bin-links": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/bin-links/-/bin-links-2.2.1.tgz", + "integrity": "sha512-wFzVTqavpgCCYAh8SVBdnZdiQMxTkGR+T3b14CNpBXIBe2neJWaMGAZ55XWWHELJJ89dscuq0VCBqcVaIOgCMg==", + "dev": true, + "dependencies": { + "cmd-shim": "^4.0.1", + "mkdirp": "^1.0.3", + "npm-normalize-package-bin": "^1.0.0", + "read-cmd-shim": "^2.0.0", + "rimraf": "^3.0.0", + "write-file-atomic": "^3.0.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/binaryextensions": { + "version": "4.15.0", + "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-4.15.0.tgz", + "integrity": "sha512-MkUl3szxXolQ2scI1PM14WOT951KnaTNJ0eMKg7WzOI4kvSxyNo/Cygx4LOBNhwyINhAuSQpJW1rYD9aBSxGaw==", + "dev": true, + "engines": { + "node": ">=0.8" + }, + "funding": { + "url": "https://bevry.me/fund" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "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/blob": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", + "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", + "dev": true + }, + "node_modules/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "dependencies": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/body-parser/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/body-parser/node_modules/raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "dependencies": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "dependencies": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "node_modules/bootstrap": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.0.tgz", + "integrity": "sha512-Io55IuQY3kydzHtbGvQya3H+KorS/M9rSNyfCGCg9WZ4pyT/lCxIlpJgG1GXW/PswzC84Tr2fBYi+7+jFVQQBw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + }, + "peerDependencies": { + "jquery": "1.9.1 - 3", + "popper.js": "^1.16.1" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "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" + }, + "engines": { + "node": ">=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==", + "dev": true + }, + "node_modules/browser-sync": { + "version": "2.26.14", + "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.26.14.tgz", + "integrity": "sha512-3TtpsheGolJT6UFtM2CZWEcGJmI4ZEvoCKiKE2bvcDnPxRkhQT4nIGVtfiyPcoHKXGM0LwMOZmYJNWfiNfVXWA==", + "dev": true, + "dependencies": { + "browser-sync-client": "^2.26.14", + "browser-sync-ui": "^2.26.14", + "bs-recipes": "1.3.4", + "bs-snippet-injector": "^2.0.1", + "chokidar": "^3.5.1", + "connect": "3.6.6", + "connect-history-api-fallback": "^1", + "dev-ip": "^1.0.1", + "easy-extender": "^2.3.4", + "eazy-logger": "3.1.0", + "etag": "^1.8.1", + "fresh": "^0.5.2", + "fs-extra": "3.0.1", + "http-proxy": "^1.18.1", + "immutable": "^3", + "localtunnel": "^2.0.1", + "micromatch": "^4.0.2", + "opn": "5.3.0", + "portscanner": "2.1.1", + "qs": "6.2.3", + "raw-body": "^2.3.2", + "resp-modifier": "6.0.2", + "rx": "4.1.0", + "send": "0.16.2", + "serve-index": "1.9.1", + "serve-static": "1.13.2", + "server-destroy": "1.0.1", + "socket.io": "2.4.0", + "ua-parser-js": "^0.7.18", + "yargs": "^15.4.1" + }, + "bin": { + "browser-sync": "dist/bin.js" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/browser-sync-client": { + "version": "2.27.4", + "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.27.4.tgz", + "integrity": "sha512-l0krAGZnpLaD+tUYdM25WeS4FP73ZoPeaxlVzOvmtL9uKSlvpmywsnDwa3PJzc3ubmDPAcD74ifJjl6MmVksXw==", + "dev": true, + "dependencies": { + "etag": "1.8.1", + "fresh": "0.5.2", + "mitt": "^1.1.3", + "rxjs": "^5.5.6" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/browser-sync-client/node_modules/rxjs": { + "version": "5.5.12", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", + "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", + "dev": true, + "dependencies": { + "symbol-observable": "1.0.1" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/browser-sync-client/node_modules/symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/browser-sync-ui": { + "version": "2.27.4", + "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.27.4.tgz", + "integrity": "sha512-E58Mb6ycz57Nm393oqVJj4jxuLJH3MhZnY8AV+zd9LsNVGZjrKRNNIw5JPYYguyb37ZjLjq2x4u+38mRv3Sb7g==", + "dev": true, + "dependencies": { + "async-each-series": "0.1.1", + "connect-history-api-fallback": "^1", + "immutable": "^3", + "server-destroy": "1.0.1", + "socket.io-client": "^2.4.0", + "stream-throttle": "^0.1.3" + } + }, + "node_modules/browser-sync-webpack-plugin": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/browser-sync-webpack-plugin/-/browser-sync-webpack-plugin-2.3.0.tgz", + "integrity": "sha512-MDvuRrTCtoL11dTdwMymo9CNJvYxJoW67gOO61cThfzHNX40S5WcBU+0bVQ86ll7r7aNpNgyzxF7RtnXMTDbyA==", + "dev": true, + "dependencies": { + "lodash": "^4" + }, + "peerDependencies": { + "browser-sync": "^2", + "webpack": "^1 || ^2 || ^3 || ^4 || ^5" + } + }, + "node_modules/browser-sync/node_modules/ansi-styles": { + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/browser-sync/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/browser-sync/node_modules/color-convert": { + "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" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/browser-sync/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 + }, + "node_modules/browser-sync/node_modules/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, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-sync/node_modules/locate-path": { + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-sync/node_modules/p-limit": { + "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" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/browser-sync/node_modules/p-locate": { + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-sync/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-sync/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/browser-sync/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-sync/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/browserslist": { + "version": "4.16.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", + "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "dev": true, + "dependencies": { + "caniuse-lite": "^1.0.30001219", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.723", + "escalade": "^3.1.1", + "node-releases": "^1.1.71" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bs-recipes": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/bs-recipes/-/bs-recipes-1.3.4.tgz", + "integrity": "sha1-DS1NSKcYyMBEdp/cT4lZLci2lYU=", + "dev": true + }, + "node_modules/bs-snippet-injector": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/bs-snippet-injector/-/bs-snippet-injector-2.0.1.tgz", + "integrity": "sha1-YbU5PxH1JVntEgaTEANDtu2wTdU=", + "dev": true + }, + "node_modules/bser": { + "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" + } + }, + "node_modules/buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "node_modules/buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "node_modules/builtins": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", + "dev": true + }, + "node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.2.0.tgz", + "integrity": "sha512-uKoJSHmnrqXgthDFx/IU6ED/5xd+NNGe+Bb+kLZy7Ku4P+BaiWEUflAKPZ7eAzsYGcsAGASJZsybXp+quEcHTw==", + "dev": true, + "dependencies": { + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true, + "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", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "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" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001241", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001241.tgz", + "integrity": "sha512-1uoSZ1Pq1VpH0WerIMqwptXHNNGfdl7d1cJUFs80CwQ/lVzdhTvsFZCeNFslze7AjsQnb4C85tzclPa1VShbeQ==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/canonical-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/canonical-path/-/canonical-path-1.0.0.tgz", + "integrity": "sha512-feylzsbDxi1gPZ1IjystzIQZagYYLvfKrSuygUCgf7z6x790VEzze5QEkdSV1U58RA7Hi0+v6fv4K54atOzATg==", + "dev": true + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/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==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "node_modules/chevrotain": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-9.0.2.tgz", + "integrity": "sha512-6ZjgUdGvU4j1n1b2hTjb79Vr2V+qNtmP7f8FVt79+kdAYcUj2QfYNwI8ycCVsgHD/dIeO5Vr1hckkkfliVQTfg==", + "dev": true, + "dependencies": { + "@chevrotain/types": "^9.0.2", + "@chevrotain/utils": "^9.0.2", + "regexp-to-ast": "0.5.0" + } + }, + "node_modules/chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "node_modules/circular-dependency-plugin": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-5.2.2.tgz", + "integrity": "sha512-g38K9Cm5WRwlaH6g03B9OEz/0qRizI+2I7n+Gz+L5DxXJAPAiWQvwlYNm1V1jkdpUv95bOe/ASm2vfi/G560jQ==", + "dev": true, + "engines": { + "node": ">=6.0.0" + }, + "peerDependencies": { + "webpack": ">=4.0.1" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.1.tgz", + "integrity": "sha512-jVamGdJPDeuQilKhvVn1h3knuMOZzr8QDnpk+M9aMlCaMkTDd6fBWPhiDqFvFZ07pL0liqabAiuy8SY4jGHeaw==", + "dev": true + }, + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.0.tgz", + "integrity": "sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-table": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.6.tgz", + "integrity": "sha512-ZkNZbnZjKERTY5NwC2SeMeLeifSPq/pubeRoTpdr3WchLlnZg6hEgvHkK5zL7KNFdd9PmHN8lxrENUwI3cE8vQ==", + "dev": true, + "dependencies": { + "colors": "1.0.3" + }, + "engines": { + "node": ">= 0.2.0" + } + }, + "node_modules/cli-table/node_modules/colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "node_modules/cloneable-readable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", + "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + } + }, + "node_modules/cloneable-readable/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/cloneable-readable/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/cmd-shim": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-4.1.0.tgz", + "integrity": "sha512-lb9L7EM4I/ZRVuljLPEtUJOP+xiQVknZ4ZMpMgEp4JzNldPb27HU03hi6K1/6CoIuit/Zm/LQXySErFeXxDprw==", + "dev": true, + "dependencies": { + "mkdirp-infer-owner": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/co": { + "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" + } + }, + "node_modules/code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", + "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.1", + "color-string": "^1.5.2" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/color-string": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz", + "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==", + "dev": true, + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/colord": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.1.0.tgz", + "integrity": "sha512-H5sDP9XDk2uP+x/xSGkgB9SEFc1bojdI5DMKU0jmSXQtml2GIe48dj1DcSS0e53QQAHn+JKqUXbGeGX24xWD7w==", + "dev": true + }, + "node_modules/colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", + "dev": true + }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/colorspace": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.2.tgz", + "integrity": "sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ==", + "dev": true, + "dependencies": { + "color": "3.0.x", + "text-hex": "1.0.x" + } + }, + "node_modules/combined-stream": { + "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" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/common-ancestor-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", + "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", + "dev": true + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "node_modules/compare-versions": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", + "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", + "dev": true + }, + "node_modules/component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", + "dev": true + }, + "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 + }, + "node_modules/component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", + "dev": true + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "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=" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concat-stream/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/concat-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/concurrently": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-6.2.0.tgz", + "integrity": "sha512-v9I4Y3wFoXCSY2L73yYgwA9ESrQMpRn80jMcqMgHx720Hecz2GZAvTI6bREVST6lkddNypDKRN22qhK0X8Y00g==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "date-fns": "^2.16.1", + "lodash": "^4.17.21", + "read-pkg": "^5.2.0", + "rxjs": "^6.6.3", + "spawn-command": "^0.0.2-1", + "supports-color": "^8.1.0", + "tree-kill": "^1.2.2", + "yargs": "^16.2.0" + }, + "bin": { + "concurrently": "bin/concurrently.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/concurrently/node_modules/ansi-styles": { + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/concurrently/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/concurrently/node_modules/chalk/node_modules/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/concurrently/node_modules/color-convert": { + "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" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/concurrently/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 + }, + "node_modules/concurrently/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" + } + }, + "node_modules/concurrently/node_modules/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/conf": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/conf/-/conf-10.0.1.tgz", + "integrity": "sha512-QClEoNcruwBL84QgMEPHibL3ERxWIrRKhbjJKG1VsFBadm5QpS0jsu4QjY/maxUvhyAKXeyrs+ws+lC6PajnEg==", + "dev": true, + "dependencies": { + "ajv": "^8.1.0", + "ajv-formats": "^2.0.2", + "atomically": "^1.7.0", + "debounce-fn": "^4.0.0", + "dot-prop": "^6.0.1", + "env-paths": "^2.2.1", + "json-schema-typed": "^7.0.3", + "onetime": "^5.1.2", + "pkg-up": "^3.1.0", + "semver": "^7.3.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/connect": { + "version": "3.6.6", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", + "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.0", + "parseurl": "~1.3.2", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/connect/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/connect/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, + "node_modules/content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "node_modules/copy-anything": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.3.tgz", + "integrity": "sha512-GK6QUtisv4fNS+XcI7shX0Gx9ORg7QqIznyfho79JTnX1XhLiyZHfftvGiziqzRiEi/Bjhgpi+D2o7HxJFPnDQ==", + "dev": true, + "dependencies": { + "is-what": "^3.12.0" + } + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-9.0.0.tgz", + "integrity": "sha512-k8UB2jLIb1Jip2nZbCz83T/XfhfjX6mB1yLJNYKrpYi7FQimfOoFv/0//iT6HV1K8FwUB5yUbCcnpLebJXJTug==", + "dev": true, + "dependencies": { + "fast-glob": "^3.2.5", + "glob-parent": "^6.0.0", + "globby": "^11.0.3", + "normalize-path": "^3.0.0", + "p-limit": "^3.1.0", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/copy-webpack-plugin/node_modules/glob-parent": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.0.tgz", + "integrity": "sha512-Hdd4287VEJcZXUwv1l8a+vXC1GjOQqXe+VS30w/ypihpcnu9M1n3xeYeJu5CBpeEQj2nAab2xxz28GuA3vp4Ww==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/copy-webpack-plugin/node_modules/schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/core-js": { + "version": "3.15.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.15.1.tgz", + "integrity": "sha512-h8VbZYnc9pDzueiS2610IULDkpFFPunHwIpl8yRwFahAEEdSpHlTy3h3z3rKq5h11CaUdBEeRViu9AYvbxiMeg==", + "dev": true, + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.15.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.15.2.tgz", + "integrity": "sha512-Wp+BJVvwopjI+A1EFqm2dwUmWYXrvucmtIB2LgXn/Rb+gWPKYxtmb4GKHGKG/KGF1eK9jfjzT38DITbTOCX/SQ==", + "dev": true, + "dependencies": { + "browserslist": "^4.16.6", + "semver": "7.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "node_modules/cosmiconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "dev": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/critters": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.10.tgz", + "integrity": "sha512-p5VKhP1803+f+0Jq5P03w1SbiHtpAKm+1EpJHkiPxQPq0Vu9QLZHviJ02GRrWi0dlcJqrmzMWInbwp4d22RsGw==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "css": "^3.0.0", + "parse5": "^6.0.1", + "parse5-htmlparser2-tree-adapter": "^6.0.1", + "pretty-bytes": "^5.3.0" + } + }, + "node_modules/critters/node_modules/ansi-styles": { + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/critters/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/critters/node_modules/color-convert": { + "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" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/critters/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 + }, + "node_modules/critters/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" + } + }, + "node_modules/critters/node_modules/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz", + "integrity": "sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.4", + "source-map": "^0.6.1", + "source-map-resolve": "^0.6.0" + } + }, + "node_modules/css-blank-pseudo": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz", + "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==", + "dev": true, + "dependencies": { + "postcss": "^7.0.5" + }, + "bin": { + "css-blank-pseudo": "cli.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/css-blank-pseudo/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/css-blank-pseudo/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-blank-pseudo/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/css-color-names": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-1.0.1.tgz", + "integrity": "sha512-/loXYOch1qU1biStIFsHH8SxTmOseh1IJqFvy8IujXOm1h+QjUdDhkzOrR5HG8K8mlxREj0yfi8ewCHx0eMxzA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/css-declaration-sorter": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.0.3.tgz", + "integrity": "sha512-52P95mvW1SMzuRZegvpluT6yEv0FqQusydKQPZsNN5Q7hh8EwQvN8E2nwuJ16BBvNN6LcoIZXu/Bk58DAhrrxw==", + "dev": true, + "dependencies": { + "timsort": "^0.3.0" + }, + "engines": { + "node": ">= 10" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-has-pseudo": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz", + "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==", + "dev": true, + "dependencies": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^5.0.0-rc.4" + }, + "bin": { + "css-has-pseudo": "cli.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/css-has-pseudo/node_modules/cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/css-has-pseudo/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/css-has-pseudo/node_modules/postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "dev": true, + "dependencies": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/css-has-pseudo/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-has-pseudo/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/css-loader": { + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.2.6.tgz", + "integrity": "sha512-0wyN5vXMQZu6BvjbrPdUJvkCzGEO24HC7IS7nW4llc6BBFC+zwR9CKtYGv63Puzsg10L/o12inMY5/2ByzfD6w==", + "dev": true, + "dependencies": { + "icss-utils": "^5.1.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.15", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^3.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.27.0 || ^5.0.0" + } + }, + "node_modules/css-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/css-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/css-loader/node_modules/schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/css-minimizer-webpack-plugin": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.0.1.tgz", + "integrity": "sha512-RGFIv6iZWUPO2T1vE5+5pNCSs2H2xtHYRdfZPiiNH8Of6QOn9BeFnZSoHiQMkmsxOO/JkPe4BpKfs7slFIWcTA==", + "dev": true, + "dependencies": { + "cssnano": "^5.0.0", + "jest-worker": "^27.0.2", + "p-limit": "^3.0.2", + "postcss": "^8.2.9", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "clean-css": { + "optional": true + }, + "csso": { + "optional": true + } + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-parse": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-2.0.0.tgz", + "integrity": "sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q=", + "dev": true, + "dependencies": { + "css": "^2.0.0" + } + }, + "node_modules/css-parse/node_modules/css": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + } + }, + "node_modules/css-parse/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-parse/node_modules/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/css-prefers-color-scheme": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz", + "integrity": "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==", + "dev": true, + "dependencies": { + "postcss": "^7.0.5" + }, + "bin": { + "css-prefers-color-scheme": "cli.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/css-prefers-color-scheme/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/css-prefers-color-scheme/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-prefers-color-scheme/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/css-select": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", + "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^5.0.0", + "domhandler": "^4.2.0", + "domutils": "^2.6.0", + "nth-check": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-tree/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-what": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.1.tgz", + "integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cssdb": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz", + "integrity": "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==", + "dev": true + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.0.6.tgz", + "integrity": "sha512-NiaLH/7yqGksFGsFNvSRe2IV/qmEBAeDE64dYeD8OBrgp6lE8YoMeQJMtsv5ijo6MPyhuoOvFhI94reahBRDkw==", + "dev": true, + "dependencies": { + "cosmiconfig": "^7.0.0", + "cssnano-preset-default": "^5.1.3", + "is-resolvable": "^1.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-preset-default": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.1.3.tgz", + "integrity": "sha512-qo9tX+t4yAAZ/yagVV3b+QBKeLklQbmgR3wI7mccrDcR+bEk9iHgZN1E7doX68y9ThznLya3RDmR+nc7l6/2WQ==", + "dev": true, + "dependencies": { + "css-declaration-sorter": "^6.0.3", + "cssnano-utils": "^2.0.1", + "postcss-calc": "^8.0.0", + "postcss-colormin": "^5.2.0", + "postcss-convert-values": "^5.0.1", + "postcss-discard-comments": "^5.0.1", + "postcss-discard-duplicates": "^5.0.1", + "postcss-discard-empty": "^5.0.1", + "postcss-discard-overridden": "^5.0.1", + "postcss-merge-longhand": "^5.0.2", + "postcss-merge-rules": "^5.0.2", + "postcss-minify-font-values": "^5.0.1", + "postcss-minify-gradients": "^5.0.1", + "postcss-minify-params": "^5.0.1", + "postcss-minify-selectors": "^5.1.0", + "postcss-normalize-charset": "^5.0.1", + "postcss-normalize-display-values": "^5.0.1", + "postcss-normalize-positions": "^5.0.1", + "postcss-normalize-repeat-style": "^5.0.1", + "postcss-normalize-string": "^5.0.1", + "postcss-normalize-timing-functions": "^5.0.1", + "postcss-normalize-unicode": "^5.0.1", + "postcss-normalize-url": "^5.0.2", + "postcss-normalize-whitespace": "^5.0.1", + "postcss-ordered-values": "^5.0.2", + "postcss-reduce-initial": "^5.0.1", + "postcss-reduce-transforms": "^5.0.1", + "postcss-svgo": "^5.0.2", + "postcss-unique-selectors": "^5.0.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-2.0.1.tgz", + "integrity": "sha512-i8vLRZTnEH9ubIyfdZCAdIdgnHAUeQeByEeQ2I7oTilvP9oHO6RScpeq3GsFUVqeB8uZgOQ9pw8utofNn32hhQ==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "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" + }, + "engines": { + "node": ">=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==", + "dev": true + }, + "node_modules/dargs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", + "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/data-urls": { + "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", + "whatwg-url": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/date-fns": { + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.22.1.tgz", + "integrity": "sha512-yUFPQjrxEmIsMqlHhAhmxkuH769baF21Kk+nZwZGyrMoyLA+LugaQtC0+Tqf9CBUUULWwUJt6Q5ySI3LJDDCGg==", + "dev": true, + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, + "node_modules/dateformat": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.5.1.tgz", + "integrity": "sha512-OD0TZ+B7yP7ZgpJf5K2DIbj3FZvFvxgFUuaqA/V5zTjAtAAXZ1E8bktHxmAGs4x5b7PflqA9LeQ84Og7wYtF7Q==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/dayjs": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.5.tgz", + "integrity": "sha512-BUFis41ikLz+65iH6LHQCDm4YPMj5r1YFLdupPIyM4SGcXMmtiLQ7U37i+hGS8urIuqe7I/ou3IS1jVc4nbN4g==" + }, + "node_modules/debounce-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/debounce-fn/-/debounce-fn-4.0.0.tgz", + "integrity": "sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/debuglog": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", + "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true + }, + "node_modules/decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", + "dev": true + }, + "node_modules/deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "dependencies": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "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" + } + }, + "node_modules/default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "dev": true, + "dependencies": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/default-gateway/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/default-gateway/node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/default-gateway/node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/default-gateway/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway/node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/default-gateway/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/default-gateway/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/default-gateway/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "dependencies": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/del/node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del/node_modules/globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "dependencies": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del/node_modules/globby/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del/node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/del/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/del/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/dependency-graph": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", + "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/deprecation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", + "dev": true + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "node_modules/detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "node_modules/dev-ip": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz", + "integrity": "sha1-p2o+0YVb56ASu4rBbLgPPADcKPA=", + "dev": true, + "bin": { + "dev-ip": "lib/dev-ip.js" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/dezalgo": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", + "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", + "dev": true, + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "node_modules/didyoumean": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.1.tgz", + "integrity": "sha1-6S7f2tplN9SE1zwBcv0eugxJdv8=", + "dev": true + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", + "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", + "dev": true, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "node_modules/dns-packet": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", + "dev": true, + "dependencies": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "dependencies": { + "buffer-indexof": "^1.0.0" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domexception": { + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/domexception/node_modules/webidl-conversions": { + "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" + } + }, + "node_modules/domhandler": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.0.tgz", + "integrity": "sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.7.0.tgz", + "integrity": "sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg==", + "dev": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-prop": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "dev": true, + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/drange": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/drange/-/drange-1.1.1.tgz", + "integrity": "sha512-pYxfDYpued//QpnLIm4Avk7rsNtAtQkUES2cwAYSvD/wd2pKD71gN2Ebj3e7klzXwjocvE8c5vx/1fxwpqmSxA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, + "node_modules/easy-extender": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.4.tgz", + "integrity": "sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q==", + "dev": true, + "dependencies": { + "lodash": "^4.17.10" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/eazy-logger": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eazy-logger/-/eazy-logger-3.1.0.tgz", + "integrity": "sha512-/snsn2JqBtUSSstEl4R0RKjkisGHAhvYj89i7r3ytNUKW12y178KDZwXLXIgwDqLW6E/VRMT9qfld7wvFae8bQ==", + "dev": true, + "dependencies": { + "tfunk": "^4.0.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "node_modules/ejs": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.6.tgz", + "integrity": "sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==", + "dev": true, + "dependencies": { + "jake": "^10.6.1" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.3.766", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.766.tgz", + "integrity": "sha512-u2quJ862q9reRKh/je3GXis3w38+RoXH1J9N3XjtsS6NzmUAosNsyZgUVFZPN/ZlJ3v6T0rTyZR3q/J5c6Sy5w==", + "dev": true + }, + "node_modules/emittery": { + "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" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "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==" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", + "dev": true + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/engine.io": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.5.0.tgz", + "integrity": "sha512-21HlvPUKaitDGE4GXNtQ7PLP0Sz4aWLddMPw2VTyFz1FVZqu/kZsJUO8WNpKuE/OCL7nkfRaOui2ZCJloGznGA==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "debug": "~4.1.0", + "engine.io-parser": "~2.2.0", + "ws": "~7.4.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/engine.io-client": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.5.2.tgz", + "integrity": "sha512-QEqIp+gJ/kMHeUun7f5Vv3bteRHppHH/FMBQX/esFj/fuYfjyUKWGMo3VCvIP/V8bE9KcjHmRZrhIz2Z9oNsDA==", + "dev": true, + "dependencies": { + "component-emitter": "~1.3.0", + "component-inherit": "0.0.3", + "debug": "~3.1.0", + "engine.io-parser": "~2.2.0", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.6", + "parseuri": "0.0.6", + "ws": "~7.4.2", + "xmlhttprequest-ssl": "~1.6.2", + "yeast": "0.1.2" + } + }, + "node_modules/engine.io-client/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/engine.io-client/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/engine.io-client/node_modules/ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/engine.io-parser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.1.tgz", + "integrity": "sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==", + "dev": true, + "dependencies": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.4", + "blob": "0.0.5", + "has-binary2": "~1.0.2" + } + }, + "node_modules/engine.io/node_modules/debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/engine.io/node_modules/ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/enhanced-resolve": { + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.2.tgz", + "integrity": "sha512-F27oB3WuHDzvR2DOGNTaYy0D5o0cnrv8TeI482VM4kYgQd/FT9lUQwuNsJ0oOHtBUq7eiW5ytqzp7nBFknL+GA==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/error": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/error/-/error-10.4.0.tgz", + "integrity": "sha512-YxIFEJuhgcICugOUvRx5th0UM+ActZ9sjY0QJmeVwsQdvosZ7kYzc9QqS0Da3R5iUmgU5meGIxh0xBeZpMVeLw==", + "dev": true + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-module-lexer": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.6.0.tgz", + "integrity": "sha512-f8kcHX1ArhllUtb/wVSyvygoKCznIjnxhLxy7TCvIiMdT7fL4ZDTIKaadMe6eLvOXg6Wk02UeoFgUoZ2EKZZUA==", + "dev": true + }, + "node_modules/es6-promise": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.0.5.tgz", + "integrity": "sha1-eILzCt3lskDM+n99eMVIMwlRrkI=", + "dev": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "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", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/escodegen/node_modules/levn": { + "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" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/optionator": { + "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", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/prelude-ls": { + "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" + } + }, + "node_modules/escodegen/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/escodegen/node_modules/type-check": { + "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" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eslint": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.28.0.tgz", + "integrity": "sha512-UMfH0VSjP0G4p3EWirscJEQ/cHqnT/iuH6oNZOB94nBjWbMnhGEPxsZm1eyIW0C/9jLI0Fow4W5DXLjEI7mn1g==", + "dev": true, + "dependencies": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", + "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-webpack-plugin": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-2.5.4.tgz", + "integrity": "sha512-7rYh0m76KyKSDE+B+2PUQrlNS4HJ51t3WKpkJg6vo2jFMbEPTG99cBV0Dm7LXSHucN4WGCG65wQcRiTFrj7iWw==", + "dev": true, + "dependencies": { + "@types/eslint": "^7.2.6", + "arrify": "^2.0.1", + "jest-worker": "^26.6.2", + "micromatch": "^4.0.2", + "normalize-path": "^3.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "eslint": "^7.0.0", + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/eslint-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint-webpack-plugin/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" + } + }, + "node_modules/eslint-webpack-plugin/node_modules/jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/eslint-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/eslint-webpack-plugin/node_modules/schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/eslint-webpack-plugin/node_modules/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "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" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/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 + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.9.0.tgz", + "integrity": "sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/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" + } + }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/eslint/node_modules/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "dependencies": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/esprima": { + "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" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "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" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/eventsource": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.0.tgz", + "integrity": "sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==", + "dependencies": { + "original": "^1.0.0" + }, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/execa": { + "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", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "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" + } + }, + "node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/expect": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.0.6.tgz", + "integrity": "sha512-psNLt8j2kwg42jGBDSfAlU49CEZxejN1f1PlANWDZqIhBOVU/c2Pm888FcjWJzFewhIsNWfZJeLjUjtKGiPuSw==", + "dev": true, + "dependencies": { + "@jest/types": "^27.0.6", + "ansi-styles": "^5.0.0", + "jest-get-type": "^27.0.6", + "jest-matcher-utils": "^27.0.6", + "jest-message-util": "^27.0.6", + "jest-regex-util": "^27.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/expect/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "dependencies": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "node_modules/express/node_modules/cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/express/node_modules/qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/express/node_modules/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/express/node_modules/send/node_modules/ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "node_modules/express/node_modules/serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/express/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true, + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/faker": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/faker/-/faker-5.5.3.tgz", + "integrity": "sha512-wLTv2a28wjUyWkbnX7u/ABZBkUkIF2fCd73V6P2oFqEGEktDfzWx4UxrSqtPRw0xPRAcjeAOIiJWqZm3pP4u3g==", + "dev": true + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.6.tgz", + "integrity": "sha512-GnLuqj/pvQ7pX8/L4J84nijv6sAnlwvSDpMkJi9i7nPmPxGtRPkBSStfvDW5l6nMdX9VWe+pkKWFTgD+vF2QSQ==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "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=", + "dev": true + }, + "node_modules/fast-safe-stringify": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", + "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", + "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fb-watchman": { + "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" + } + }, + "node_modules/fecha": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.1.tgz", + "integrity": "sha512-MMMQ0ludy/nBs1/o0zVOiKTpG7qMbonKUzjJgQFEuvq6INZ1OraKPRAWkBq5vlKLOUMpmNYG1JoN3oDPUQ9m3Q==", + "dev": true + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "node_modules/filelist": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.2.tgz", + "integrity": "sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ==", + "dev": true, + "dependencies": { + "minimatch": "^3.0.4" + } + }, + "node_modules/fill-range": { + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.3.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-versions": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-4.0.0.tgz", + "integrity": "sha512-wgpWy002tA+wgmO27buH/9KzyEOQnKsG/R0yrcjPT9BOFm0zRBVQbZ95nRGXWMywS8YR5knRbpohio0bcJABxQ==", + "dev": true, + "dependencies": { + "semver-regex": "^3.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-yarn-workspace-root2": { + "version": "1.2.16", + "resolved": "https://registry.npmjs.org/find-yarn-workspace-root2/-/find-yarn-workspace-root2-1.2.16.tgz", + "integrity": "sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==", + "dev": true, + "dependencies": { + "micromatch": "^4.0.2", + "pkg-dir": "^4.2.0" + } + }, + "node_modules/first-chunk-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz", + "integrity": "sha1-G97NuOCDwGZLkZRVgVd6Q6nzHXA=", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/first-chunk-stream/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/first-chunk-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.0.tgz", + "integrity": "sha512-XprP7lDrVT+kE2c2YlfiV+IfS9zxukiIOvNamPNsImNhXadSsQEbosItdL9bUQlCZXR13SvPk20BjWSWLA7m4A==", + "dev": true + }, + "node_modules/flatten": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", + "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==", + "dev": true + }, + "node_modules/fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz", + "integrity": "sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "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", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", + "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^3.0.0", + "universalify": "^0.1.0" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "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": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "node_modules/gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "dependencies": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "node_modules/gauge/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gauge/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gauge/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gauge/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/generator-jhipster": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/generator-jhipster/-/generator-jhipster-7.1.0.tgz", + "integrity": "sha512-0AgROFowVO62gn+JjTzhab5vMgbjmXRpY/5grbi/pracAq/Zw0irT9Mv6kNp7fsvrJNMZ7+U4I2BNeAJY0ldoQ==", + "dev": true, + "dependencies": { + "aws-sdk": "2.927.0", + "axios": "0.21.1", + "chalk": "4.1.1", + "chevrotain": "9.0.2", + "commander": "7.2.0", + "conf": "10.0.1", + "didyoumean": "1.2.1", + "ejs": "3.1.6", + "faker": "5.5.3", + "find-up": "5.0.0", + "glob": "7.1.7", + "gulp-filter": "7.0.0", + "insight": "0.10.3", + "js-yaml": "4.1.0", + "lodash": "4.17.21", + "mem-fs-editor": "^9.0.0", + "minimatch": "3.0.4", + "normalize-path": "3.0.0", + "ora": "5.4.1", + "os-locale": "5.0.0", + "parse-gitignore": "1.0.1", + "pluralize": "8.0.0", + "prettier": "2.3.1", + "prettier-plugin-java": "1.2.0", + "prettier-plugin-packagejson": "2.2.11", + "progress": "2.0.3", + "randexp": "0.5.3", + "semver": "7.3.5", + "shelljs": "0.8.4", + "then-request": "6.0.2", + "uuid": "8.3.2", + "winston": "3.3.3", + "yeoman-environment": "3.4.1", + "yeoman-generator": "5.3.0" + }, + "bin": { + "jhipster": "cli/jhipster.js" + }, + "engines": { + "node": ">=12.12.0", + "npm": ">=6.14.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/generator-jhipster" + } + }, + "node_modules/generator-jhipster/node_modules/ansi-styles": { + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/generator-jhipster/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/generator-jhipster/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/generator-jhipster/node_modules/color-convert": { + "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" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/generator-jhipster/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 + }, + "node_modules/generator-jhipster/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" + } + }, + "node_modules/generator-jhipster/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/generator-jhipster/node_modules/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/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==", + "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==", + "dev": true, + "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-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "dev": true + }, + "node_modules/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==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/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==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/git-hooks-list": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/git-hooks-list/-/git-hooks-list-1.0.3.tgz", + "integrity": "sha512-Y7wLWcrLUXwk2noSka166byGCvhMtDRpgHdzCno1UQv/n/Hegp++a2xBWJL1lJarnKD3SWaljD+0z1ztqxuKyQ==", + "dev": true, + "funding": { + "url": "https://github.com/fisker/git-hooks-list?sponsor=1" + } + }, + "node_modules/github-username": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/github-username/-/github-username-6.0.0.tgz", + "integrity": "sha512-7TTrRjxblSI5l6adk9zd+cV5d6i1OrJSo3Vr9xdGqFLBQo0mz5P9eIfKCDJ7eekVGGFLbce0qbPSnktXV2BjDQ==", + "dev": true, + "dependencies": { + "@octokit/rest": "^18.0.6" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby/node_modules/ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, + "node_modules/grouped-queue": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/grouped-queue/-/grouped-queue-2.0.0.tgz", + "integrity": "sha512-/PiFUa7WIsl48dUeCvhIHnwNmAAzlI/eHoJl0vu3nsFA366JleY7Ff8EVTplZu5kO0MIdZjKTTnzItL61ahbnw==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "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 + }, + "node_modules/gulp-filter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/gulp-filter/-/gulp-filter-7.0.0.tgz", + "integrity": "sha512-ZGWtJo0j1mHfP77tVuhyqem4MRA5NfNRjoVe6VAkLGeQQ/QGo2VsFwp7zfPTGDsd1rwzBmoDHhxpE6f5B3Zuaw==", + "dev": true, + "dependencies": { + "multimatch": "^5.0.0", + "plugin-error": "^1.0.1", + "streamfilter": "^3.0.0", + "to-absolute-glob": "^2.0.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + }, + "peerDependencies": { + "gulp": ">=4" + }, + "peerDependenciesMeta": { + "gulp": { + "optional": true + } + } + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "dev": true, + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dev": true, + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/har-validator/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/har-validator/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-binary2": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", + "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", + "dev": true, + "dependencies": { + "isarray": "2.0.1" + } + }, + "node_modules/has-binary2/node_modules/isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + }, + "node_modules/has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", + "dev": true + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true, + "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=", + "dev": true + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", + "dev": true + }, + "node_modules/hosted-git-info": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", + "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", + "dev": true + }, + "node_modules/hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", + "dev": true + }, + "node_modules/html-encoding-sniffer": { + "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" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/html-entities": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", + "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", + "dev": true + }, + "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==", + "dev": true + }, + "node_modules/http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "dev": true, + "dependencies": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "node_modules/http-errors": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", + "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-agent": { + "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", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dev": true, + "dependencies": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "dev": true, + "dependencies": { + "@types/node": "^10.0.3" + } + }, + "node_modules/http-response-object/node_modules/@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==", + "dev": true + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/https-proxy-agent": { + "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" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/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==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", + "dev": true, + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/husky": { + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/husky/-/husky-4.3.8.tgz", + "integrity": "sha512-LCqqsB0PzJQ/AlCgfrfzRe3e3+NvmefAdKQhRYpxS4u6clblBoDdzzvHi8fmxKRzvMxPY/1WZWzomPZww0Anow==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "chalk": "^4.0.0", + "ci-info": "^2.0.0", + "compare-versions": "^3.6.0", + "cosmiconfig": "^7.0.0", + "find-versions": "^4.0.0", + "opencollective-postinstall": "^2.0.2", + "pkg-dir": "^5.0.0", + "please-upgrade-node": "^3.2.0", + "slash": "^3.0.0", + "which-pm-runs": "^1.0.0" + }, + "bin": { + "husky-run": "bin/run.js", + "husky-upgrade": "lib/upgrader/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/husky" + } + }, + "node_modules/husky/node_modules/ansi-styles": { + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/husky/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/husky/node_modules/color-convert": { + "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" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/husky/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 + }, + "node_modules/husky/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" + } + }, + "node_modules/husky/node_modules/pkg-dir": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", + "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", + "dev": true, + "dependencies": { + "find-up": "^5.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/husky/node_modules/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/iconv-lite": { + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, + "node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-walk": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz", + "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==", + "dev": true, + "dependencies": { + "minimatch": "^3.0.4" + } + }, + "node_modules/image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "dev": true, + "optional": true, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/immutable": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", + "integrity": "sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { + "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" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true + }, + "node_modules/indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/inquirer": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.1.1.tgz", + "integrity": "sha512-hUDjc3vBkh/uk1gPfMAD/7Z188Q8cvTGl0nxwaCdwSbzFh6ZKkZh+s2ozVxbE5G9ZNRyeY0+lgbAIOUFsFf98w==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.3.0", + "run-async": "^2.4.0", + "rxjs": "^6.6.6", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/inquirer/node_modules/ansi-styles": { + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/inquirer/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/inquirer/node_modules/color-convert": { + "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" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/inquirer/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 + }, + "node_modules/inquirer/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" + } + }, + "node_modules/inquirer/node_modules/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/insight": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/insight/-/insight-0.10.3.tgz", + "integrity": "sha512-YOncxSN6Omh+1Oqxt+OJAvJVMDKw7l6IEG0wT2cTMGxjsTcroOGW4IR926QDzxg/uZHcFZ2cZbckDWdZhc2pZw==", + "dev": true, + "dependencies": { + "async": "^2.6.2", + "chalk": "^2.4.2", + "conf": "^1.4.0", + "inquirer": "^6.3.1", + "lodash.debounce": "^4.0.8", + "os-name": "^3.1.0", + "request": "^2.88.0", + "tough-cookie": "^3.0.1", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/insight/node_modules/ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/insight/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/insight/node_modules/cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "dependencies": { + "restore-cursor": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/insight/node_modules/cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", + "dev": true + }, + "node_modules/insight/node_modules/conf": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/conf/-/conf-1.4.0.tgz", + "integrity": "sha512-bzlVWS2THbMetHqXKB8ypsXN4DQ/1qopGwNJi1eYbpwesJcd86FBjFciCQX/YwAhp9bM7NVnPFqZ5LpV7gP0Dg==", + "dev": true, + "dependencies": { + "dot-prop": "^4.1.0", + "env-paths": "^1.0.0", + "make-dir": "^1.0.0", + "pkg-up": "^2.0.0", + "write-file-atomic": "^2.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/insight/node_modules/dot-prop": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz", + "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", + "dev": true, + "dependencies": { + "is-obj": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/insight/node_modules/env-paths": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-1.0.0.tgz", + "integrity": "sha1-QWgTO0K7BcOKNbGuQ5fIKYqzaeA=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/insight/node_modules/figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/insight/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/insight/node_modules/inquirer": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", + "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", + "dev": true, + "dependencies": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.12", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/insight/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/insight/node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/insight/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/insight/node_modules/make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/insight/node_modules/mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/insight/node_modules/mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "node_modules/insight/node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/insight/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/insight/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/insight/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/insight/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/insight/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/insight/node_modules/pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "dev": true, + "dependencies": { + "find-up": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/insight/node_modules/restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "dependencies": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/insight/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/insight/node_modules/string-width/node_modules/ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/insight/node_modules/string-width/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/insight/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/insight/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/insight/node_modules/write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "node_modules/internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dev": true, + "dependencies": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/invert-kv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-3.0.1.tgz", + "integrity": "sha512-CYdFeFexxhv/Bcny+Q0BfOV+ltRlJcd4BBZBYFX/O0u4npJrgZtIcjokegtiSMAvlMTJ+Koq0GBCc//3bueQxw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sindresorhus/invert-kv?sponsor=1" + } + }, + "node_modules/ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "node_modules/ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "dependencies": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-arguments": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", + "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/is-ci": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.0.tgz", + "integrity": "sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ==", + "dev": true, + "dependencies": { + "ci-info": "^3.1.1" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-ci/node_modules/ci-info": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", + "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==", + "dev": true + }, + "node_modules/is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "dev": true, + "dependencies": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, + "node_modules/is-color-stop/node_modules/css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/is-core-module": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", + "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-date-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", + "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/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==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=", + "dev": true + }, + "node_modules/is-negated-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", + "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "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" + } + }, + "node_modules/is-number-like": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", + "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", + "dev": true, + "dependencies": { + "lodash.isfinite": "^3.3.2" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "dependencies": { + "is-path-inside": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "dependencies": { + "path-is-inside": "^1.0.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true + }, + "node_modules/is-regex": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", + "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "dependencies": { + "is-unc-path": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "node_modules/is-scoped": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-scoped/-/is-scoped-2.1.0.tgz", + "integrity": "sha512-Cv4OpPTHAK9kHYzkzCrof3VJh7H/PrG2MBUMvvJebaaUMbqhm0YAtXnvh0I3Hnj2tMZWwrRROWLSgfJrKqWmlQ==", + "dev": true, + "dependencies": { + "scoped-regex": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true, + "engines": { + "node": ">=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=", + "dev": true + }, + "node_modules/is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "dependencies": { + "unc-path-regex": "^0.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "node_modules/is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", + "dev": true + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/isbinaryfile": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.8.tgz", + "integrity": "sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w==", + "dev": true, + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-report": { + "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", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/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" + } + }, + "node_modules/istanbul-lib-report/node_modules/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jake": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.2.tgz", + "integrity": "sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==", + "dev": true, + "dependencies": { + "async": "0.9.x", + "chalk": "^2.4.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jake/node_modules/async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", + "dev": true + }, + "node_modules/java-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/java-parser/-/java-parser-1.2.0.tgz", + "integrity": "sha512-2SVpsgGzB1d6mv3jT0rhDrDIe5CVdJwaSEXAbPLWdK4BiC/tyrCzeJtoJS4UwSo9qY174axcNHGcQtsEbrlMoA==", + "dev": true, + "dependencies": { + "chevrotain": "6.5.0", + "lodash": "4.17.21" + } + }, + "node_modules/java-parser/node_modules/chevrotain": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-6.5.0.tgz", + "integrity": "sha512-BwqQ/AgmKJ8jcMEjaSnfMybnKMgGTrtDKowfTP3pX4jwVy0kNjRsT/AP6h+wC3+3NC+X8X15VWBnTCQlX+wQFg==", + "dev": true, + "dependencies": { + "regexp-to-ast": "0.4.0" + } + }, + "node_modules/java-parser/node_modules/regexp-to-ast": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.4.0.tgz", + "integrity": "sha512-4qf/7IsIKfSNHQXSwial1IFmfM1Cc/whNBQqRwe0V2stPe7KmN1U0tWQiIx6JiirgSrisjE0eECdNf7Tav1Ntw==", + "dev": true + }, + "node_modules/jest": { + "version": "27.0.4", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.0.4.tgz", + "integrity": "sha512-Px1iKFooXgGSkk1H8dJxxBIrM3tsc5SIuI4kfKYK2J+4rvCvPGr/cXktxh0e9zIPQ5g09kOMNfHQEmusBUf/ZA==", + "dev": true, + "dependencies": { + "@jest/core": "^27.0.4", + "import-local": "^3.0.2", + "jest-cli": "^27.0.4" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.0.6.tgz", + "integrity": "sha512-BuL/ZDauaq5dumYh5y20sn4IISnf1P9A0TDswTxUi84ORGtVa86ApuBHqICL0vepqAnZiY6a7xeSPWv2/yy4eA==", + "dev": true, + "dependencies": { + "@jest/types": "^27.0.6", + "execa": "^5.0.0", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.0.6.tgz", + "integrity": "sha512-OJlsz6BBeX9qR+7O9lXefWoc2m9ZqcZ5Ohlzz0pTEAG4xMiZUJoacY8f4YDHxgk0oKYxj277AfOk9w6hZYvi1Q==", + "dev": true, + "dependencies": { + "@jest/environment": "^27.0.6", + "@jest/test-result": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^27.0.6", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.0.6", + "jest-matcher-utils": "^27.0.6", + "jest-message-util": "^27.0.6", + "jest-runtime": "^27.0.6", + "jest-snapshot": "^27.0.6", + "jest-util": "^27.0.6", + "pretty-format": "^27.0.6", + "slash": "^3.0.0", + "stack-utils": "^2.0.3", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus/node_modules/ansi-styles": { + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/color-convert": { + "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" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "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==", + "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" + } + }, + "node_modules/jest-circus/node_modules/pretty-format": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.6.tgz", + "integrity": "sha512-8tGD7gBIENgzqA+UBzObyWqQ5B778VIFZA/S66cclyd5YkFLYs2Js7gxDKf0MXtTc9zcS7t1xhdfcElJ3YIvkQ==", + "dev": true, + "dependencies": { + "@jest/types": "^27.0.6", + "ansi-regex": "^5.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.0.6.tgz", + "integrity": "sha512-qUUVlGb9fdKir3RDE+B10ULI+LQrz+MCflEH2UJyoUjoHHCbxDrMxSzjQAPUMsic4SncI62ofYCcAvW6+6rhhg==", + "dev": true, + "dependencies": { + "@jest/core": "^27.0.6", + "@jest/test-result": "^27.0.6", + "@jest/types": "^27.0.6", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "import-local": "^3.0.2", + "jest-config": "^27.0.6", + "jest-util": "^27.0.6", + "jest-validate": "^27.0.6", + "prompts": "^2.0.1", + "yargs": "^16.0.3" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-cli/node_modules/ansi-styles": { + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-cli/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-cli/node_modules/color-convert": { + "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" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "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==", + "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" + } + }, + "node_modules/jest-cli/node_modules/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.0.6.tgz", + "integrity": "sha512-JZRR3I1Plr2YxPBhgqRspDE2S5zprbga3swYNrvY3HfQGu7p/GjyLOqwrYad97tX3U3mzT53TPHVmozacfP/3w==", + "dev": true, + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^27.0.6", + "@jest/types": "^27.0.6", + "babel-jest": "^27.0.6", + "chalk": "^4.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "is-ci": "^3.0.0", + "jest-circus": "^27.0.6", + "jest-environment-jsdom": "^27.0.6", + "jest-environment-node": "^27.0.6", + "jest-get-type": "^27.0.6", + "jest-jasmine2": "^27.0.6", + "jest-regex-util": "^27.0.6", + "jest-resolve": "^27.0.6", + "jest-runner": "^27.0.6", + "jest-util": "^27.0.6", + "jest-validate": "^27.0.6", + "micromatch": "^4.0.4", + "pretty-format": "^27.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-config/node_modules/ansi-styles": { + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/color-convert": { + "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" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "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==", + "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" + } + }, + "node_modules/jest-config/node_modules/pretty-format": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.6.tgz", + "integrity": "sha512-8tGD7gBIENgzqA+UBzObyWqQ5B778VIFZA/S66cclyd5YkFLYs2Js7gxDKf0MXtTc9zcS7t1xhdfcElJ3YIvkQ==", + "dev": true, + "dependencies": { + "@jest/types": "^27.0.6", + "ansi-regex": "^5.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-config/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-date-mock": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/jest-date-mock/-/jest-date-mock-1.0.8.tgz", + "integrity": "sha512-0Lyp+z9xvuNmLbK+5N6FOhSiBeux05Lp5bbveFBmYo40Aggl2wwxFoIrZ+rOWC8nDNcLeBoDd2miQdEDSf3iQw==", + "dev": true + }, + "node_modules/jest-diff": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", + "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-diff/node_modules/ansi-styles": { + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/color-convert": { + "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" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-diff/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 + }, + "node_modules/jest-diff/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" + } + }, + "node_modules/jest-diff/node_modules/jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "dev": true, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-diff/node_modules/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-docblock": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.0.6.tgz", + "integrity": "sha512-Fid6dPcjwepTFraz0YxIMCi7dejjJ/KL9FBjPYhBp4Sv1Y9PdhImlKZqYU555BlN4TQKaTc+F2Av1z+anVyGkA==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-each": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.0.6.tgz", + "integrity": "sha512-m6yKcV3bkSWrUIjxkE9OC0mhBZZdhovIW5ergBYirqnkLXkyEn3oUUF/QZgyecA1cF1QFyTE8bRRl8Tfg1pfLA==", + "dev": true, + "dependencies": { + "@jest/types": "^27.0.6", + "chalk": "^4.0.0", + "jest-get-type": "^27.0.6", + "jest-util": "^27.0.6", + "pretty-format": "^27.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-each/node_modules/ansi-styles": { + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/color-convert": { + "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" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "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==", + "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" + } + }, + "node_modules/jest-each/node_modules/pretty-format": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.6.tgz", + "integrity": "sha512-8tGD7gBIENgzqA+UBzObyWqQ5B778VIFZA/S66cclyd5YkFLYs2Js7gxDKf0MXtTc9zcS7t1xhdfcElJ3YIvkQ==", + "dev": true, + "dependencies": { + "@jest/types": "^27.0.6", + "ansi-regex": "^5.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-each/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-jsdom": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.0.6.tgz", + "integrity": "sha512-FvetXg7lnXL9+78H+xUAsra3IeZRTiegA3An01cWeXBspKXUhAwMM9ycIJ4yBaR0L7HkoMPaZsozCLHh4T8fuw==", + "dev": true, + "dependencies": { + "@jest/environment": "^27.0.6", + "@jest/fake-timers": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/node": "*", + "jest-mock": "^27.0.6", + "jest-util": "^27.0.6", + "jsdom": "^16.6.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.0.6.tgz", + "integrity": "sha512-+Vi6yLrPg/qC81jfXx3IBlVnDTI6kmRr08iVa2hFCWmJt4zha0XW7ucQltCAPhSR0FEKEoJ3i+W4E6T0s9is0w==", + "dev": true, + "dependencies": { + "@jest/environment": "^27.0.6", + "@jest/fake-timers": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/node": "*", + "jest-mock": "^27.0.6", + "jest-util": "^27.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.0.6.tgz", + "integrity": "sha512-XTkK5exIeUbbveehcSR8w0bhH+c0yloW/Wpl+9vZrjzztCPWrxhHwkIFpZzCt71oRBsgxmuUfxEqOYoZI2macg==", + "dev": true, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.0.6.tgz", + "integrity": "sha512-4ldjPXX9h8doB2JlRzg9oAZ2p6/GpQUNAeiYXqcpmrKbP0Qev0wdZlxSMOmz8mPOEnt4h6qIzXFLDi8RScX/1w==", + "dev": true, + "dependencies": { + "@jest/types": "^27.0.6", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-regex-util": "^27.0.6", + "jest-serializer": "^27.0.6", + "jest-util": "^27.0.6", + "jest-worker": "^27.0.6", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-haste-map/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" + } + }, + "node_modules/jest-haste-map/node_modules/jest-worker": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.0.6.tgz", + "integrity": "sha512-qupxcj/dRuA3xHPMUd40gr2EaAurFbkwzOh7wfPaeE9id7hyjURRQoqNfHifHK3XjJU6YJJUQKILGUnwGPEOCA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-haste-map/node_modules/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jest-jasmine2": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.0.6.tgz", + "integrity": "sha512-cjpH2sBy+t6dvCeKBsHpW41mjHzXgsavaFMp+VWRf0eR4EW8xASk1acqmljFtK2DgyIECMv2yCdY41r2l1+4iA==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^27.0.6", + "@jest/source-map": "^27.0.6", + "@jest/test-result": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^27.0.6", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.0.6", + "jest-matcher-utils": "^27.0.6", + "jest-message-util": "^27.0.6", + "jest-runtime": "^27.0.6", + "jest-snapshot": "^27.0.6", + "jest-util": "^27.0.6", + "pretty-format": "^27.0.6", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/ansi-styles": { + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-jasmine2/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-jasmine2/node_modules/color-convert": { + "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" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "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==", + "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" + } + }, + "node_modules/jest-jasmine2/node_modules/pretty-format": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.6.tgz", + "integrity": "sha512-8tGD7gBIENgzqA+UBzObyWqQ5B778VIFZA/S66cclyd5YkFLYs2Js7gxDKf0MXtTc9zcS7t1xhdfcElJ3YIvkQ==", + "dev": true, + "dependencies": { + "@jest/types": "^27.0.6", + "ansi-regex": "^5.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-jasmine2/node_modules/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-junit": { + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-12.2.0.tgz", + "integrity": "sha512-ecGzF3KEQwLbMP5xMO7wqmgmyZlY/5yWDvgE/vFa+/uIT0KsU5nluf0D2fjIlOKB+tb6DiuSSpZuGpsmwbf7Fw==", + "dev": true, + "dependencies": { + "mkdirp": "^1.0.4", + "strip-ansi": "^5.2.0", + "uuid": "^8.3.2", + "xml": "^1.0.1" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/jest-junit/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-junit/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-leak-detector": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.0.6.tgz", + "integrity": "sha512-2/d6n2wlH5zEcdctX4zdbgX8oM61tb67PQt4Xh8JFAIy6LRKUnX528HulkaG6nD5qDl5vRV1NXejCe1XRCH5gQ==", + "dev": true, + "dependencies": { + "jest-get-type": "^27.0.6", + "pretty-format": "^27.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-leak-detector/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-leak-detector/node_modules/pretty-format": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.6.tgz", + "integrity": "sha512-8tGD7gBIENgzqA+UBzObyWqQ5B778VIFZA/S66cclyd5YkFLYs2Js7gxDKf0MXtTc9zcS7t1xhdfcElJ3YIvkQ==", + "dev": true, + "dependencies": { + "@jest/types": "^27.0.6", + "ansi-regex": "^5.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.0.6.tgz", + "integrity": "sha512-OFgF2VCQx9vdPSYTHWJ9MzFCehs20TsyFi6bIHbk5V1u52zJOnvF0Y/65z3GLZHKRuTgVPY4Z6LVePNahaQ+tA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^27.0.6", + "jest-get-type": "^27.0.6", + "pretty-format": "^27.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/ansi-styles": { + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/color-convert": { + "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" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-matcher-utils/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 + }, + "node_modules/jest-matcher-utils/node_modules/diff-sequences": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.0.6.tgz", + "integrity": "sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ==", + "dev": true, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-matcher-utils/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" + } + }, + "node_modules/jest-matcher-utils/node_modules/jest-diff": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.0.6.tgz", + "integrity": "sha512-Z1mqgkTCSYaFgwTlP/NUiRzdqgxmmhzHY1Tq17zL94morOHfHu3K4bgSgl+CR4GLhpV8VxkuOYuIWnQ9LnFqmg==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^27.0.6", + "jest-get-type": "^27.0.6", + "pretty-format": "^27.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/pretty-format": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.6.tgz", + "integrity": "sha512-8tGD7gBIENgzqA+UBzObyWqQ5B778VIFZA/S66cclyd5YkFLYs2Js7gxDKf0MXtTc9zcS7t1xhdfcElJ3YIvkQ==", + "dev": true, + "dependencies": { + "@jest/types": "^27.0.6", + "ansi-regex": "^5.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-message-util": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.0.6.tgz", + "integrity": "sha512-rBxIs2XK7rGy+zGxgi+UJKP6WqQ+KrBbD1YMj517HYN3v2BG66t3Xan3FWqYHKZwjdB700KiAJ+iES9a0M+ixw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.0.6", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.4", + "pretty-format": "^27.0.6", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-message-util/node_modules/ansi-styles": { + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/color-convert": { + "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" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "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==", + "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" + } + }, + "node_modules/jest-message-util/node_modules/pretty-format": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.6.tgz", + "integrity": "sha512-8tGD7gBIENgzqA+UBzObyWqQ5B778VIFZA/S66cclyd5YkFLYs2Js7gxDKf0MXtTc9zcS7t1xhdfcElJ3YIvkQ==", + "dev": true, + "dependencies": { + "@jest/types": "^27.0.6", + "ansi-regex": "^5.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-message-util/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-mock": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.0.6.tgz", + "integrity": "sha512-lzBETUoK8cSxts2NYXSBWT+EJNzmUVtVVwS1sU9GwE1DLCfGsngg+ZVSIe0yd0ZSm+y791esiuo+WSwpXJQ5Bw==", + "dev": true, + "dependencies": { + "@jest/types": "^27.0.6", + "@types/node": "*" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-preset-angular": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/jest-preset-angular/-/jest-preset-angular-9.0.4.tgz", + "integrity": "sha512-N/nPUwMXTW3bUiSzijn5vlQ51cuVEzJxDJ3s6EN8e3Wx2SF4Q9DBJIWpW+LVvSinLljYXJN9jPwkVstnnoJd9g==", + "dev": true, + "dependencies": { + "jest-environment-jsdom": "^27.0.0", + "pretty-format": "^27.0.0", + "ts-jest": "^27.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "optionalDependencies": { + "webpack": "^4.0.0 || ^5.30.0" + }, + "peerDependencies": { + "@angular-devkit/build-angular": ">=0.901.12", + "@angular/core": ">=9.0.0", + "@angular/platform-browser-dynamic": ">=9.0.0", + "jest": "^27.0.0" + } + }, + "node_modules/jest-preset-angular/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-preset-angular/node_modules/pretty-format": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.6.tgz", + "integrity": "sha512-8tGD7gBIENgzqA+UBzObyWqQ5B778VIFZA/S66cclyd5YkFLYs2Js7gxDKf0MXtTc9zcS7t1xhdfcElJ3YIvkQ==", + "dev": true, + "dependencies": { + "@jest/types": "^27.0.6", + "ansi-regex": "^5.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-regex-util": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.0.6.tgz", + "integrity": "sha512-SUhPzBsGa1IKm8hx2F4NfTGGp+r7BXJ4CulsZ1k2kI+mGLG+lxGrs76veN2LF/aUdGosJBzKgXmNCw+BzFqBDQ==", + "dev": true, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.0.6.tgz", + "integrity": "sha512-yKmIgw2LgTh7uAJtzv8UFHGF7Dm7XfvOe/LQ3Txv101fLM8cx2h1QVwtSJ51Q/SCxpIiKfVn6G2jYYMDNHZteA==", + "dev": true, + "dependencies": { + "@jest/types": "^27.0.6", + "chalk": "^4.0.0", + "escalade": "^3.1.1", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.0.6", + "jest-validate": "^27.0.6", + "resolve": "^1.20.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.0.6.tgz", + "integrity": "sha512-mg9x9DS3BPAREWKCAoyg3QucCr0n6S8HEEsqRCKSPjPcu9HzRILzhdzY3imsLoZWeosEbJZz6TKasveczzpJZA==", + "dev": true, + "dependencies": { + "@jest/types": "^27.0.6", + "jest-regex-util": "^27.0.6", + "jest-snapshot": "^27.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve/node_modules/ansi-styles": { + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-resolve/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-resolve/node_modules/color-convert": { + "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" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "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==", + "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" + } + }, + "node_modules/jest-resolve/node_modules/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.0.6.tgz", + "integrity": "sha512-W3Bz5qAgaSChuivLn+nKOgjqNxM7O/9JOJoKDCqThPIg2sH/d4A/lzyiaFgnb9V1/w29Le11NpzTJSzga1vyYQ==", + "dev": true, + "dependencies": { + "@jest/console": "^27.0.6", + "@jest/environment": "^27.0.6", + "@jest/test-result": "^27.0.6", + "@jest/transform": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-docblock": "^27.0.6", + "jest-environment-jsdom": "^27.0.6", + "jest-environment-node": "^27.0.6", + "jest-haste-map": "^27.0.6", + "jest-leak-detector": "^27.0.6", + "jest-message-util": "^27.0.6", + "jest-resolve": "^27.0.6", + "jest-runtime": "^27.0.6", + "jest-util": "^27.0.6", + "jest-worker": "^27.0.6", + "source-map-support": "^0.5.6", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runner/node_modules/ansi-styles": { + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runner/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runner/node_modules/color-convert": { + "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" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "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==", + "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" + } + }, + "node_modules/jest-runner/node_modules/jest-worker": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.0.6.tgz", + "integrity": "sha512-qupxcj/dRuA3xHPMUd40gr2EaAurFbkwzOh7wfPaeE9id7hyjURRQoqNfHifHK3XjJU6YJJUQKILGUnwGPEOCA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-runner/node_modules/jest-worker/node_modules/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jest-runner/node_modules/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.0.6.tgz", + "integrity": "sha512-BhvHLRVfKibYyqqEFkybsznKwhrsu7AWx2F3y9G9L95VSIN3/ZZ9vBpm/XCS2bS+BWz3sSeNGLzI3TVQ0uL85Q==", + "dev": true, + "dependencies": { + "@jest/console": "^27.0.6", + "@jest/environment": "^27.0.6", + "@jest/fake-timers": "^27.0.6", + "@jest/globals": "^27.0.6", + "@jest/source-map": "^27.0.6", + "@jest/test-result": "^27.0.6", + "@jest/transform": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^27.0.6", + "jest-message-util": "^27.0.6", + "jest-mock": "^27.0.6", + "jest-regex-util": "^27.0.6", + "jest-resolve": "^27.0.6", + "jest-snapshot": "^27.0.6", + "jest-util": "^27.0.6", + "jest-validate": "^27.0.6", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^16.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runtime/node_modules/ansi-styles": { + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/color-convert": { + "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" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "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==", + "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" + } + }, + "node_modules/jest-runtime/node_modules/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-serializer": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.0.6.tgz", + "integrity": "sha512-PtGdVK9EGC7dsaziskfqaAPib6wTViY3G8E5wz9tLVPhHyiDNTZn/xjZ4khAw+09QkoOVpn7vF5nPSN6dtBexA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "graceful-fs": "^4.2.4" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.0.6.tgz", + "integrity": "sha512-NTHaz8He+ATUagUgE7C/UtFcRoHqR2Gc+KDfhQIyx+VFgwbeEMjeP+ILpUTLosZn/ZtbNdCF5LkVnN/l+V751A==", + "dev": true, + "dependencies": { + "@babel/core": "^7.7.2", + "@babel/generator": "^7.7.2", + "@babel/parser": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.0.0", + "@jest/transform": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^27.0.6", + "graceful-fs": "^4.2.4", + "jest-diff": "^27.0.6", + "jest-get-type": "^27.0.6", + "jest-haste-map": "^27.0.6", + "jest-matcher-utils": "^27.0.6", + "jest-message-util": "^27.0.6", + "jest-resolve": "^27.0.6", + "jest-util": "^27.0.6", + "natural-compare": "^1.4.0", + "pretty-format": "^27.0.6", + "semver": "^7.3.2" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/ansi-styles": { + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/color-convert": { + "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" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "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==", + "dev": true + }, + "node_modules/jest-snapshot/node_modules/diff-sequences": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.0.6.tgz", + "integrity": "sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ==", + "dev": true, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "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" + } + }, + "node_modules/jest-snapshot/node_modules/jest-diff": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.0.6.tgz", + "integrity": "sha512-Z1mqgkTCSYaFgwTlP/NUiRzdqgxmmhzHY1Tq17zL94morOHfHu3K4bgSgl+CR4GLhpV8VxkuOYuIWnQ9LnFqmg==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^27.0.6", + "jest-get-type": "^27.0.6", + "pretty-format": "^27.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/pretty-format": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.6.tgz", + "integrity": "sha512-8tGD7gBIENgzqA+UBzObyWqQ5B778VIFZA/S66cclyd5YkFLYs2Js7gxDKf0MXtTc9zcS7t1xhdfcElJ3YIvkQ==", + "dev": true, + "dependencies": { + "@jest/types": "^27.0.6", + "ansi-regex": "^5.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-sonar-reporter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jest-sonar-reporter/-/jest-sonar-reporter-2.0.0.tgz", + "integrity": "sha512-ZervDCgEX5gdUbdtWsjdipLN3bKJwpxbvhkYNXTAYvAckCihobSLr9OT/IuyNIRT1EZMDDwR6DroWtrq+IL64w==", + "dev": true, + "dependencies": { + "xml": "^1.0.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/jest-util": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.0.6.tgz", + "integrity": "sha512-1JjlaIh+C65H/F7D11GNkGDDZtDfMEM8EBXsvd+l/cxtgQ6QhxuloOaiayt89DxUvDarbVhqI98HhgrM1yliFQ==", + "dev": true, + "dependencies": { + "@jest/types": "^27.0.6", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^3.0.0", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-util/node_modules/ansi-styles": { + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/color-convert": { + "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" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "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==", + "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" + } + }, + "node_modules/jest-util/node_modules/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-validate": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.0.6.tgz", + "integrity": "sha512-yhZZOaMH3Zg6DC83n60pLmdU1DQE46DW+KLozPiPbSbPhlXXaiUTDlhHQhHFpaqIFRrInko1FHXjTRpjWRuWfA==", + "dev": true, + "dependencies": { + "@jest/types": "^27.0.6", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^27.0.6", + "leven": "^3.1.0", + "pretty-format": "^27.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-validate/node_modules/ansi-styles": { + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-validate/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/color-convert": { + "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" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "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==", + "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" + } + }, + "node_modules/jest-validate/node_modules/pretty-format": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.6.tgz", + "integrity": "sha512-8tGD7gBIENgzqA+UBzObyWqQ5B778VIFZA/S66cclyd5YkFLYs2Js7gxDKf0MXtTc9zcS7t1xhdfcElJ3YIvkQ==", + "dev": true, + "dependencies": { + "@jest/types": "^27.0.6", + "ansi-regex": "^5.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-validate/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watcher": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.0.6.tgz", + "integrity": "sha512-/jIoKBhAP00/iMGnTwUBLgvxkn7vsOweDrOTSPzc7X9uOyUtJIDthQBTI1EXz90bdkrxorUZVhJwiB69gcHtYQ==", + "dev": true, + "dependencies": { + "@jest/test-result": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^27.0.6", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-watcher/node_modules/ansi-styles": { + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-watcher/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-watcher/node_modules/color-convert": { + "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" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "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==", + "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" + } + }, + "node_modules/jest-watcher/node_modules/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker": { + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.0.2.tgz", + "integrity": "sha512-EoBdilOTTyOgmHXtw/cPc+ZrCA0KJMrkXzkrPGNwLmnvvlN1nj7MPrxpT7m+otSv2e1TLaVffzDnE/LB14zJMg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/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" + } + }, + "node_modules/jest-worker/node_modules/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jmespath": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", + "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/joi": { + "version": "17.4.0", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.4.0.tgz", + "integrity": "sha512-F4WiW2xaV6wc1jxete70Rw4V/VuMd6IN+a5ilZsxG4uYtUXWu2kq9W5P2dz30e7Gmw8RCbY/u/uk+dMPma9tAg==", + "dev": true, + "dependencies": { + "@hapi/hoek": "^9.0.0", + "@hapi/topo": "^5.0.0", + "@sideway/address": "^4.1.0", + "@sideway/formula": "^3.0.0", + "@sideway/pinpoint": "^2.0.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "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" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "node_modules/jsdom": { + "version": "16.6.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.6.0.tgz", + "integrity": "sha512-Ty1vmF4NHJkolaEmdjtxTfSfkdb8Ywarwf63f+F8/mDD1uLSSWDxDuMiZxiPhwunLrn9LOSVItWj4bLYsLN3Dg==", + "dev": true, + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.5", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/acorn": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.1.tgz", + "integrity": "sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/jsdom/node_modules/tough-cookie": { + "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", + "universalify": "^0.1.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/json-schema-typed": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-7.0.3.tgz", + "integrity": "sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "node_modules/json-stringify-nice": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz", + "integrity": "sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "node_modules/json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==" + }, + "node_modules/json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", + "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", + "dev": true + }, + "node_modules/jsonfile": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", + "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true, + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "node_modules/just-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/just-diff/-/just-diff-3.1.1.tgz", + "integrity": "sha512-sdMWKjRq8qWZEjDcVA6llnUT8RDEBIfOiGpYFPYa9u+2c39JCsejktSP7mj5eRid5EIvTzIpQ2kDOCw1Nq9BjQ==", + "dev": true + }, + "node_modules/just-diff-apply": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/just-diff-apply/-/just-diff-apply-3.0.0.tgz", + "integrity": "sha512-K2MLc+ZC2DVxX4V61bIKPeMUUfj1YYZ3h0myhchDXOW1cKoPZMnjIoNCqv9bF2n5Oob1PFxuR2gVJxkxz4e58w==", + "dev": true + }, + "node_modules/karma-source-map-support": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", + "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", + "dev": true, + "dependencies": { + "source-map-support": "^0.5.5" + } + }, + "node_modules/killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "dev": true + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "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" + } + }, + "node_modules/klona": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.4.tgz", + "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", + "dev": true + }, + "node_modules/lcid": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-3.1.1.tgz", + "integrity": "sha512-M6T051+5QCGLBQb8id3hdvIW8+zeFV2FyBGFS9IEK5H9Wt4MueD4bW1eWikpHgZp+5xR3l5c8pZUkQsIA0BFZg==", + "dev": true, + "dependencies": { + "invert-kv": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/less": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/less/-/less-4.1.1.tgz", + "integrity": "sha512-w09o8tZFPThBscl5d0Ggp3RcrKIouBoQscnOMgFH3n5V3kN/CXGHNfCkRPtxJk6nKryDXaV9aHLK55RXuH4sAw==", + "dev": true, + "dependencies": { + "copy-anything": "^2.0.1", + "parse-node-version": "^1.0.1", + "tslib": "^1.10.0" + }, + "bin": { + "lessc": "bin/lessc" + }, + "engines": { + "node": ">=6" + }, + "optionalDependencies": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^2.5.2", + "source-map": "~0.6.0" + } + }, + "node_modules/less-loader": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-10.0.0.tgz", + "integrity": "sha512-JjioAkw9qyavL0BzMPUOHJa0a20fh+ipq/MNZH4OkU8qERsCMeZIWRE0FDBIx2O+cFguvY01vHh/lmBA9LyWDg==", + "dev": true, + "dependencies": { + "klona": "^2.0.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "less": "^3.5.0 || ^4.0.0", + "webpack": "^5.0.0" + } + }, + "node_modules/less/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "optional": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/less/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/less/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/less/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/less/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/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==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/license-webpack-plugin": { + "version": "2.3.19", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.3.19.tgz", + "integrity": "sha512-z/izhwFRYHs1sCrDgrTUsNJpd+Xsd06OcFWSwHz/TiZygm5ucweVZi1Hu14Rf6tOj/XAl1Ebyc7GW6ZyyINyWA==", + "dev": true, + "dependencies": { + "@types/webpack-sources": "^0.1.5", + "webpack-sources": "^1.2.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } + } + }, + "node_modules/limiter": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", + "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==", + "dev": true + }, + "node_modules/lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "node_modules/lint-staged": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-11.0.0.tgz", + "integrity": "sha512-3rsRIoyaE8IphSUtO1RVTFl1e0SLBtxxUOPBtHxQgBHS5/i6nqvjcUfNioMa4BU9yGnPzbO+xkfLtXtxBpCzjw==", + "dev": true, + "dependencies": { + "chalk": "^4.1.1", + "cli-truncate": "^2.1.0", + "commander": "^7.2.0", + "cosmiconfig": "^7.0.0", + "debug": "^4.3.1", + "dedent": "^0.7.0", + "enquirer": "^2.3.6", + "execa": "^5.0.0", + "listr2": "^3.8.2", + "log-symbols": "^4.1.0", + "micromatch": "^4.0.4", + "normalize-path": "^3.0.0", + "please-upgrade-node": "^3.2.0", + "string-argv": "0.3.1", + "stringify-object": "^3.3.0" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "node_modules/lint-staged/node_modules/ansi-styles": { + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/lint-staged/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/lint-staged/node_modules/color-convert": { + "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" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/lint-staged/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 + }, + "node_modules/lint-staged/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" + } + }, + "node_modules/lint-staged/node_modules/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/listr2": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.10.0.tgz", + "integrity": "sha512-eP40ZHihu70sSmqFNbNy2NL1YwImmlMmPh9WO5sLmPDleurMHt3n+SwEWNu2kzKScexZnkyFtc1VI0z/TGlmpw==", + "dev": true, + "dependencies": { + "cli-truncate": "^2.1.0", + "colorette": "^1.2.2", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rxjs": "^6.6.7", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" + } + }, + "node_modules/load-yaml-file": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/load-yaml-file/-/load-yaml-file-0.2.0.tgz", + "integrity": "sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.5", + "js-yaml": "^3.13.0", + "pify": "^4.0.1", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/load-yaml-file/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/load-yaml-file/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/loader-runner": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", + "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", + "dev": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/localtunnel": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-2.0.1.tgz", + "integrity": "sha512-LiaI5wZdz0xFkIQpXbNI62ZnNn8IMsVhwxHmhA+h4vj8R9JG/07bQHWwQlyy7b95/5fVOCHJfIHv+a5XnkvaJA==", + "dev": true, + "dependencies": { + "axios": "0.21.1", + "debug": "4.3.1", + "openurl": "1.1.1", + "yargs": "16.2.0" + }, + "bin": { + "lt": "bin/lt.js" + }, + "engines": { + "node": ">=8.3.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true + }, + "node_modules/lodash.isfinite": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", + "integrity": "sha1-+4m2WpqAKBgz8LdHizpRBPiY67M=", + "dev": true + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/color-convert": { + "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" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/log-symbols/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 + }, + "node_modules/log-symbols/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" + } + }, + "node_modules/log-symbols/node_modules/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-styles": { + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-update/node_modules/color-convert": { + "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" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/log-update/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 + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/logform": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.2.0.tgz", + "integrity": "sha512-N0qPlqfypFx7UHNn4B3lzS/b0uLqt2hmuoa+PpuXNYgozdJYAyauF5Ky0BWVjrxDlMWiT3qN4zPq3vVAfZy7Yg==", + "dev": true, + "dependencies": { + "colors": "^1.2.1", + "fast-safe-stringify": "^2.0.4", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "triple-beam": "^1.3.0" + } + }, + "node_modules/loglevel": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", + "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/macos-release": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.0.tgz", + "integrity": "sha512-EIgv+QZ9r+814gjJj0Bt5vSLJLzswGmSUbUpbi9AIr/fsN2IWFBl2NucV9PAiek+U1STK468tEkxmVYUtuAN3g==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/magic-string": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.4" + } + }, + "node_modules/make-dir": { + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/make-fetch-happen": { + "version": "8.0.14", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-8.0.14.tgz", + "integrity": "sha512-EsS89h6l4vbfJEtBZnENTOFk8mCRpY5ru36Xe5bcX1KYIli2mkSHqoFsp5O1wMDvTJJzxe/4THpCTtygjeeGWQ==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.0.5", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^5.0.0", + "ssri": "^8.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true, + "dependencies": { + "tmpl": "1.0.x" + } + }, + "node_modules/map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "dependencies": { + "p-defer": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mem": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/mem/-/mem-5.1.1.tgz", + "integrity": "sha512-qvwipnozMohxLXG1pOqoLiZKNkC4r4qqRucSoDwXowsNGDSULiqFTRUF05vcZWnwJSG22qTsynQhxbaMtnX9gw==", + "dev": true, + "dependencies": { + "map-age-cleaner": "^0.1.3", + "mimic-fn": "^2.1.0", + "p-is-promise": "^2.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mem-fs": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/mem-fs/-/mem-fs-2.2.1.tgz", + "integrity": "sha512-yiAivd4xFOH/WXlUi6v/nKopBh1QLzwjFi36NK88cGt/PRXI8WeBASqY+YSjIVWvQTx3hR8zHKDBMV6hWmglNA==", + "dev": true, + "dependencies": { + "@types/node": "^15.6.1", + "@types/vinyl": "^2.0.4", + "vinyl": "^2.0.1", + "vinyl-file": "^3.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/mem-fs-editor": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/mem-fs-editor/-/mem-fs-editor-9.0.1.tgz", + "integrity": "sha512-SqW+DkPbxZVzVldNHexoo5MiUR3YpIqiCVcZ/SZ6f7KToaSV7pMd4/URrkD5mnj35bd6NAK7SlftHSyW+Kgk4w==", + "dev": true, + "dependencies": { + "binaryextensions": "^4.15.0", + "commondir": "^1.0.1", + "deep-extend": "^0.6.0", + "ejs": "^3.1.6", + "globby": "^11.0.3", + "isbinaryfile": "^4.0.8", + "multimatch": "^5.0.0", + "normalize-path": "^3.0.0", + "textextensions": "^5.12.0" + }, + "engines": { + "node": ">=12.10.0" + }, + "peerDependencies": { + "mem-fs": "^2.1.0" + }, + "peerDependenciesMeta": { + "mem-fs": { + "optional": true + } + } + }, + "node_modules/mem/node_modules/mimic-fn": { + "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" + } + }, + "node_modules/memfs": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.2.2.tgz", + "integrity": "sha512-RE0CwmIM3CEvpcdK3rZ19BC4E6hv9kADkMN5rPduRak58cNArWLi/9jFLsa4rhsjfVxMP3v0jO7FHXq7SvFY5Q==", + "dev": true, + "dependencies": { + "fs-monkey": "1.0.3" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "node_modules/memory-fs/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/memory-fs/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "node_modules/merge-jsons-webpack-plugin": { + "version": "1.0.21", + "resolved": "https://registry.npmjs.org/merge-jsons-webpack-plugin/-/merge-jsons-webpack-plugin-1.0.21.tgz", + "integrity": "sha512-5Brw0DBi7tF48gm3BB21hu3qYWUMHuKWHKNqdZYmGTQlZQFTc63VFY/5LgonqusI/b0uvvjkpTdx1WrjInXreQ==", + "dev": true, + "dependencies": { + "es6-promise": "4.0.5", + "glob": "7.1.1" + } + }, + "node_modules/merge-jsons-webpack-plugin/node_modules/glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", + "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "dev": true, + "dependencies": { + "source-map": "^0.6.1" + } + }, + "node_modules/merge-source-map/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.48.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", + "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.31", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", + "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", + "dev": true, + "dependencies": { + "mime-db": "1.48.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", + "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-1.6.2.tgz", + "integrity": "sha512-WhDvO3SjGm40oV5y26GjMJYjd2UMqrLAGKy5YS2/3QKJy2F7jgynuHTir/tgUUOiNQu5saXHdc8reo7YuhhT4Q==", + "dev": true, + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0", + "webpack-sources": "^1.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.4.0 || ^5.0.0" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "node_modules/minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-fetch": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.3.3.tgz", + "integrity": "sha512-akCrLDWfbdAWkMLBxJEeWTdNsjML+dt5YgOI4gJ53vuO0vrmYQkUPxa6j6V65s9CcePIr2SSWqjT2EcrNseryQ==", + "dev": true, + "dependencies": { + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "optionalDependencies": { + "encoding": "^0.1.12" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-json-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", + "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", + "dev": true, + "dependencies": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/mitt": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz", + "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==", + "dev": true + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mkdirp-infer-owner": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mkdirp-infer-owner/-/mkdirp-infer-owner-2.0.0.tgz", + "integrity": "sha512-sdqtiFt3lkOaYvTXSRIUjkIdPTcxgv5+fgqYE/5qgwdw12cOrAuzzgzvVExIkH/ul1oeHN3bCLOWSG3XOqbKKw==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "infer-owner": "^1.0.4", + "mkdirp": "^1.0.3" + }, + "engines": { + "node": ">=10" + } + }, + "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/multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "dependencies": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "node_modules/multimatch": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz", + "integrity": "sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==", + "dev": true, + "dependencies": { + "@types/minimatch": "^3.0.3", + "array-differ": "^3.0.0", + "array-union": "^2.1.0", + "arrify": "^2.0.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "node_modules/nan": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", + "dev": true, + "optional": true + }, + "node_modules/nanoid": { + "version": "3.1.23", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz", + "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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=", + "dev": true + }, + "node_modules/needle": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.7.0.tgz", + "integrity": "sha512-b4f4JgOl7GZVM1p+xuWBAsHwflng1s2yOu9lOThKAzULRW7eqSFYfN4gbuUFOMuE0hVAPWJnSz/90LMOlEGErw==", + "dev": true, + "optional": true, + "dependencies": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/needle/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "optional": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/needle/node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true, + "optional": true + }, + "node_modules/negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/ngx-infinite-scroll": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/ngx-infinite-scroll/-/ngx-infinite-scroll-10.0.1.tgz", + "integrity": "sha512-7is0eJZ9kJPsaHohRmMhJ/QFHAW9jp9twO5HcHRvFM/Yl/R8QCiokgjwmH0/CR3MuxUanxfHZMfO3PbYTwlBEg==", + "hasInstallScript": true, + "dependencies": { + "@scarf/scarf": "^1.1.0", + "opencollective-postinstall": "^2.0.2" + } + }, + "node_modules/ngx-webstorage": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/ngx-webstorage/-/ngx-webstorage-8.0.0.tgz", + "integrity": "sha512-dpHgboSi6adnYpwiAQ2/PRJe8dcvSbM2qWTacTCUPVPeWlhLvTCtIl1GA9BNDiZzYuyA3dmXyqlcDl/Th9Pi2A==", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "@angular/common": "^12.0.0", + "@angular/core": "^12.0.0" + } + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node_modules/node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", + "dev": true, + "engines": { + "node": "4.x || >=6.0.0" + } + }, + "node_modules/node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "dev": true, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/node-gyp": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz", + "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.3", + "nopt": "^5.0.0", + "npmlog": "^4.1.2", + "request": "^2.88.2", + "rimraf": "^3.0.2", + "semver": "^7.3.2", + "tar": "^6.0.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": ">= 10.12.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node_modules/node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/node-notifier": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-9.0.1.tgz", + "integrity": "sha512-fPNFIp2hF/Dq7qLDzSg4vZ0J4e9v60gJR+Qx7RbjbWqzPDdEqeVpEx5CFeDAELIl+A/woaaNn1fQ5nEVerMxJg==", + "dev": true, + "dependencies": { + "growly": "^1.3.0", + "is-wsl": "^2.2.0", + "semver": "^7.3.2", + "shellwords": "^0.1.1", + "uuid": "^8.3.0", + "which": "^2.0.2" + } + }, + "node_modules/node-releases": { + "version": "1.1.73", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz", + "integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==", + "dev": true + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/normalize-path": { + "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" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-bundled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", + "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", + "dev": true, + "dependencies": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "node_modules/npm-install-checks": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-4.0.0.tgz", + "integrity": "sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==", + "dev": true, + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", + "dev": true + }, + "node_modules/npm-package-arg": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.2.tgz", + "integrity": "sha512-6Eem455JsSMJY6Kpd3EyWE+n5hC+g9bSyHr9K9U2zqZb7+02+hObQ2c0+8iDk/mNF+8r1MhY44WypKJAkySIYA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^4.0.1", + "semver": "^7.3.4", + "validate-npm-package-name": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-packlist": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-2.2.2.tgz", + "integrity": "sha512-Jt01acDvJRhJGthnUJVF/w6gumWOZxO7IkpY/lsX9//zqQgnF7OJaxgQXcerd4uQOLu7W5bkb4mChL9mdfm+Zg==", + "dev": true, + "dependencies": { + "glob": "^7.1.6", + "ignore-walk": "^3.0.3", + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + }, + "bin": { + "npm-packlist": "bin/index.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-pick-manifest": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.1.tgz", + "integrity": "sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA==", + "dev": true, + "dependencies": { + "npm-install-checks": "^4.0.0", + "npm-normalize-package-bin": "^1.0.1", + "npm-package-arg": "^8.1.2", + "semver": "^7.3.4" + } + }, + "node_modules/npm-registry-fetch": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-10.1.2.tgz", + "integrity": "sha512-KsM/TdPmntqgBFlfsbkOLkkE9ovZo7VpVcd+/eTdYszCrgy5zFl5JzWm+OxavFaEWlbkirpkou+ZYI00RmOBFA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0", + "make-fetch-happen": "^8.0.9", + "minipass": "^3.1.3", + "minipass-fetch": "^1.3.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.0.0", + "npm-package-arg": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-run-path": { + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "dependencies": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "node_modules/nth-check": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.0.tgz", + "integrity": "sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "node_modules/number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", + "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "dev": true, + "dependencies": { + "fn.name": "1.x.x" + } + }, + "node_modules/onetime": { + "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" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/onetime/node_modules/mimic-fn": { + "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" + } + }, + "node_modules/open": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/open/-/open-8.2.1.tgz", + "integrity": "sha512-rXILpcQlkF/QuFez2BJDf3GsqpjGKbkUUToAIGo9A0Q6ZkoSGogZJulrUdwRkrAsoQvoZsrjCYt8+zblOk7JQQ==", + "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/opencollective-postinstall": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", + "bin": { + "opencollective-postinstall": "index.js" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "dev": true, + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/openurl": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz", + "integrity": "sha1-OHW0sO96UsFW8NtB1GCduw+Us4c=", + "dev": true + }, + "node_modules/opn": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", + "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", + "dev": true, + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/opn/node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/ansi-styles": { + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ora/node_modules/color-convert": { + "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" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/ora/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 + }, + "node_modules/ora/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" + } + }, + "node_modules/ora/node_modules/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "dependencies": { + "url-parse": "^1.4.3" + } + }, + "node_modules/os-locale": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-5.0.0.tgz", + "integrity": "sha512-tqZcNEDAIZKBEPnHPlVDvKrp7NzgLi7jRmhKiUoa2NUmhl13FtkAGLUVR+ZsYvApBQdBfYm43A4tXXQ4IrYLBA==", + "dev": true, + "dependencies": { + "execa": "^4.0.0", + "lcid": "^3.0.0", + "mem": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/os-locale/node_modules/execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/os-locale/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/os-locale/node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true, + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/os-name": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-3.1.0.tgz", + "integrity": "sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg==", + "dev": true, + "dependencies": { + "macos-release": "^2.2.0", + "windows-release": "^3.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-each-series": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", + "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "dev": true, + "dependencies": { + "retry": "^0.12.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "dev": true, + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pacote": { + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-11.3.2.tgz", + "integrity": "sha512-lMO7V9aMhyE5gfaSFxKfW3OTdXuFBNQJfuNuet3NPzWWhOYIW90t85vHcHLDjdhgmfAdAHyh9q1HAap96ea0XA==", + "dev": true, + "dependencies": { + "@npmcli/git": "^2.0.1", + "@npmcli/installed-package-contents": "^1.0.6", + "@npmcli/promise-spawn": "^1.2.0", + "@npmcli/run-script": "^1.8.2", + "cacache": "^15.0.5", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "infer-owner": "^1.0.4", + "minipass": "^3.1.3", + "mkdirp": "^1.0.3", + "npm-package-arg": "^8.0.1", + "npm-packlist": "^2.1.4", + "npm-pick-manifest": "^6.0.0", + "npm-registry-fetch": "^10.0.0", + "promise-retry": "^2.0.1", + "read-package-json-fast": "^2.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.1.0" + }, + "bin": { + "pacote": "lib/bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha1-juqz5U+laSD+Fro493+iGqzC104=", + "dev": true + }, + "node_modules/parse-conflict-json": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/parse-conflict-json/-/parse-conflict-json-1.1.1.tgz", + "integrity": "sha512-4gySviBiW5TRl7XHvp1agcS7SOe0KZOjC//71dzZVWJrY9hCrgtvl5v3SyIxCZ4fZF47TxD9nfzmxcx76xmbUw==", + "dev": true, + "dependencies": { + "json-parse-even-better-errors": "^2.3.0", + "just-diff": "^3.0.1", + "just-diff-apply": "^3.0.0" + } + }, + "node_modules/parse-gitignore": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-gitignore/-/parse-gitignore-1.0.1.tgz", + "integrity": "sha512-UGyowyjtx26n65kdAMWhm6/3uy5uSrpcuH7tt+QEVudiBoVS+eqHxD5kbi9oWVRwj7sCzXqwuM+rUGw7earl6A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "node_modules/parse5-html-rewriting-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-6.0.1.tgz", + "integrity": "sha512-vwLQzynJVEfUlURxgnf51yAJDQTtVpNyGD8tKi2Za7m+akukNHxCcUQMAa/mUGLhCeicFdpy7Tlvj8ZNKadprg==", + "dev": true, + "dependencies": { + "parse5": "^6.0.1", + "parse5-sax-parser": "^6.0.1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dev": true, + "dependencies": { + "parse5": "^6.0.1" + } + }, + "node_modules/parse5-sax-parser": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-6.0.1.tgz", + "integrity": "sha512-kXX+5S81lgESA0LsDuGjAlBybImAChYRMT+/uKCEXFBFOeEhS52qUCydGhU3qLRD8D9DVjaUo821WK7DM4iCeg==", + "dev": true, + "dependencies": { + "parse5": "^6.0.1" + } + }, + "node_modules/parseqs": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", + "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==", + "dev": true + }, + "node_modules/parseuri": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", + "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==", + "dev": true + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "node_modules/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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "node_modules/path-key": { + "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" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "node_modules/picomatch": { + "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" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "dev": true, + "dependencies": { + "node-modules-regexp": "^1.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/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, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "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" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dev": true, + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/p-limit": { + "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" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-up/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "dev": true, + "dependencies": { + "semver-compare": "^1.0.0" + } + }, + "node_modules/plugin-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", + "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", + "dev": true, + "dependencies": { + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/plugin-error/node_modules/ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "dev": true, + "dependencies": { + "ansi-wrap": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "dev": true, + "dependencies": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + }, + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/portfinder/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/portfinder/node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/portscanner": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.1.1.tgz", + "integrity": "sha1-6rtAnk3iSVD1oqUW01rnaTQ/u5Y=", + "dev": true, + "dependencies": { + "async": "1.5.2", + "is-number-like": "^1.0.3" + }, + "engines": { + "node": ">=0.4", + "npm": ">=1.0.0" + } + }, + "node_modules/portscanner/node_modules/async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "node_modules/posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.5.tgz", + "integrity": "sha512-NxTuJocUhYGsMiMFHDUkmjSKT3EdH4/WbGF6GCi1NDGk+vbcUTun4fpbOqaPtD8IIsztA2ilZm2DhYCuyN58gA==", + "dev": true, + "dependencies": { + "colorette": "^1.2.2", + "nanoid": "^3.1.23", + "source-map-js": "^0.6.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-attribute-case-insensitive": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz", + "integrity": "sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==", + "dev": true, + "dependencies": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^6.0.2" + } + }, + "node_modules/postcss-attribute-case-insensitive/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-attribute-case-insensitive/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-attribute-case-insensitive/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-calc": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.0.0.tgz", + "integrity": "sha512-5NglwDrcbiy8XXfPM11F3HeC6hoT9W7GUH/Zi5U/p7u3Irv4rHhdDcIZwG0llHXV4ftsBjpfWMXAnXNl4lnt8g==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "node_modules/postcss-color-functional-notation": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz", + "integrity": "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==", + "dev": true, + "dependencies": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-color-functional-notation/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-color-functional-notation/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-color-functional-notation/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-color-gray": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz", + "integrity": "sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==", + "dev": true, + "dependencies": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.5", + "postcss-values-parser": "^2.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-color-gray/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-color-gray/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-color-gray/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-color-hex-alpha": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz", + "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==", + "dev": true, + "dependencies": { + "postcss": "^7.0.14", + "postcss-values-parser": "^2.0.1" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-color-hex-alpha/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-color-hex-alpha/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-color-hex-alpha/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-color-mod-function": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz", + "integrity": "sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==", + "dev": true, + "dependencies": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-color-mod-function/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-color-mod-function/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-color-mod-function/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-color-rebeccapurple": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz", + "integrity": "sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==", + "dev": true, + "dependencies": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-color-rebeccapurple/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-color-rebeccapurple/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-color-rebeccapurple/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-colormin": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.2.0.tgz", + "integrity": "sha512-+HC6GfWU3upe5/mqmxuqYZ9B2Wl4lcoUUNkoaX59nEWV4EtADCMiBqui111Bu8R8IvaZTmqmxrqOAqjbHIwXPw==", + "dev": true, + "dependencies": { + "browserslist": "^4.16.6", + "caniuse-api": "^3.0.0", + "colord": "^2.0.1", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-convert-values": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.0.1.tgz", + "integrity": "sha512-C3zR1Do2BkKkCgC0g3sF8TS0koF2G+mN8xxayZx3f10cIRmTaAnpgpRQZjNekTZxM2ciSPoh2IWJm0VZx8NoQg==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-custom-media": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz", + "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==", + "dev": true, + "dependencies": { + "postcss": "^7.0.14" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-custom-media/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-custom-media/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-custom-media/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-custom-properties": { + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz", + "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==", + "dev": true, + "dependencies": { + "postcss": "^7.0.17", + "postcss-values-parser": "^2.0.1" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-custom-properties/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-custom-properties/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-custom-properties/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-custom-selectors": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz", + "integrity": "sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==", + "dev": true, + "dependencies": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-custom-selectors/node_modules/cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-custom-selectors/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-custom-selectors/node_modules/postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "dev": true, + "dependencies": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-custom-selectors/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-custom-selectors/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-dir-pseudo-class": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz", + "integrity": "sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==", + "dev": true, + "dependencies": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/postcss-dir-pseudo-class/node_modules/cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-dir-pseudo-class/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-dir-pseudo-class/node_modules/postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "dev": true, + "dependencies": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-dir-pseudo-class/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-dir-pseudo-class/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-discard-comments": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.0.1.tgz", + "integrity": "sha512-lgZBPTDvWrbAYY1v5GYEv8fEO/WhKOu/hmZqmCYfrpD6eyDWWzAOsl2rF29lpvziKO02Gc5GJQtlpkTmakwOWg==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.0.1.tgz", + "integrity": "sha512-svx747PWHKOGpAXXQkCc4k/DsWo+6bc5LsVrAsw+OU+Ibi7klFZCyX54gjYzX4TH+f2uzXjRviLARxkMurA2bA==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-empty": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.0.1.tgz", + "integrity": "sha512-vfU8CxAQ6YpMxV2SvMcMIyF2LX1ZzWpy0lqHDsOdaKKLQVQGVP1pzhrI9JlsO65s66uQTfkQBKBD/A5gp9STFw==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.0.1.tgz", + "integrity": "sha512-Y28H7y93L2BpJhrdUR2SR2fnSsT+3TVx1NmVQLbcnZWwIUpJ7mfcTC6Za9M2PG6w8j7UQRfzxqn8jU2VwFxo3Q==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-double-position-gradients": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz", + "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==", + "dev": true, + "dependencies": { + "postcss": "^7.0.5", + "postcss-values-parser": "^2.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-double-position-gradients/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-double-position-gradients/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-double-position-gradients/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-env-function": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz", + "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==", + "dev": true, + "dependencies": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-env-function/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-env-function/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-env-function/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-focus-visible": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz", + "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==", + "dev": true, + "dependencies": { + "postcss": "^7.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-focus-visible/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-focus-visible/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-focus-visible/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-focus-within": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz", + "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==", + "dev": true, + "dependencies": { + "postcss": "^7.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-focus-within/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-focus-within/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-focus-within/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-font-variant": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.1.tgz", + "integrity": "sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA==", + "dev": true, + "dependencies": { + "postcss": "^7.0.2" + } + }, + "node_modules/postcss-font-variant/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-font-variant/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-font-variant/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-gap-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz", + "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==", + "dev": true, + "dependencies": { + "postcss": "^7.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-gap-properties/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-gap-properties/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-gap-properties/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-image-set-function": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz", + "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==", + "dev": true, + "dependencies": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-image-set-function/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-image-set-function/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-image-set-function/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-import": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.0.2.tgz", + "integrity": "sha512-BJ2pVK4KhUyMcqjuKs9RijV5tatNzNa73e/32aBVE/ejYPe37iH+6vAu9WvqUkB5OAYgLHzbSvzHnorybJCm9g==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-initial": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.4.tgz", + "integrity": "sha512-3RLn6DIpMsK1l5UUy9jxQvoDeUN4gP939tDcKUHD/kM8SGSKbFAnvkpFpj3Bhtz3HGk1jWY5ZNWX6mPta5M9fg==", + "dev": true, + "dependencies": { + "postcss": "^7.0.2" + } + }, + "node_modules/postcss-initial/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-initial/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-initial/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-lab-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz", + "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==", + "dev": true, + "dependencies": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-lab-function/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-lab-function/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-lab-function/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-loader": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.1.0.tgz", + "integrity": "sha512-yA/cXBfACkthZNA2hQxOnaReVfQ6uLmvbEDQzNafpbK40URZJvP/28dL1DG174Gvz3ptkkHbbwDBCh+gXR94CA==", + "dev": true, + "dependencies": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.4", + "semver": "^7.3.5" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/postcss-logical": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz", + "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==", + "dev": true, + "dependencies": { + "postcss": "^7.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-logical/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-logical/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-logical/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-media-minmax": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz", + "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==", + "dev": true, + "dependencies": { + "postcss": "^7.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-media-minmax/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-media-minmax/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-media-minmax/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.0.2.tgz", + "integrity": "sha512-BMlg9AXSI5G9TBT0Lo/H3PfUy63P84rVz3BjCFE9e9Y9RXQZD3+h3YO1kgTNsNJy7bBc1YQp8DmSnwLIW5VPcw==", + "dev": true, + "dependencies": { + "css-color-names": "^1.0.1", + "postcss-value-parser": "^4.1.0", + "stylehacks": "^5.0.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-merge-rules": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.0.2.tgz", + "integrity": "sha512-5K+Md7S3GwBewfB4rjDeol6V/RZ8S+v4B66Zk2gChRqLTCC8yjnHQ601omj9TKftS19OPGqZ/XzoqpzNQQLwbg==", + "dev": true, + "dependencies": { + "browserslist": "^4.16.6", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^2.0.1", + "postcss-selector-parser": "^6.0.5", + "vendors": "^1.0.3" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.0.1.tgz", + "integrity": "sha512-7JS4qIsnqaxk+FXY1E8dHBDmraYFWmuL6cgt0T1SWGRO5bzJf8sUoelwa4P88LEWJZweHevAiDKxHlofuvtIoA==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.0.1.tgz", + "integrity": "sha512-odOwBFAIn2wIv+XYRpoN2hUV3pPQlgbJ10XeXPq8UY2N+9ZG42xu45lTn/g9zZ+d70NKSQD6EOi6UiCMu3FN7g==", + "dev": true, + "dependencies": { + "cssnano-utils": "^2.0.1", + "is-color-stop": "^1.1.0", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-params": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.0.1.tgz", + "integrity": "sha512-4RUC4k2A/Q9mGco1Z8ODc7h+A0z7L7X2ypO1B6V8057eVK6mZ6xwz6QN64nHuHLbqbclkX1wyzRnIrdZehTEHw==", + "dev": true, + "dependencies": { + "alphanum-sort": "^1.0.2", + "browserslist": "^4.16.0", + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0", + "uniqs": "^2.0.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.1.0.tgz", + "integrity": "sha512-NzGBXDa7aPsAcijXZeagnJBKBPMYLaJJzB8CQh6ncvyl2sIndLVWfbcDi0SBjRWk5VqEjXvf8tYwzoKf4Z07og==", + "dev": true, + "dependencies": { + "alphanum-sort": "^1.0.2", + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-nesting": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz", + "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==", + "dev": true, + "dependencies": { + "postcss": "^7.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-nesting/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-nesting/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-nesting/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.0.1.tgz", + "integrity": "sha512-6J40l6LNYnBdPSk+BHZ8SF+HAkS4q2twe5jnocgd+xWpz/mx/5Sa32m3W1AA8uE8XaXN+eg8trIlfu8V9x61eg==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.0.1.tgz", + "integrity": "sha512-uupdvWk88kLDXi5HEyI9IaAJTE3/Djbcrqq8YgjvAVuzgVuqIk3SuJWUisT2gaJbZm1H9g5k2w1xXilM3x8DjQ==", + "dev": true, + "dependencies": { + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.0.1.tgz", + "integrity": "sha512-rvzWAJai5xej9yWqlCb1OWLd9JjW2Ex2BCPzUJrbaXmtKtgfL8dBMOOMTX6TnvQMtjk3ei1Lswcs78qKO1Skrg==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.0.1.tgz", + "integrity": "sha512-syZ2itq0HTQjj4QtXZOeefomckiV5TaUO6ReIEabCh3wgDs4Mr01pkif0MeVwKyU/LHEkPJnpwFKRxqWA/7O3w==", + "dev": true, + "dependencies": { + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-string": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.0.1.tgz", + "integrity": "sha512-Ic8GaQ3jPMVl1OEn2U//2pm93AXUcF3wz+OriskdZ1AOuYV25OdgS7w9Xu2LO5cGyhHCgn8dMXh9bO7vi3i9pA==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.0.1.tgz", + "integrity": "sha512-cPcBdVN5OsWCNEo5hiXfLUnXfTGtSFiBU9SK8k7ii8UD7OLuznzgNRYkLZow11BkQiiqMcgPyh4ZqXEEUrtQ1Q==", + "dev": true, + "dependencies": { + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.0.1.tgz", + "integrity": "sha512-kAtYD6V3pK0beqrU90gpCQB7g6AOfP/2KIPCVBKJM2EheVsBQmx/Iof+9zR9NFKLAx4Pr9mDhogB27pmn354nA==", + "dev": true, + "dependencies": { + "browserslist": "^4.16.0", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-url": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.0.2.tgz", + "integrity": "sha512-k4jLTPUxREQ5bpajFQZpx8bCF2UrlqOTzP9kEqcEnOfwsRshWs2+oAFIHfDQB8GO2PaUaSE0NlTAYtbluZTlHQ==", + "dev": true, + "dependencies": { + "is-absolute-url": "^3.0.3", + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.0.1.tgz", + "integrity": "sha512-iPklmI5SBnRvwceb/XH568yyzK0qRVuAG+a1HFUsFRf11lEJTiQQa03a4RSCQvLKdcpX7XsI1Gen9LuLoqwiqA==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-ordered-values": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.0.2.tgz", + "integrity": "sha512-8AFYDSOYWebJYLyJi3fyjl6CqMEG/UVworjiyK1r573I56kb3e879sCJLGvR3merj+fAdPpVplXKQZv+ey6CgQ==", + "dev": true, + "dependencies": { + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-overflow-shorthand": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz", + "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==", + "dev": true, + "dependencies": { + "postcss": "^7.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-overflow-shorthand/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-overflow-shorthand/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-overflow-shorthand/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-page-break": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz", + "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==", + "dev": true, + "dependencies": { + "postcss": "^7.0.2" + } + }, + "node_modules/postcss-page-break/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-page-break/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-page-break/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-place": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz", + "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==", + "dev": true, + "dependencies": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-place/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-place/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-place/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-preset-env": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz", + "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==", + "dev": true, + "dependencies": { + "autoprefixer": "^9.6.1", + "browserslist": "^4.6.4", + "caniuse-lite": "^1.0.30000981", + "css-blank-pseudo": "^0.1.4", + "css-has-pseudo": "^0.10.0", + "css-prefers-color-scheme": "^3.1.1", + "cssdb": "^4.4.0", + "postcss": "^7.0.17", + "postcss-attribute-case-insensitive": "^4.0.1", + "postcss-color-functional-notation": "^2.0.1", + "postcss-color-gray": "^5.0.0", + "postcss-color-hex-alpha": "^5.0.3", + "postcss-color-mod-function": "^3.0.3", + "postcss-color-rebeccapurple": "^4.0.1", + "postcss-custom-media": "^7.0.8", + "postcss-custom-properties": "^8.0.11", + "postcss-custom-selectors": "^5.1.2", + "postcss-dir-pseudo-class": "^5.0.0", + "postcss-double-position-gradients": "^1.0.0", + "postcss-env-function": "^2.0.2", + "postcss-focus-visible": "^4.0.0", + "postcss-focus-within": "^3.0.0", + "postcss-font-variant": "^4.0.0", + "postcss-gap-properties": "^2.0.0", + "postcss-image-set-function": "^3.0.1", + "postcss-initial": "^3.0.0", + "postcss-lab-function": "^2.0.1", + "postcss-logical": "^3.0.0", + "postcss-media-minmax": "^4.0.0", + "postcss-nesting": "^7.0.0", + "postcss-overflow-shorthand": "^2.0.0", + "postcss-page-break": "^2.0.0", + "postcss-place": "^4.0.1", + "postcss-pseudo-class-any-link": "^6.0.0", + "postcss-replace-overflow-wrap": "^3.0.0", + "postcss-selector-matches": "^4.0.0", + "postcss-selector-not": "^4.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-preset-env/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-preset-env/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-preset-env/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-pseudo-class-any-link": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz", + "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==", + "dev": true, + "dependencies": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-pseudo-class-any-link/node_modules/cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-pseudo-class-any-link/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-pseudo-class-any-link/node_modules/postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "dev": true, + "dependencies": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-pseudo-class-any-link/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-pseudo-class-any-link/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.0.1.tgz", + "integrity": "sha512-zlCZPKLLTMAqA3ZWH57HlbCjkD55LX9dsRyxlls+wfuRfqCi5mSlZVan0heX5cHr154Dq9AfbH70LyhrSAezJw==", + "dev": true, + "dependencies": { + "browserslist": "^4.16.0", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.0.1.tgz", + "integrity": "sha512-a//FjoPeFkRuAguPscTVmRQUODP+f3ke2HqFNgGPwdYnpeC29RZdCBvGRGTsKpMURb/I3p6jdKoBQ2zI+9Q7kA==", + "dev": true, + "dependencies": { + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-replace-overflow-wrap": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz", + "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==", + "dev": true, + "dependencies": { + "postcss": "^7.0.2" + } + }, + "node_modules/postcss-replace-overflow-wrap/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-replace-overflow-wrap/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-replace-overflow-wrap/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-selector-matches": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz", + "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "postcss": "^7.0.2" + } + }, + "node_modules/postcss-selector-matches/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-selector-matches/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-selector-matches/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-selector-not": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.1.tgz", + "integrity": "sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "postcss": "^7.0.2" + } + }, + "node_modules/postcss-selector-not/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-selector-not/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-selector-not/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", + "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-svgo": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.0.2.tgz", + "integrity": "sha512-YzQuFLZu3U3aheizD+B1joQ94vzPfE6BNUcSYuceNxlVnKKsOtdo6hL9/zyC168Q8EwfLSgaDSalsUGa9f2C0A==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.1.0", + "svgo": "^2.3.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.0.1.tgz", + "integrity": "sha512-gwi1NhHV4FMmPn+qwBNuot1sG1t2OmacLQ/AX29lzyggnjd+MnVD5uqQmpXO3J17KGL2WAxQruj1qTd3H0gG/w==", + "dev": true, + "dependencies": { + "alphanum-sort": "^1.0.2", + "postcss-selector-parser": "^6.0.5", + "uniqs": "^2.0.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", + "dev": true + }, + "node_modules/postcss-values-parser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz", + "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==", + "dev": true, + "dependencies": { + "flatten": "^1.0.2", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=6.14.4" + } + }, + "node_modules/preferred-pm": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/preferred-pm/-/preferred-pm-3.0.3.tgz", + "integrity": "sha512-+wZgbxNES/KlJs9q40F/1sfOd/j7f1O9JaHcW5Dsn3aUUOZg3L2bjpVUcKV2jvtElYfoTuQiNeMfQJ4kwUAhCQ==", + "dev": true, + "dependencies": { + "find-up": "^5.0.0", + "find-yarn-workspace-root2": "1.2.16", + "path-exists": "^4.0.0", + "which-pm": "2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.1.tgz", + "integrity": "sha512-p+vNbgpLjif/+D+DwAZAbndtRrR0md0MwfmOVN9N+2RgyACMT+7tfaRnT+WDPkqnuVwleyuBIG2XBxKDme3hPA==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/prettier-plugin-java": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/prettier-plugin-java/-/prettier-plugin-java-1.2.0.tgz", + "integrity": "sha512-Ts2kwjQiUZlr0TvvL5IAHwlnlYoAXucEzJqu56dhG09Fq3YDU+N3FCcfbJAYpvTCC3cetXA1sXpiu+exu1zzFw==", + "dev": true, + "dependencies": { + "java-parser": "1.2.0", + "lodash": "4.17.21", + "prettier": "2.3.1" + } + }, + "node_modules/prettier-plugin-packagejson": { + "version": "2.2.11", + "resolved": "https://registry.npmjs.org/prettier-plugin-packagejson/-/prettier-plugin-packagejson-2.2.11.tgz", + "integrity": "sha512-oJCBCEkHIKScEv6qNQC47S39NXlevbzwvoJE3gflmBB8/3BEsC6ZRi+hwFVajw32b4tDI9hFXPIzmVd/T8Rm9w==", + "dev": true, + "dependencies": { + "sort-package-json": "1.50.0" + }, + "peerDependencies": { + "prettier": ">= 1.16.0" + } + }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/pretty-format/node_modules/@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/pretty-format/node_modules/@types/yargs": { + "version": "15.0.14", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz", + "integrity": "sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/pretty-format/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/pretty-format/node_modules/color-convert": { + "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" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/pretty-format/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 + }, + "node_modules/pretty-format/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" + } + }, + "node_modules/pretty-format/node_modules/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/proc-log": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-1.0.0.tgz", + "integrity": "sha512-aCk8AO51s+4JyuYGg3Q/a6gnrlDO09NpVWePtjp7xwphcoQ04x5WAfCyugcsbLooWcMJ87CLkD4+604IckEdhg==", + "dev": true + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", + "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==", + "dev": true, + "dependencies": { + "asap": "~2.0.6" + } + }, + "node_modules/promise-all-reject-late": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz", + "integrity": "sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/promise-call-limit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-call-limit/-/promise-call-limit-1.0.1.tgz", + "integrity": "sha512-3+hgaa19jzCGLuSCbieeRsu5C2joKfYn8pY6JAuXFRVfF4IO+L7UPpFWNTeWT9pM7uhskvbPPd/oEOktCn317Q==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prompts": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.1.tgz", + "integrity": "sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "node_modules/psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "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==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.3.tgz", + "integrity": "sha1-HPyyXBCpsrSDBT/zn138kjOQjP4=", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "deprecated": "The", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "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/randexp": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.5.3.tgz", + "integrity": "sha512-U+5l2KrcMNOUPYvazA3h5ekF80FHTUG+87SEAmHZmolh1M+i/WyTCxVzmi+tidIa1tM4BSe8g2Y/D3loWDjj+w==", + "dev": true, + "dependencies": { + "drange": "^1.0.2", + "ret": "^0.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", + "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", + "dev": true, + "dependencies": { + "bytes": "3.1.0", + "http-errors": "1.7.3", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-loader": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", + "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==", + "dev": true, + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/raw-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/raw-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/raw-loader/node_modules/schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/read-cmd-shim": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-2.0.0.tgz", + "integrity": "sha512-HJpV9bQpkl6KwjxlJcBoqu9Ba0PQg8TqSNIOrulGt54a0uup0HtevreFHzYzkm0lpnleRdNBzXznKrgxglEHQw==", + "dev": true + }, + "node_modules/read-package-json-fast": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.2.tgz", + "integrity": "sha512-5fyFUyO9B799foVk4n6ylcoAktG/FbE3jwRKxvwaeSrIunaoMc0u81dzXxjeAFKOce7O5KncdfwpGvvs6r5PsQ==", + "dev": true, + "dependencies": { + "json-parse-even-better-errors": "^2.3.0", + "npm-normalize-package-bin": "^1.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/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, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "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" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdir-scoped-modules": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz", + "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==", + "dev": true, + "dependencies": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", + "dev": true + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", + "dev": true + }, + "node_modules/regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-parser": { + "version": "2.2.11", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", + "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==", + "dev": true + }, + "node_modules/regexp-to-ast": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.5.0.tgz", + "integrity": "sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==", + "dev": true + }, + "node_modules/regexp.prototype.flags": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/regexpu-core": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", + "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", + "dev": true + }, + "node_modules/regjsparser": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz", + "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==", + "dev": true, + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "node_modules/repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dev": true, + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request/node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/request/node_modules/qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/request/node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/request/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "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=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + }, + "node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "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" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "deprecated": "https://github.com/lydell/resolve-url#deprecated", + "dev": true + }, + "node_modules/resolve-url-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz", + "integrity": "sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==", + "dev": true, + "dependencies": { + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^7.0.35", + "source-map": "0.6.1" + }, + "engines": { + "node": ">=8.9" + }, + "peerDependencies": { + "rework": "1.0.1", + "rework-visit": "1.0.0" + }, + "peerDependenciesMeta": { + "rework": { + "optional": true + }, + "rework-visit": { + "optional": true + } + } + }, + "node_modules/resolve-url-loader/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/resolve-url-loader/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-url-loader/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/resp-modifier": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/resp-modifier/-/resp-modifier-6.0.2.tgz", + "integrity": "sha1-sSTeXE+6/LpUH0j/pzlw9KpFa08=", + "dev": true, + "dependencies": { + "debug": "^2.2.0", + "minimatch": "^3.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/resp-modifier/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/resp-modifier/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ret": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.2.2.tgz", + "integrity": "sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", + "dev": true + }, + "node_modules/rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", + "dev": true + }, + "node_modules/rimraf": { + "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" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "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": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rx": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", + "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=", + "dev": true + }, + "node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/rxjs/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/safe-regex/node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/sass": { + "version": "1.35.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.35.1.tgz", + "integrity": "sha512-oCisuQJstxMcacOPmxLNiLlj4cUyN2+8xJnG7VanRoh2GOLr9RqkvI4AxA4a6LHVg/rsu+PmxXeGhrdSF9jCiQ==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/sass-loader": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.1.0.tgz", + "integrity": "sha512-FVJZ9kxVRYNZTIe2xhw93n3xJNYZADr+q69/s98l9nTCrWASo+DR2Ot0s5xTKQDDEosUkatsGeHxcH4QBp5bSg==", + "dev": true, + "dependencies": { + "klona": "^2.0.4", + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "fibers": ">= 3.1.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0", + "sass": "^1.3.0", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/sax": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", + "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=", + "dev": true + }, + "node_modules/saxes": { + "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" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/schema-utils/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/schema-utils/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/scoped-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/scoped-regex/-/scoped-regex-2.1.0.tgz", + "integrity": "sha512-g3WxHrqSWCZHGHlSrF51VXFdjImhwvH8ZO/pryFH56Qi0cDsZfylQa/t0jCzVQFNbNvM00HfHjkDPEuarKDSWQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "node_modules/selfsigned": { + "version": "1.10.11", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz", + "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==", + "dev": true, + "dependencies": { + "node-forge": "^0.10.0" + } + }, + "node_modules/semver": { + "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" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "dev": true + }, + "node_modules/semver-regex": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-3.1.2.tgz", + "integrity": "sha512-bXWyL6EAKOJa81XG1OZ/Yyuq+oT0b2YLlxx7c+mrdYPaPbnj6WgVULXhinMIeZGufuUBu/eVRqXEhiv4imfwxA==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/send/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "node_modules/send/node_modules/mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "dev": true, + "bin": { + "mime": "cli.js" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/send/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/send/node_modules/statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/server-destroy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", + "integrity": "sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0=", + "dev": true + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "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" + } + }, + "node_modules/shelljs": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", + "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", + "dev": true, + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "dev": true, + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true + }, + "node_modules/sirv": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.12.tgz", + "integrity": "sha512-+jQoCxndz7L2tqQL4ZyzfDhky0W/4ZJip3XoOuxyQWnAwMxindLl3Xv1qT4x1YX/re0leShvTm8Uk0kQspGhBg==", + "dev": true, + "dependencies": { + "@polka/url": "^1.0.0-next.15", + "mime": "^2.3.1", + "totalist": "^1.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sirv/node_modules/mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "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" + } + }, + "node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/color-convert": { + "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" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/slice-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==", + "dev": true + }, + "node_modules/smart-buffer": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", + "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==", + "dev": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/snapdragon/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/socket.io": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.4.0.tgz", + "integrity": "sha512-9UPJ1UTvKayuQfVv2IQ3k7tCQC/fboDyIK62i99dAQIyHKaBsNdTpwHLgKJ6guRWxRtC9H+138UwpaGuQO9uWQ==", + "dev": true, + "dependencies": { + "debug": "~4.1.0", + "engine.io": "~3.5.0", + "has-binary2": "~1.0.2", + "socket.io-adapter": "~1.1.0", + "socket.io-client": "2.4.0", + "socket.io-parser": "~3.4.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", + "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==", + "dev": true + }, + "node_modules/socket.io-client": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.4.0.tgz", + "integrity": "sha512-M6xhnKQHuuZd4Ba9vltCLT9oa+YvTsP8j9NcEiLElfIg8KeYPyhWOes6x4t+LTAC8enQbE/995AdTem2uNyKKQ==", + "dev": true, + "dependencies": { + "backo2": "1.0.2", + "component-bind": "1.0.0", + "component-emitter": "~1.3.0", + "debug": "~3.1.0", + "engine.io-client": "~3.5.0", + "has-binary2": "~1.0.2", + "indexof": "0.0.1", + "parseqs": "0.0.6", + "parseuri": "0.0.6", + "socket.io-parser": "~3.3.0", + "to-array": "0.1.4" + } + }, + "node_modules/socket.io-client/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/socket.io-client/node_modules/isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + }, + "node_modules/socket.io-client/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/socket.io-client/node_modules/socket.io-parser": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.2.tgz", + "integrity": "sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg==", + "dev": true, + "dependencies": { + "component-emitter": "~1.3.0", + "debug": "~3.1.0", + "isarray": "2.0.1" + } + }, + "node_modules/socket.io-parser": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz", + "integrity": "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==", + "dev": true, + "dependencies": { + "component-emitter": "1.2.1", + "debug": "~4.1.0", + "isarray": "2.0.1" + } + }, + "node_modules/socket.io-parser/node_modules/component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "node_modules/socket.io-parser/node_modules/debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/socket.io-parser/node_modules/isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + }, + "node_modules/socket.io/node_modules/debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/sockjs": { + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", + "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", + "dev": true, + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^3.4.0", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/sockjs-client": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.0.tgz", + "integrity": "sha512-8Dt3BDi4FYNrCFGTL/HtwVzkARrENdwOUf1ZoW/9p3M8lZdFT35jVdrHza+qgxuG9H3/shR4cuX/X9umUrjP8Q==", + "dependencies": { + "debug": "^3.2.6", + "eventsource": "^1.0.7", + "faye-websocket": "^0.11.3", + "inherits": "^2.0.4", + "json3": "^3.3.3", + "url-parse": "^1.4.7" + } + }, + "node_modules/sockjs-client/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/sockjs/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/socks": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.1.tgz", + "integrity": "sha512-kLQ9N5ucj8uIcxrDwjm0Jsqk06xdpBjGNQtpXy4Q8/QY2k+fY7nZH8CARy+hkbG+SGAovmzzuauCpBlb8FrnBA==", + "dev": true, + "dependencies": { + "ip": "^1.1.5", + "smart-buffer": "^4.1.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz", + "integrity": "sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==", + "dev": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "4", + "socks": "^2.3.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/sort-object-keys": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sort-object-keys/-/sort-object-keys-1.1.3.tgz", + "integrity": "sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==", + "dev": true + }, + "node_modules/sort-package-json": { + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/sort-package-json/-/sort-package-json-1.50.0.tgz", + "integrity": "sha512-qZpqhMU9XTntebgAgc4hv/D6Fzhh7kFnwvV6a7+q8y8J5JoaDqPYQnvXPf7BBqG95tdE8X6JVNo7/jDzcbdfUg==", + "dev": true, + "dependencies": { + "detect-indent": "^6.0.0", + "detect-newline": "3.1.0", + "git-hooks-list": "1.0.3", + "globby": "10.0.0", + "is-plain-obj": "2.1.0", + "sort-object-keys": "^1.1.3" + }, + "bin": { + "sort-package-json": "cli.js" + } + }, + "node_modules/sort-package-json/node_modules/globby": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.0.tgz", + "integrity": "sha512-3LifW9M4joGZasyYPz2A1U74zbC/45fvpXUvO/9KbSa+VV0aGZarWkfdgKyR9sExNP0t0x0ss/UMJpNpcaTspw==", + "dev": true, + "dependencies": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sort-package-json/node_modules/ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "node_modules/source-map": { + "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" + } + }, + "node_modules/source-map-js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", + "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.0.tgz", + "integrity": "sha512-GKGWqWvYr04M7tn8dryIWvb0s8YM41z82iQv01yBtIylgxax0CwvSy6gc2Y02iuXwEfGWRlMicH0nvms9UZphw==", + "dev": true, + "dependencies": { + "abab": "^2.0.5", + "iconv-lite": "^0.6.2", + "source-map-js": "^0.6.2" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/source-map-loader/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", + "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", + "dev": true, + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "dev": true + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "node_modules/spawn-command": { + "version": "0.0.2-1", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", + "integrity": "sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=", + "dev": true + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz", + "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==", + "dev": true + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "node_modules/sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "dev": true, + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/stream-throttle": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz", + "integrity": "sha1-rdV8jXzHOoFjDTHNVdOWHPr7qcM=", + "dev": true, + "dependencies": { + "commander": "^2.2.0", + "limiter": "^1.0.5" + }, + "bin": { + "throttleproxy": "bin/throttleproxy.js" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/stream-throttle/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/streamfilter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/streamfilter/-/streamfilter-3.0.0.tgz", + "integrity": "sha512-kvKNfXCmUyC8lAXSSHCIXBUlo/lhsLcCU/OmzACZYpRUdtKIH68xYhm/+HI15jFJYtNJGYtCgn2wmIiExY1VwA==", + "dev": true, + "dependencies": { + "readable-stream": "^3.0.6" + }, + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "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/string-argv": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", + "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "dev": true, + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-length": { + "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" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dev": true, + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/stringify-object/node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom-buf": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-buf/-/strip-bom-buf-1.0.0.tgz", + "integrity": "sha1-HLRar1dTD0yvhsf3UXnSyaUd1XI=", + "dev": true, + "dependencies": { + "is-utf8": "^0.2.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-bom-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz", + "integrity": "sha1-+H217yYT9paKpUWr/h7HKLaoKco=", + "dev": true, + "dependencies": { + "first-chunk-stream": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-bom-stream/node_modules/strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "dependencies": { + "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/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==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-2.0.0.tgz", + "integrity": "sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ==", + "dev": true, + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/style-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/style-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/style-loader/node_modules/schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/stylehacks": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.0.1.tgz", + "integrity": "sha512-Es0rVnHIqbWzveU1b24kbw92HsebBepxfcqe5iix7t9j0PQqhs0IxXVXv0pY2Bxa08CgMkzD6OWql7kbGOuEdA==", + "dev": true, + "dependencies": { + "browserslist": "^4.16.0", + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/stylus": { + "version": "0.54.8", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.8.tgz", + "integrity": "sha512-vr54Or4BZ7pJafo2mpf0ZcwA74rpuYCZbxrHBsH8kbcXOwSfvBFwsRfpGO5OD5fhG5HDCFW737PKaawI7OqEAg==", + "dev": true, + "dependencies": { + "css-parse": "~2.0.0", + "debug": "~3.1.0", + "glob": "^7.1.6", + "mkdirp": "~1.0.4", + "safer-buffer": "^2.1.2", + "sax": "~1.2.4", + "semver": "^6.3.0", + "source-map": "^0.7.3" + }, + "bin": { + "stylus": "bin/stylus" + }, + "engines": { + "node": "*" + } + }, + "node_modules/stylus-loader": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-6.1.0.tgz", + "integrity": "sha512-qKO34QCsOtSJrXxQQmXsPeaVHh6hMumBAFIoJTcsSr2VzrA6o/CW9HCGR8spCjzJhN8oKQHdj/Ytx0wwXyElkw==", + "dev": true, + "dependencies": { + "fast-glob": "^3.2.5", + "klona": "^2.0.4", + "normalize-path": "^3.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "stylus": ">=0.52.4", + "webpack": "^5.0.0" + } + }, + "node_modules/stylus/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/stylus/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/stylus/node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "node_modules/stylus/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-hyperlinks": { + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks/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" + } + }, + "node_modules/supports-hyperlinks/node_modules/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/svgo": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.3.1.tgz", + "integrity": "sha512-riDDIQgXpEnn0BEl9Gvhh1LNLIyiusSpt64IR8upJu7MwxnzetmF/Y57pXQD2NMX2lVyMRzXt5f2M5rO4wG7Dw==", + "dev": true, + "dependencies": { + "@trysound/sax": "0.1.1", + "chalk": "^4.1.0", + "commander": "^7.1.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.2", + "csso": "^4.2.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/svgo/node_modules/ansi-styles": { + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/svgo/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/svgo/node_modules/color-convert": { + "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" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/svgo/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 + }, + "node_modules/svgo/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" + } + }, + "node_modules/svgo/node_modules/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/swagger-ui-dist": { + "version": "3.50.0", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-3.50.0.tgz", + "integrity": "sha512-BklniOBPlvZ6M9oGkhUwOf5HvxhkHBIycXN3ndju8WlLmi1xfMSdOA2AR6pNswlwURzsZUe1rh80aUyjnpD+Zw==" + }, + "node_modules/symbol-observable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", + "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "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==", + "dev": true + }, + "node_modules/table": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", + "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", + "dev": true, + "dependencies": { + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ansi-styles": { + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/table/node_modules/color-convert": { + "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" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/table/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 + }, + "node_modules/table/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/tapable": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz", + "integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.0.tgz", + "integrity": "sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/terminal-link": { + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.7.0.tgz", + "integrity": "sha512-HP5/9hp2UaZt5fYkuhNBR8YyRcT8juw8+uFbAme53iN9hblvKnLUTKkmwJG6ocWpIKf8UK4DoeWG4ty0J6S6/g==", + "dev": true, + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.19" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.1.3.tgz", + "integrity": "sha512-cxGbMqr6+A2hrIB5ehFIF+F/iST5ZOxvOmy9zih9ySbP1C2oEWQSOUS+2SNBTjzx5xLKO4xnod9eywdfq1Nb9A==", + "dev": true, + "dependencies": { + "jest-worker": "^27.0.2", + "p-limit": "^3.1.0", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1", + "source-map": "^0.6.1", + "terser": "^5.7.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser-webpack-plugin/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/test-exclude": { + "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", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", + "dev": true + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "node_modules/textextensions": { + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-5.12.0.tgz", + "integrity": "sha512-IYogUDaP65IXboCiPPC0jTLLBzYlhhw2Y4b0a2trPgbHNGGGEfuHE6tds+yDcCf4mpNDaGISFzwSSezcXt+d6w==", + "dev": true, + "engines": { + "node": ">=0.8" + }, + "funding": { + "url": "https://bevry.me/fund" + } + }, + "node_modules/tfunk": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tfunk/-/tfunk-4.0.0.tgz", + "integrity": "sha512-eJQ0dGfDIzWNiFNYFVjJ+Ezl/GmwHaFTBTjrtqNPW0S7cuVDBrZrmzUz6VkMeCR4DZFqhd4YtLwsw3i2wYHswQ==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "dlv": "^1.1.3" + } + }, + "node_modules/tfunk/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tfunk/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tfunk/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tfunk/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tfunk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "dev": true, + "dependencies": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/then-request/node_modules/@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==", + "dev": true + }, + "node_modules/then-request/node_modules/form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/then-request/node_modules/qs": { + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", + "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/throat": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", + "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==", + "dev": true + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "node_modules/timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", + "dev": true + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "dev": true + }, + "node_modules/to-absolute-glob": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", + "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", + "dev": true, + "dependencies": { + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "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" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/totalist": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", + "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "dev": true, + "dependencies": { + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/treeverse": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/treeverse/-/treeverse-1.0.4.tgz", + "integrity": "sha512-whw60l7r+8ZU8Tu/Uc2yxtc4ZTZbR/PF3u1IPNKGQ6p8EICLb3Z2lAgoqw9bqYd8IkgnsaOcLzYHFckjqNsf0g==", + "dev": true + }, + "node_modules/triple-beam": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", + "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==", + "dev": true + }, + "node_modules/ts-jest": { + "version": "27.0.3", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.0.3.tgz", + "integrity": "sha512-U5rdMjnYam9Ucw+h0QvtNDbc5+88nxt7tbIvqaZUhFrfG4+SkWhMXjejCLVGcpILTPuV+H3W/GZDZrnZFpPeXw==", + "dev": true, + "dependencies": { + "bs-logger": "0.x", + "buffer-from": "1.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^27.0.0", + "json5": "2.x", + "lodash": "4.x", + "make-error": "1.x", + "mkdirp": "1.x", + "semver": "7.x", + "yargs-parser": "20.x" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "jest": "^27.0.0", + "typescript": ">=3.8 <5.0" + } + }, + "node_modules/ts-node": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.0.0.tgz", + "integrity": "sha512-ROWeOIUvfFbPZkoDis0L/55Fk+6gFQNZwwKPLinacRl6tsxstTF1DbAcLKkovwnpKMVvOMHP1TIbnwXwtLg1gg==", + "dev": true, + "dependencies": { + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.17", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@swc/core": ">=1.2.45", + "@swc/wasm": ">=1.2.45", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/tsconfig-paths": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", + "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/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==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/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==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "node_modules/typedarray-to-buffer": { + "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" + } + }, + "node_modules/typescript": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz", + "integrity": "sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/ua-parser-js": { + "version": "0.7.28", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.28.tgz", + "integrity": "sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + } + ], + "engines": { + "node": "*" + } + }, + "node_modules/unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dev": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/union-value/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "node_modules/uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", + "dev": true + }, + "node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/universal-user-agent": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", + "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", + "dev": true + }, + "node_modules/universalify": { + "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" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true, + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "deprecated": "Please see https://github.com/lydell/urix#deprecated", + "dev": true + }, + "node_modules/url": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", + "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", + "dev": true, + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz", + "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "node_modules/v8-to-istanbul": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.0.0.tgz", + "integrity": "sha512-LkmXi8UUNxnCC+JlH7/fsfsKr5AU110l+SYGJimWNkWhxbN5EyeOtm1MJ0hhvqMMOhGwBj1Fp70Yv9i+hX0QAg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validate-npm-package-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", + "dev": true, + "dependencies": { + "builtins": "^1.0.3" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/vinyl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", + "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", + "dev": true, + "dependencies": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-file": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/vinyl-file/-/vinyl-file-3.0.0.tgz", + "integrity": "sha1-sQTZ5ECf+jJfqt1SBkLQo7SIs2U=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "pify": "^2.3.0", + "strip-bom-buf": "^1.0.0", + "strip-bom-stream": "^2.0.0", + "vinyl": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/vinyl/node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/w3c-hr-time": { + "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" + } + }, + "node_modules/w3c-xmlserializer": { + "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" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/wait-on": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-5.3.0.tgz", + "integrity": "sha512-DwrHrnTK+/0QFaB9a8Ol5Lna3k7WvUR4jzSKmz0YaPBpuN2sACyiPVKVfj6ejnjcajAcvn3wlbTyMIn9AZouOg==", + "dev": true, + "dependencies": { + "axios": "^0.21.1", + "joi": "^17.3.0", + "lodash": "^4.17.21", + "minimist": "^1.2.5", + "rxjs": "^6.6.3" + }, + "bin": { + "wait-on": "bin/wait-on" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/walk-up-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-1.0.0.tgz", + "integrity": "sha512-hwj/qMDUEjCU5h0xr90KGCf0tg0/LgJbmOWgrWKYlcJZM7XvquvUJZ0G/HMGr7F7OQMOUuPHWP9JpriinkAlkg==", + "dev": true + }, + "node_modules/walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true, + "dependencies": { + "makeerror": "1.0.x" + } + }, + "node_modules/watchpack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.2.0.tgz", + "integrity": "sha512-up4YAn/XHgZHIxFBVCdlMiWDj6WaLKpwVeGQk2I5thdYxF/KmF0aaz6TfJZ/hfl1h/XlcDr7k1KH7ThDagpFaA==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/webidl-conversions": { + "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" + } + }, + "node_modules/webpack": { + "version": "5.41.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.41.1.tgz", + "integrity": "sha512-AJZIIsqJ/MVTmegEq9Tlw5mk5EHdGiJbDdz9qP15vmUH+oxI1FdWcL0E9EO8K/zKaRPWqEs7G/OPxq1P61u5Ug==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.0", + "@types/estree": "^0.0.48", + "@webassemblyjs/ast": "1.11.0", + "@webassemblyjs/wasm-edit": "1.11.0", + "@webassemblyjs/wasm-parser": "1.11.0", + "acorn": "^8.2.1", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.8.0", + "es-module-lexer": "^0.6.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.4", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.0.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.2.0", + "webpack-sources": "^2.3.0" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-bundle-analyzer": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.4.2.tgz", + "integrity": "sha512-PIagMYhlEzFfhMYOzs5gFT55DkUdkyrJi/SxJp8EF3YMWhS+T9vvs2EoTetpk5qb6VsCq02eXTlRDOydRhDFAQ==", + "dev": true, + "dependencies": { + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "chalk": "^4.1.0", + "commander": "^6.2.0", + "gzip-size": "^6.0.0", + "lodash": "^4.17.20", + "opener": "^1.5.2", + "sirv": "^1.0.7", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/acorn": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.1.tgz", + "integrity": "sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/acorn-walk": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.1.1.tgz", + "integrity": "sha512-FbJdceMlPHEAWJOILDk1fXD8lnTlEIWFkqtfk+MvmL5q/qlHfN7GEHcsFZWt/Tea9jRNPWUZG4G976nqAAmU9w==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/ansi-styles": { + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/color-convert": { + "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" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/webpack-bundle-analyzer/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 + }, + "node_modules/webpack-bundle-analyzer/node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/webpack-bundle-analyzer/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" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.0.0.tgz", + "integrity": "sha512-9zng2Z60pm6A98YoRcA0wSxw1EYn7B7y5owX/Tckyt9KGyULTkLtiavjaXlWqOMkM0YtqGgL3PvMOFgyFLq8vw==", + "dev": true, + "dependencies": { + "colorette": "^1.2.2", + "mem": "^8.1.1", + "memfs": "^3.2.2", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/webpack-dev-middleware/node_modules/mem": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/mem/-/mem-8.1.1.tgz", + "integrity": "sha512-qFCFUDs7U3b8mBDPyz5EToEKoAkgCzqquIgi9nkkR9bixxOVOre+09lbuH7+9Kn2NFpm56M3GUWVbU2hQgdACA==", + "dev": true, + "dependencies": { + "map-age-cleaner": "^0.1.3", + "mimic-fn": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/mem?sponsor=1" + } + }, + "node_modules/webpack-dev-middleware/node_modules/schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server": { + "version": "3.11.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz", + "integrity": "sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ==", + "dev": true, + "dependencies": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.3.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.8", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.26", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.8", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "^0.3.21", + "sockjs-client": "^1.5.0", + "spdy": "^4.0.2", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "^13.3.2" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 6.11.5" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-server/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/webpack-dev-server/node_modules/anymatch/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.", + "dev": true, + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/webpack-dev-server/node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/webpack-dev-server/node_modules/cliui/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/cliui/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/webpack-dev-server/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/webpack-dev-server/node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "dependencies": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/webpack-dev-server/node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/webpack-dev-server/node_modules/opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dev": true, + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/p-limit": { + "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" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webpack-dev-server/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/webpack-dev-server/node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/webpack-dev-server/node_modules/resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "dependencies": { + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/webpack-dev-server/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/webpack-dev-server/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/webpack-dev-server/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/string-width/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/string-width/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/webpack-dev-server/node_modules/webpack-dev-middleware": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", + "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", + "dev": true, + "dependencies": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-server/node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "dev": true, + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/webpack-dev-server/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "dependencies": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "node_modules/webpack-dev-server/node_modules/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "dependencies": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/webpack-log/node_modules/ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-log/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-notifier": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/webpack-notifier/-/webpack-notifier-1.13.0.tgz", + "integrity": "sha512-QLk6l/TZKGhyN6Hd1zobaiYno7S9YPX3wH86+YOSufHes77SegGhnGdj+4vrLDFK5A4ZKoQD5GRXXFnM0h0N8A==", + "dev": true, + "dependencies": { + "node-notifier": "^9.0.0", + "strip-ansi": "^6.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "node_modules/webpack-sources/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-subresource-integrity": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.5.2.tgz", + "integrity": "sha512-GBWYBoyalbo5YClwWop9qe6Zclp8CIXYGIz12OPclJhIrSplDxs1Ls1JDMH8xBPPrg1T6ISaTW9Y6zOrwEiAzw==", + "dev": true, + "dependencies": { + "webpack-sources": "^1.3.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "html-webpack-plugin": ">= 2.21.0 < 5", + "webpack": ">= 1.12.11 < 6" + }, + "peerDependenciesMeta": { + "html-webpack-plugin": { + "optional": true + } + } + }, + "node_modules/webpack/node_modules/@types/estree": { + "version": "0.0.48", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.48.tgz", + "integrity": "sha512-LfZwXoGUDo0C3me81HXgkBg5CTQYb6xzEl+fNmbO4JdRiSKQ8A0GD1OBBvKAIsbCUgoyAty7m99GqqMQe784ew==", + "dev": true + }, + "node_modules/webpack/node_modules/acorn": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.1.tgz", + "integrity": "sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/webpack/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack/node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/webpack/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/webpack-sources": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.0.tgz", + "integrity": "sha512-WyOdtwSvOML1kbgtXbTDnEW0jkJ7hZr/bDByIwszhWd/4XX1A3XMkrbFMsuH4+/MfLlZCUzlAdg4r7jaGKEIgQ==", + "dev": true, + "dependencies": { + "source-list-map": "^2.0.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/webstomp-client": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/webstomp-client/-/webstomp-client-1.2.6.tgz", + "integrity": "sha512-9HajO6Ki2ViEGIusLZtjM2lcO2VaQUvtXhLQQ4Cm543RLjfTCEgI3sFaiXts3TvfZgrtY/vI/+qUkm2qWD/NVg==" + }, + "node_modules/whatwg-encoding": { + "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" + } + }, + "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==", + "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", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/which": { + "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" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "node_modules/which-pm": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-pm/-/which-pm-2.0.0.tgz", + "integrity": "sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==", + "dev": true, + "dependencies": { + "load-yaml-file": "^0.2.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8.15" + } + }, + "node_modules/which-pm-runs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", + "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=", + "dev": true + }, + "node_modules/wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "dependencies": { + "string-width": "^1.0.2 || 2" + } + }, + "node_modules/wide-align/node_modules/ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/wide-align/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/wide-align/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/wide-align/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true + }, + "node_modules/windows-release": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.3.3.tgz", + "integrity": "sha512-OSOGH1QYiW5yVor9TtmXKQvt2vjQqbYS+DqmsZw+r7xDwLXEeT3JGW0ZppFmHx4diyXmxt238KFR3N9jzevBRg==", + "dev": true, + "dependencies": { + "execa": "^1.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/windows-release/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/windows-release/node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/windows-release/node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/windows-release/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/windows-release/node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/windows-release/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/windows-release/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/windows-release/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/windows-release/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/windows-release/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/winston": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.3.3.tgz", + "integrity": "sha512-oEXTISQnC8VlSAKf1KYSSd7J6IWuRPQqDdo8eoRNaYKLvwSb5+79Z3Yi1lrl6KDpU6/VWaxpakDAtb1oQ4n9aw==", + "dev": true, + "dependencies": { + "@dabh/diagnostics": "^2.0.2", + "async": "^3.1.0", + "is-stream": "^2.0.0", + "logform": "^2.2.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.4.0" + }, + "engines": { + "node": ">= 6.4.0" + } + }, + "node_modules/winston-transport": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.4.0.tgz", + "integrity": "sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw==", + "dev": true, + "dependencies": { + "readable-stream": "^2.3.7", + "triple-beam": "^1.2.0" + }, + "engines": { + "node": ">= 6.4.0" + } + }, + "node_modules/winston-transport/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/winston-transport/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/winston/node_modules/async": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", + "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==", + "dev": true + }, + "node_modules/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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "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==" + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "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", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.1.tgz", + "integrity": "sha512-2c6faOUH/nhoQN6abwMloF7Iyl0ZS2E9HGtsiLrWn0zOOMWlhtDmdf/uihDt6jnuCxgtwGBNy6Onsoy2s2O2Ow==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=", + "dev": true + }, + "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==", + "dev": true + }, + "node_modules/xml2js": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "dev": true, + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~9.0.1" + } + }, + "node_modules/xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "node_modules/xmlhttprequest-ssl": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.3.tgz", + "integrity": "sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/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==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", + "dev": true + }, + "node_modules/yeoman-environment": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/yeoman-environment/-/yeoman-environment-3.4.1.tgz", + "integrity": "sha512-Bu3kN5sTOyAcbO/cKEQf6KOxsLta9oRF59saLOKnt3OQM+hXapnWaAHcrat3dygd6l34KjxwM5AMJp09TDa8yw==", + "dev": true, + "dependencies": { + "@npmcli/arborist": "^2.2.2", + "are-we-there-yet": "^1.1.5", + "arrify": "^2.0.1", + "binaryextensions": "^4.15.0", + "chalk": "^4.1.0", + "cli-table": "^0.3.1", + "commander": "7.1.0", + "dateformat": "^4.5.0", + "debug": "^4.1.1", + "diff": "^5.0.0", + "error": "^10.4.0", + "escape-string-regexp": "^4.0.0", + "execa": "^5.0.0", + "find-up": "^5.0.0", + "globby": "^11.0.1", + "grouped-queue": "^2.0.0", + "inquirer": "^8.0.0", + "is-scoped": "^2.1.0", + "lodash": "^4.17.10", + "log-symbols": "^4.0.0", + "mem-fs": "^1.2.0 || ^2.0.0", + "mem-fs-editor": "^8.1.2 || ^9.0.0", + "minimatch": "^3.0.4", + "npmlog": "^4.1.2", + "p-queue": "^6.6.2", + "pacote": "^11.2.6", + "preferred-pm": "^3.0.3", + "pretty-bytes": "^5.3.0", + "semver": "^7.1.3", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0", + "text-table": "^0.2.0", + "textextensions": "^5.12.0", + "untildify": "^4.0.0" + }, + "bin": { + "yoe": "cli/index.js" + }, + "engines": { + "node": ">=12.10.0" + }, + "peerDependencies": { + "mem-fs": "^1.2.0 || ^2.0.0", + "mem-fs-editor": "^8.1.2 || ^9.0.0" + } + }, + "node_modules/yeoman-environment/node_modules/ansi-styles": { + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/yeoman-environment/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/yeoman-environment/node_modules/color-convert": { + "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" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/yeoman-environment/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 + }, + "node_modules/yeoman-environment/node_modules/commander": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.1.0.tgz", + "integrity": "sha512-pRxBna3MJe6HKnBGsDyMv8ETbptw3axEdYHoqNh7gu5oDcew8fs0xnivZGm06Ogk8zGAJ9VX+OPEr2GXEQK4dg==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/yeoman-environment/node_modules/diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/yeoman-environment/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yeoman-environment/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" + } + }, + "node_modules/yeoman-environment/node_modules/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yeoman-generator": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/yeoman-generator/-/yeoman-generator-5.3.0.tgz", + "integrity": "sha512-OE+qDs/c5V3HP29hUlyUO7ejpLSJX93LZ+KFRmyYmPMvcbnsdHynF6LyOh0vLPuqsi/x50MxZfob/EIQ06E4EQ==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "dargs": "^7.0.0", + "debug": "^4.1.1", + "execa": "^4.1.0", + "github-username": "^6.0.0", + "lodash": "^4.17.11", + "minimist": "^1.2.5", + "read-pkg-up": "^7.0.1", + "run-async": "^2.0.0", + "semver": "^7.2.1", + "shelljs": "^0.8.4", + "text-table": "^0.2.0" + }, + "engines": { + "node": ">=12.10.0" + }, + "peerDependencies": { + "yeoman-environment": "^3.2.0" + }, + "peerDependenciesMeta": { + "yeoman-environment": { + "optional": true + } + } + }, + "node_modules/yeoman-generator/node_modules/ansi-styles": { + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/yeoman-generator/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/yeoman-generator/node_modules/color-convert": { + "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" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/yeoman-generator/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 + }, + "node_modules/yeoman-generator/node_modules/execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/yeoman-generator/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yeoman-generator/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" + } + }, + "node_modules/yeoman-generator/node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true, + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/yeoman-generator/node_modules/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zone.js": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.4.tgz", + "integrity": "sha512-DDh2Ab+A/B+9mJyajPjHFPWfYU1H+pdun4wnnk0OcQTNjem1XQSZ2CDW+rfZEUDjv5M19SBqAkjZi0x5wuB5Qw==", + "dependencies": { + "tslib": "^2.0.0" + } + } + }, + "dependencies": { + "@angular-builders/custom-webpack": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/@angular-builders/custom-webpack/-/custom-webpack-12.1.0.tgz", + "integrity": "sha512-7tq0q4PN0L3rTTRxWz5f9xWGt2duYCutDhuRc6Rac6yG13SiTirawqUg2ROx0T3qFjo2G8IWzAageIEzHjl5DA==", + "dev": true, + "requires": { + "@angular-devkit/architect": ">=0.1200.0 < 0.1300.0", + "@angular-devkit/build-angular": "^12.0.0", + "@angular-devkit/core": "^12.0.0", + "lodash": "^4.17.15", + "ts-node": "^10.0.0", + "tsconfig-paths": "^3.9.0", + "webpack-merge": "^5.7.3" + } + }, + "@angular-builders/jest": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/@angular-builders/jest/-/jest-12.1.0.tgz", + "integrity": "sha512-QdMfC2Xk6jD84gcCPdzgpfRTBfnp7QI0JnKEFmKTeTPyYSPWXCLm91lIv0m3JU7bS3NPHDq+VXupRqOXi96tZQ==", + "dev": true, + "requires": { + "@angular-devkit/architect": ">=0.1200.0 < 0.1300.0", + "@angular-devkit/core": "^12.0.0", + "jest-preset-angular": "^9.0.1", + "lodash": "^4.17.15" + } + }, + "@angular-devkit/architect": { + "version": "0.1201.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1201.1.tgz", + "integrity": "sha512-n7ycxrIPbtnV7q8PH5Uvs8Jd++u6hWUiB+8EUxznSfdHGA+fE7TTnJTkc27LoMlYZAImc/Axp/uyYZ6Awt72ZQ==", + "dev": true, + "requires": { + "@angular-devkit/core": "12.1.1", + "rxjs": "6.6.7" + } + }, + "@angular-devkit/build-angular": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-12.1.1.tgz", + "integrity": "sha512-mJjpPuJlS55gwi/W2g8CIMjPVtUjKCKJdjn34eeYk1Kgw9JYRIsiEivx1hcGyLmiSTF8gRGvW1TEyO+k55/QqA==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.1201.1", + "@angular-devkit/build-optimizer": "0.1201.1", + "@angular-devkit/build-webpack": "0.1201.1", + "@angular-devkit/core": "12.1.1", + "@babel/core": "7.14.6", + "@babel/generator": "7.14.5", + "@babel/helper-annotate-as-pure": "7.14.5", + "@babel/plugin-proposal-async-generator-functions": "7.14.7", + "@babel/plugin-transform-async-to-generator": "7.14.5", + "@babel/plugin-transform-runtime": "7.14.5", + "@babel/preset-env": "7.14.7", + "@babel/runtime": "7.14.6", + "@babel/template": "7.14.5", + "@discoveryjs/json-ext": "0.5.3", + "@jsdevtools/coverage-istanbul-loader": "3.0.5", + "@ngtools/webpack": "12.1.1", + "ansi-colors": "4.1.1", + "babel-loader": "8.2.2", + "browserslist": "^4.9.1", + "cacache": "15.2.0", + "caniuse-lite": "^1.0.30001032", + "circular-dependency-plugin": "5.2.2", + "copy-webpack-plugin": "9.0.0", + "core-js": "3.15.1", + "critters": "0.0.10", + "css-loader": "5.2.6", + "css-minimizer-webpack-plugin": "3.0.1", + "find-cache-dir": "3.3.1", + "glob": "7.1.7", + "https-proxy-agent": "5.0.0", + "inquirer": "8.1.1", + "jest-worker": "27.0.2", + "karma-source-map-support": "1.4.0", + "less": "4.1.1", + "less-loader": "10.0.0", + "license-webpack-plugin": "2.3.19", + "loader-utils": "2.0.0", + "mini-css-extract-plugin": "1.6.2", + "minimatch": "3.0.4", + "open": "8.2.1", + "ora": "5.4.1", + "parse5-html-rewriting-stream": "6.0.1", + "postcss": "8.3.5", + "postcss-import": "14.0.2", + "postcss-loader": "6.1.0", + "postcss-preset-env": "6.7.0", + "raw-loader": "4.0.2", + "regenerator-runtime": "0.13.7", + "resolve-url-loader": "4.0.0", + "rxjs": "6.6.7", + "sass": "1.35.1", + "sass-loader": "12.1.0", + "semver": "7.3.5", + "source-map": "0.7.3", + "source-map-loader": "3.0.0", + "source-map-support": "0.5.19", + "style-loader": "2.0.0", + "stylus": "0.54.8", + "stylus-loader": "6.1.0", + "terser": "5.7.0", + "terser-webpack-plugin": "5.1.3", + "text-table": "0.2.0", + "tree-kill": "1.2.2", + "tslib": "2.3.0", + "webpack": "5.41.1", + "webpack-dev-middleware": "5.0.0", + "webpack-dev-server": "3.11.2", + "webpack-merge": "5.8.0", + "webpack-subresource-integrity": "1.5.2" + } + }, + "@angular-devkit/build-optimizer": { + "version": "0.1201.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.1201.1.tgz", + "integrity": "sha512-SdAffCpjRNFKwnEq8xdPdCWPgdrfY8rlmTZXGY7e1whR4vnyZi+afk1BAsmbNyWlHYVv0Zcnh+Q1VH3OBDLwhw==", + "dev": true, + "requires": { + "source-map": "0.7.3", + "tslib": "2.3.0", + "typescript": "4.3.4" + }, + "dependencies": { + "typescript": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.4.tgz", + "integrity": "sha512-uauPG7XZn9F/mo+7MrsRjyvbxFpzemRjKEZXS4AK83oP2KKOJPvb+9cO/gmnv8arWZvhnjVOXz7B49m1l0e9Ew==", + "dev": true + } + } + }, + "@angular-devkit/build-webpack": { + "version": "0.1201.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1201.1.tgz", + "integrity": "sha512-isgj6bSFr16tuXEoX0VypvsQmg3uDOdvYDQZvkwzUrIyvQo5TeoOy/MLgrb9v+tXjEA7oZrzuigE4Hjzn466bQ==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.1201.1", + "rxjs": "6.6.7" + } + }, + "@angular-devkit/core": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-12.1.1.tgz", + "integrity": "sha512-z5+O3ugXbo8djKPjUtf/UfnYCmco2K1LVhQ6cWLhKi3NKRBiHeNmZh5nAycqFD8/Q+oI/+Ao40MkmkK1Tq0jsw==", + "dev": true, + "requires": { + "ajv": "8.6.0", + "ajv-formats": "2.1.0", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.7", + "source-map": "0.7.3" + } + }, + "@angular-devkit/schematics": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-12.0.4.tgz", + "integrity": "sha512-MEAAcOh1Y4R6O7HWo7mMXgRK9BSbCZ3rlx+aHmtWpNXohw0TRhNY5WmRnQTRvMA3qjR9nh0Uo7BkRpgwRfqmBw==", + "dev": true, + "requires": { + "@angular-devkit/core": "12.0.4", + "ora": "5.4.0", + "rxjs": "6.6.7" + }, + "dependencies": { + "@angular-devkit/core": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-12.0.4.tgz", + "integrity": "sha512-gtQkLXuQK7NPkurw49//MFZWoRa9aVCIbxE2uxbDAzzQengx9nLUoezS2xVdM7m/SqVK72YL+ZFfSTXzfiSdnA==", + "dev": true, + "requires": { + "ajv": "8.2.0", + "ajv-formats": "2.0.2", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.7", + "source-map": "0.7.3" + } + }, + "ajv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.2.0.tgz", + "integrity": "sha512-WSNGFuyWd//XO8n/m/EaOlNLtO0yL8EXT/74LqT4khdhpZjP7lkj/kT5uwRmGitKEVp/Oj7ZUHeGfPtgHhQ5CA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-formats": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.0.2.tgz", + "integrity": "sha512-Brah4Uo5/U8v76c6euTwtjVFFaVishwnJrQBYpev1JRh4vjA1F4HY3UzQez41YUCszUCXKagG8v6eVRBHV1gkw==", + "dev": true, + "requires": { + "ajv": "^8.0.0" + } + }, + "ansi-styles": { + "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" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "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" + } + }, + "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 + }, + "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 + }, + "ora": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.0.tgz", + "integrity": "sha512-1StwyXQGoU6gdjYkyVcqOLnVlbKj+6yPNNOxJVgpt9t4eksKjiriiHuxktLYkgllwk+D6MbC4ihH84L1udRXPg==", + "dev": true, + "requires": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + } + }, + "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" + } + } + } + }, + "@angular-eslint/eslint-plugin": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-12.1.0.tgz", + "integrity": "sha512-l/WzdB8KMohKFB6ts3wfiAgdbhf2lxNQ1zKn/E5buDoLCbptHYEZN7eKqUNaQdWoT5mSlAQOGpliiSKuytdHWw==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "4.23.0" + } + }, + "@angular/cli": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-12.0.4.tgz", + "integrity": "sha512-kZaJ55udB/AjQ+q8CrQfk6JGWdnJpH3c2VtbvSuR/ihiG6zMSxwpXqt1rImQN0RfffG3bsHD2SpM+T7/LKPemw==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.1200.4", + "@angular-devkit/core": "12.0.4", + "@angular-devkit/schematics": "12.0.4", + "@schematics/angular": "12.0.4", + "@yarnpkg/lockfile": "1.1.0", + "ansi-colors": "4.1.1", + "debug": "4.3.1", + "ini": "2.0.0", + "inquirer": "8.0.0", + "jsonc-parser": "3.0.0", + "npm-package-arg": "8.1.2", + "npm-pick-manifest": "6.1.1", + "open": "8.0.2", + "ora": "5.4.0", + "pacote": "11.3.2", + "resolve": "1.20.0", + "rimraf": "3.0.2", + "semver": "7.3.5", + "symbol-observable": "4.0.0", + "uuid": "8.3.2" + }, + "dependencies": { + "@angular-devkit/architect": { + "version": "0.1200.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1200.4.tgz", + "integrity": "sha512-/BKaVlpbZYb65elZ+xHoKB2J2DuTstMU++dqE9T/7E0CevuMoOdkLQFQm71Kjl3eFI4i6T5d8mlLVPNE/ZWm7w==", + "dev": true, + "requires": { + "@angular-devkit/core": "12.0.4", + "rxjs": "6.6.7" + } + }, + "@angular-devkit/core": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-12.0.4.tgz", + "integrity": "sha512-gtQkLXuQK7NPkurw49//MFZWoRa9aVCIbxE2uxbDAzzQengx9nLUoezS2xVdM7m/SqVK72YL+ZFfSTXzfiSdnA==", + "dev": true, + "requires": { + "ajv": "8.2.0", + "ajv-formats": "2.0.2", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.7", + "source-map": "0.7.3" + } + }, + "ajv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.2.0.tgz", + "integrity": "sha512-WSNGFuyWd//XO8n/m/EaOlNLtO0yL8EXT/74LqT4khdhpZjP7lkj/kT5uwRmGitKEVp/Oj7ZUHeGfPtgHhQ5CA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-formats": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.0.2.tgz", + "integrity": "sha512-Brah4Uo5/U8v76c6euTwtjVFFaVishwnJrQBYpev1JRh4vjA1F4HY3UzQez41YUCszUCXKagG8v6eVRBHV1gkw==", + "dev": true, + "requires": { + "ajv": "^8.0.0" + } + }, + "ansi-styles": { + "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" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "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" + } + }, + "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 + }, + "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 + }, + "inquirer": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.0.0.tgz", + "integrity": "sha512-ON8pEJPPCdyjxj+cxsYRe6XfCJepTxANdNnTebsTuQgXpRyZRRT9t4dJwjRubgmvn20CLSEnozRUayXyM9VTXA==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.6", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + } + }, + "open": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.0.2.tgz", + "integrity": "sha512-NV5QmWJrTaNBLHABJyrb+nd5dXI5zfea/suWawBhkHzAbVhLLiJdrqMgxMypGK9Eznp2Ltoh7SAVkQ3XAucX7Q==", + "dev": true, + "requires": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + } + }, + "ora": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.0.tgz", + "integrity": "sha512-1StwyXQGoU6gdjYkyVcqOLnVlbKj+6yPNNOxJVgpt9t4eksKjiriiHuxktLYkgllwk+D6MbC4ihH84L1udRXPg==", + "dev": true, + "requires": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + } + }, + "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" + } + } + } + }, + "@angular/common": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-12.0.5.tgz", + "integrity": "sha512-jKiPjWVL3jXVKgXwINlsF5O0r9gX/mAoa5UVy57O8jcg+ENbH9LLSOikgiF/0HPxk2uvRV5OYmbBgOY1xT41kQ==", + "requires": { + "tslib": "^2.1.0" + } + }, + "@angular/compiler": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-12.0.5.tgz", + "integrity": "sha512-G255aP4hhQ04hSQ1/JgiKNeTzRCuLgK220lJXkHubpu+f67os5LArhFNxZaUC/EVa/sloOT7Fo5tn8C5gy7iLA==", + "requires": { + "tslib": "^2.1.0" + } + }, + "@angular/compiler-cli": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-12.0.5.tgz", + "integrity": "sha512-XBZWU2S7N2kvQJK0H5KyLHiLVhYJrjh3NtbVBv67sCY9Ft8fv2jjbozTgXqeoYZ1xAxcZ2ZAB0n5SkhmY75Mow==", + "dev": true, + "requires": { + "@babel/core": "^7.8.6", + "@babel/types": "^7.8.6", + "canonical-path": "1.0.0", + "chokidar": "^3.0.0", + "convert-source-map": "^1.5.1", + "dependency-graph": "^0.11.0", + "magic-string": "^0.25.0", + "minimist": "^1.2.0", + "reflect-metadata": "^0.1.2", + "semver": "^7.0.0", + "source-map": "^0.6.1", + "sourcemap-codec": "^1.4.8", + "tslib": "^2.1.0", + "yargs": "^16.2.0" + }, + "dependencies": { + "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 + } + } + }, + "@angular/core": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-12.0.5.tgz", + "integrity": "sha512-uVYsZa1VqVw8vNcjUYgfjXBc1M3WaxLXoLnCsDvutJiln4csa8Yw8p7RqQSrZ6AgQ8o2LHD2JJ5kus3EDMwfcA==", + "requires": { + "tslib": "^2.1.0" + } + }, + "@angular/forms": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-12.0.5.tgz", + "integrity": "sha512-Ew/fGPTsywoYnm6DFPA/DyLl4Sb+1/uzpledrbxUHzaSKIrnXFrjQiUTmsbbq+8qono3JzbUIblqH1DrNThYiA==", + "requires": { + "tslib": "^2.1.0" + } + }, + "@angular/localize": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-12.0.5.tgz", + "integrity": "sha512-CRyXsNJYV7TJBsbG/Sn6lW9qMQCa+lw5SSNKHvnmfCTyd5p3DV8AdjOYkyWM5tfB4wg/aOc4C1ynDom4TmKv+w==", + "requires": { + "@babel/core": "7.8.3", + "glob": "7.1.7", + "yargs": "^16.2.0" + }, + "dependencies": { + "@babel/core": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.3.tgz", + "integrity": "sha512-4XFkf8AwyrEG7Ziu3L2L0Cv+WyY47Tcsp70JFmpftbAA1K7YL/sgE9jh9HyNj08Y/U50ItUchpN0w6HxAoX1rA==", + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.3", + "@babel/helpers": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.0", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "@angular/platform-browser": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-12.0.5.tgz", + "integrity": "sha512-MLioK9gcdZOKINE8OmIHZICRnFySaWyCBeVbHS4Z4Vxgr+E2S2eO1IxBmGyQpJq1wDPBP9A/9LVLMUNbHu4Cdw==", + "requires": { + "tslib": "^2.1.0" + } + }, + "@angular/platform-browser-dynamic": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-12.0.5.tgz", + "integrity": "sha512-sYkOJxXj4vEZICT2oODkQF9wNaKoScSkiw2ooBYN0UX02mFKlWKa9vkzp6JmN1EF8YOWF0JnRqBPAi1WbOnAMw==", + "requires": { + "tslib": "^2.1.0" + } + }, + "@angular/router": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-12.0.5.tgz", + "integrity": "sha512-2jiaT+OxCmJbeJ0MTPmIHBsTFLysenvPZteozYsjcmUo9mOzJHAjqHLJvTC+Ri+E9xvnplh+8BPETRleV1pAFw==", + "requires": { + "tslib": "^2.1.0" + } + }, + "@angular/service-worker": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-12.0.5.tgz", + "integrity": "sha512-ZJ8EhuTaktZgoo1ZylmiTlxmALaAiK7ow0vTInfuRSkVbrUhuJQv3qqAEoGAgLH5a3QW+E8/8CoMzNMDcwpWXQ==", + "dev": true, + "requires": { + "tslib": "^2.1.0" + } + }, + "@babel/code-frame": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", + "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "requires": { + "@babel/highlight": "^7.14.5" + } + }, + "@babel/compat-data": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.7.tgz", + "integrity": "sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw==", + "dev": true + }, + "@babel/core": { + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.6.tgz", + "integrity": "sha512-gJnOEWSqTk96qG5BoIrl5bVtc23DCycmIePPYnamY9RboYdI4nFy5vAQMSl81O5K/W0sLDWfGysnOECC+KUUCA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.14.5", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helpers": "^7.14.6", + "@babel/parser": "^7.14.6", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.5.tgz", + "integrity": "sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA==", + "requires": { + "@babel/types": "^7.14.5", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz", + "integrity": "sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.14.5.tgz", + "integrity": "sha512-YTA/Twn0vBXDVGJuAX6PwW7x5zQei1luDDo2Pl6q1qZ7hVNl0RZrhHCQG/ArGpR29Vl7ETiB8eJyrvpuRp300w==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.5.tgz", + "integrity": "sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.16.6", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.6.tgz", + "integrity": "sha512-Z6gsfGofTxH/+LQXqYEK45kxmcensbzmk/oi8DmaQytlQCgqNZt9XQF8iqlI/SeXWVjaMNxvYvzaYw+kh42mDg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-member-expression-to-functions": "^7.14.5", + "@babel/helper-optimise-call-expression": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz", + "integrity": "sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "regexpu-core": "^4.7.1" + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz", + "integrity": "sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.14.5.tgz", + "integrity": "sha512-Htb24gnGJdIGT4vnRKMdoXiOIlqOLmdiUYpAQ0mYfgVT/GDm8GOYhgi4GL+hMKrkiPRohO4ts34ELFsGAPQLDQ==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-function-name": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", + "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", + "requires": { + "@babel/helper-get-function-arity": "^7.14.5", + "@babel/template": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", + "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", + "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz", + "integrity": "sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-module-imports": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", + "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-module-transforms": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.5.tgz", + "integrity": "sha512-iXpX4KW8LVODuAieD7MzhNjmM6dzYY5tfRqT+R9HDXWl0jPn/djKmA+G9s/2C2T9zggw5tK1QNqZ70USfedOwA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5", + "@babel/helper-simple-access": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.5", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", + "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", + "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", + "dev": true + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.14.5.tgz", + "integrity": "sha512-rLQKdQU+HYlxBwQIj8dk4/0ENOUEhA/Z0l4hN8BexpvmSMN9oA9EagjnhnDpNsRdWCfjwa4mn/HyBXO9yhQP6A==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-wrap-function": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-replace-supers": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz", + "integrity": "sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.14.5", + "@babel/helper-optimise-call-expression": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-simple-access": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.5.tgz", + "integrity": "sha512-nfBN9xvmCt6nrMZjfhkl7i0oTV3yxR4/FztsbOASyTvVcoYd0TRHh7eMLdlEcCqobydC0LAF3LtC92Iwxo0wyw==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz", + "integrity": "sha512-dmqZB7mrb94PZSAOYtr+ZN5qt5owZIAgqtoTuqiFbHFtxgEcmQlRJVI+bO++fciBunXtB6MK7HrzrfcAzIz2NQ==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", + "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", + "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==" + }, + "@babel/helper-validator-option": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.14.5.tgz", + "integrity": "sha512-YEdjTCq+LNuNS1WfxsDCNpgXkJaIyqco6DAelTUjT4f2KIWC1nBcaCaSdHTBqQVLnTBexBcVcFhLSU1KnYuePQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.14.5", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/helpers": { + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.6.tgz", + "integrity": "sha512-yesp1ENQBiLI+iYHSJdoZKUtRpfTlL1grDIX9NRlAVppljLw/4tTyYupIB7uIYmC3stW/imAv8EqaKaS/ibmeA==", + "requires": { + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "requires": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.7.tgz", + "integrity": "sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA==" + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.14.5.tgz", + "integrity": "sha512-ZoJS2XCKPBfTmL122iP6NM9dOg+d4lc9fFk3zxc8iDjvt8Pk4+TlsHSKhIPf6X+L5ORCdBzqMZDjL/WHj7WknQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", + "@babel/plugin-proposal-optional-chaining": "^7.14.5" + } + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.7.tgz", + "integrity": "sha512-RK8Wj7lXLY3bqei69/cc25gwS5puEc3dknoFPFbqfy3XxYQBQFvu4ioWpafMBAB+L9NyptQK4nMOa5Xz16og8Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.14.5", + "@babel/plugin-syntax-async-generators": "^7.8.4" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz", + "integrity": "sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-proposal-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.14.5.tgz", + "integrity": "sha512-KBAH5ksEnYHCegqseI5N9skTdxgJdmDoAOc0uXa+4QMYKeZD0w5IARh4FMlTNtaHhbB8v+KzMdTgxMMzsIy6Yg==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz", + "integrity": "sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + } + }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz", + "integrity": "sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz", + "integrity": "sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + } + }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz", + "integrity": "sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz", + "integrity": "sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz", + "integrity": "sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.7.tgz", + "integrity": "sha512-082hsZz+sVabfmDWo1Oct1u1AgbKbUAyVgmX4otIc7bdsRgHBXwTwb3DpDmD4Eyyx6DNiuz5UAATT655k+kL5g==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.14.7", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.14.5" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz", + "integrity": "sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz", + "integrity": "sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz", + "integrity": "sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-62EyfyA3WA0mZiF2e2IV9mc9Ghwxcg8YTu8BS4Wss4Y3PY725OmS9M0qLORbJwLqFtGh+jiE4wAmocK2CTUK2Q==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz", + "integrity": "sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-async-generators": { + "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" + } + }, + "@babel/plugin-syntax-bigint": { + "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" + } + }, + "@babel/plugin-syntax-class-properties": { + "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" + } + }, + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-import-meta": { + "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" + } + }, + "@babel/plugin-syntax-json-strings": { + "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" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "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" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "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" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "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" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "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" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "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" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "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" + } + }, + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-top-level-await": { + "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" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz", + "integrity": "sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz", + "integrity": "sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz", + "integrity": "sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.14.5" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz", + "integrity": "sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.5.tgz", + "integrity": "sha512-LBYm4ZocNgoCqyxMLoOnwpsmQ18HWTQvql64t3GvMUzLQrNoV1BDG0lNftC8QKYERkZgCCT/7J5xWGObGAyHDw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.5.tgz", + "integrity": "sha512-J4VxKAMykM06K/64z9rwiL6xnBHgB1+FVspqvlgCdwD1KUbQNfszeKVVOMh59w3sztHYIZDgnhOC4WbdEfHFDA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-optimise-call-expression": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz", + "integrity": "sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz", + "integrity": "sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz", + "integrity": "sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz", + "integrity": "sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz", + "integrity": "sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.14.5.tgz", + "integrity": "sha512-CfmqxSUZzBl0rSjpoQSFoR9UEj3HzbGuGNL21/iFTmjb5gFggJp3ph0xR1YBhexmLoKRHzgxuFvty2xdSt6gTA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz", + "integrity": "sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz", + "integrity": "sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz", + "integrity": "sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz", + "integrity": "sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.5.tgz", + "integrity": "sha512-en8GfBtgnydoao2PS+87mKyw62k02k7kJ9ltbKe0fXTHrQmG6QZZflYuGI1VVG7sVpx4E1n7KBpNlPb8m78J+A==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-simple-access": "^7.14.5", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.14.5.tgz", + "integrity": "sha512-mNMQdvBEE5DcMQaL5LbzXFMANrQjd2W7FPzg34Y4yEz7dBgdaC+9B84dSO+/1Wba98zoDbInctCDo4JGxz1VYA==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.14.5", + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.5", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz", + "integrity": "sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.7.tgz", + "integrity": "sha512-DTNOTaS7TkW97xsDMrp7nycUVh6sn/eq22VaxWfEdzuEbRsiaOU0pqU7DlyUGHVsbQbSghvjKRpEl+nUCKGQSg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz", + "integrity": "sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz", + "integrity": "sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.5.tgz", + "integrity": "sha512-Tl7LWdr6HUxTmzQtzuU14SqbgrSKmaR77M0OKyq4njZLQTPfOvzblNKyNkGwOfEFCEx7KeYHQHDI0P3F02IVkA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz", + "integrity": "sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz", + "integrity": "sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg==", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz", + "integrity": "sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.14.5.tgz", + "integrity": "sha512-fPMBhh1AV8ZyneiCIA+wYYUH1arzlXR1UMcApjvchDhfKxhy2r2lReJv8uHEyihi4IFIGlr1Pdx7S5fkESDQsg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.2", + "babel-plugin-polyfill-regenerator": "^0.2.2", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz", + "integrity": "sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz", + "integrity": "sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz", + "integrity": "sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz", + "integrity": "sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz", + "integrity": "sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz", + "integrity": "sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz", + "integrity": "sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/preset-env": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.14.7.tgz", + "integrity": "sha512-itOGqCKLsSUl0Y+1nSfhbuuOlTs0MJk2Iv7iSH+XT/mR8U1zRLO7NjWlYXB47yhK4J/7j+HYty/EhFZDYKa/VA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.14.7", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-async-generator-functions": "^7.14.7", + "@babel/plugin-proposal-class-properties": "^7.14.5", + "@babel/plugin-proposal-class-static-block": "^7.14.5", + "@babel/plugin-proposal-dynamic-import": "^7.14.5", + "@babel/plugin-proposal-export-namespace-from": "^7.14.5", + "@babel/plugin-proposal-json-strings": "^7.14.5", + "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", + "@babel/plugin-proposal-numeric-separator": "^7.14.5", + "@babel/plugin-proposal-object-rest-spread": "^7.14.7", + "@babel/plugin-proposal-optional-catch-binding": "^7.14.5", + "@babel/plugin-proposal-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-private-methods": "^7.14.5", + "@babel/plugin-proposal-private-property-in-object": "^7.14.5", + "@babel/plugin-proposal-unicode-property-regex": "^7.14.5", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.14.5", + "@babel/plugin-transform-async-to-generator": "^7.14.5", + "@babel/plugin-transform-block-scoped-functions": "^7.14.5", + "@babel/plugin-transform-block-scoping": "^7.14.5", + "@babel/plugin-transform-classes": "^7.14.5", + "@babel/plugin-transform-computed-properties": "^7.14.5", + "@babel/plugin-transform-destructuring": "^7.14.7", + "@babel/plugin-transform-dotall-regex": "^7.14.5", + "@babel/plugin-transform-duplicate-keys": "^7.14.5", + "@babel/plugin-transform-exponentiation-operator": "^7.14.5", + "@babel/plugin-transform-for-of": "^7.14.5", + "@babel/plugin-transform-function-name": "^7.14.5", + "@babel/plugin-transform-literals": "^7.14.5", + "@babel/plugin-transform-member-expression-literals": "^7.14.5", + "@babel/plugin-transform-modules-amd": "^7.14.5", + "@babel/plugin-transform-modules-commonjs": "^7.14.5", + "@babel/plugin-transform-modules-systemjs": "^7.14.5", + "@babel/plugin-transform-modules-umd": "^7.14.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.7", + "@babel/plugin-transform-new-target": "^7.14.5", + "@babel/plugin-transform-object-super": "^7.14.5", + "@babel/plugin-transform-parameters": "^7.14.5", + "@babel/plugin-transform-property-literals": "^7.14.5", + "@babel/plugin-transform-regenerator": "^7.14.5", + "@babel/plugin-transform-reserved-words": "^7.14.5", + "@babel/plugin-transform-shorthand-properties": "^7.14.5", + "@babel/plugin-transform-spread": "^7.14.6", + "@babel/plugin-transform-sticky-regex": "^7.14.5", + "@babel/plugin-transform-template-literals": "^7.14.5", + "@babel/plugin-transform-typeof-symbol": "^7.14.5", + "@babel/plugin-transform-unicode-escapes": "^7.14.5", + "@babel/plugin-transform-unicode-regex": "^7.14.5", + "@babel/preset-modules": "^0.1.4", + "@babel/types": "^7.14.5", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.2", + "babel-plugin-polyfill-regenerator": "^0.2.2", + "core-js-compat": "^3.15.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/preset-modules": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", + "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/runtime": { + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.6.tgz", + "integrity": "sha512-/PCB2uJ7oM44tz8YhC4Z/6PeOKXp4K588f+5M3clr1M4zbqztlo0XEfJ2LEzj/FgwfgGcIdl8n7YYjTCI0BYwg==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", + "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/traverse": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.7.tgz", + "integrity": "sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ==", + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.14.5", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-hoist-variables": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/parser": "^7.14.7", + "@babel/types": "^7.14.5", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", + "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", + "requires": { + "@babel/helper-validator-identifier": "^7.14.5", + "to-fast-properties": "^2.0.0" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "@chevrotain/types": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-9.0.2.tgz", + "integrity": "sha512-lo1dQPX7DQffJb26eaYLEy4/jUTFmsGKa43mDvMNAHwItEgUQHUkTZR0iAkHG0aJv8ejM/KqYpRVSNetrOK8qw==", + "dev": true + }, + "@chevrotain/utils": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-9.0.2.tgz", + "integrity": "sha512-iTju1VpbGruWagXS/XswuqeimOCRNeDvrXLlWHYsHp1qTU8sJfAfLiX5vs7DNxB1px6N8VWVI0SD8vMUksNBYw==", + "dev": true + }, + "@csstools/convert-colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz", + "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==", + "dev": true + }, + "@dabh/diagnostics": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.2.tgz", + "integrity": "sha512-+A1YivoVDNNVCdfozHSR8v/jyuuLTMXwjWuxPFlFlUapXoGc+Gj9mDlTDDfrwl7rXCl2tNZ0kE8sIBO6YOn96Q==", + "dev": true, + "requires": { + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, + "@discoveryjs/json-ext": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.3.tgz", + "integrity": "sha512-Fxt+AfXgjMoin2maPIYzFZnQjAXjAL0PHscM5pRTtatFqB+vZxAM9tLp2Optnuw3QOQC40jTNeGYFOMvyf7v9g==", + "dev": true + }, + "@eslint/eslintrc": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.2.tgz", + "integrity": "sha512-8nmGq/4ycLpIwzvhI4tNDmQztZ8sp+hI7cyG8i1nQDhkAbRzHpXPidRAHlNvCZQpJTKw5ItIpMw9RSToGF00mg==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "globals": { + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.9.0.tgz", + "integrity": "sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + } + } + }, + "@fortawesome/angular-fontawesome": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@fortawesome/angular-fontawesome/-/angular-fontawesome-0.9.0.tgz", + "integrity": "sha512-pJNJqxRTJChkUtywbqRuJRpmK/WNwqFqeN/GMmJmy3gHeCnWQ4SG0BwPJqaWqhi4gqII5dADijGts6wqeusxeQ==", + "requires": { + "tslib": "^2.2.0" + } + }, + "@fortawesome/fontawesome-common-types": { + "version": "0.2.35", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.35.tgz", + "integrity": "sha512-IHUfxSEDS9dDGqYwIW7wTN6tn/O8E0n5PcAHz9cAaBoZw6UpG20IG/YM3NNLaGPwPqgjBAFjIURzqoQs3rrtuw==" + }, + "@fortawesome/fontawesome-svg-core": { + "version": "1.2.35", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.35.tgz", + "integrity": "sha512-uLEXifXIL7hnh2sNZQrIJWNol7cTVIzwI+4qcBIq9QWaZqUblm0IDrtSqbNg+3SQf8SMGHkiSigD++rHmCHjBg==", + "requires": { + "@fortawesome/fontawesome-common-types": "^0.2.35" + } + }, + "@fortawesome/free-solid-svg-icons": { + "version": "5.15.3", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.3.tgz", + "integrity": "sha512-XPeeu1IlGYqz4VWGRAT5ukNMd4VHUEEJ7ysZ7pSSgaEtNvSo+FLurybGJVmiqkQdK50OkSja2bfZXOeyMGRD8Q==", + "requires": { + "@fortawesome/fontawesome-common-types": "^0.2.35" + } + }, + "@hapi/hoek": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.2.0.tgz", + "integrity": "sha512-sqKVVVOe5ivCaXDWivIJYVSaEgdQK9ul7a4Kity5Iw7u9+wBAPbX1RMSnLLmp7O4Vzj0WOWwMAJsTL00xwaNug==", + "dev": true + }, + "@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "dev": true, + "requires": { + "@hapi/hoek": "^9.0.0" + } + }, + "@istanbuljs/load-nyc-config": { + "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", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "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" + } + }, + "locate-path": { + "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" + } + }, + "p-limit": { + "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" + } + }, + "p-locate": { + "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" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "@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==", + "dev": true + }, + "@jest/console": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.0.6.tgz", + "integrity": "sha512-fMlIBocSHPZ3JxgWiDNW/KPj6s+YRd0hicb33IrmelCcjXo/pXPwvuiKFmZz+XuqI/1u7nbUK10zSsWL/1aegg==", + "dev": true, + "requires": { + "@jest/types": "^27.0.6", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.0.6", + "jest-util": "^27.0.6", + "slash": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "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" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "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" + } + }, + "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 + }, + "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 + }, + "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" + } + } + } + }, + "@jest/core": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.0.6.tgz", + "integrity": "sha512-SsYBm3yhqOn5ZLJCtccaBcvD/ccTLCeuDv8U41WJH/V1MW5eKUkeMHT9U+Pw/v1m1AIWlnIW/eM2XzQr0rEmow==", + "dev": true, + "requires": { + "@jest/console": "^27.0.6", + "@jest/reporters": "^27.0.6", + "@jest/test-result": "^27.0.6", + "@jest/transform": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-changed-files": "^27.0.6", + "jest-config": "^27.0.6", + "jest-haste-map": "^27.0.6", + "jest-message-util": "^27.0.6", + "jest-regex-util": "^27.0.6", + "jest-resolve": "^27.0.6", + "jest-resolve-dependencies": "^27.0.6", + "jest-runner": "^27.0.6", + "jest-runtime": "^27.0.6", + "jest-snapshot": "^27.0.6", + "jest-util": "^27.0.6", + "jest-validate": "^27.0.6", + "jest-watcher": "^27.0.6", + "micromatch": "^4.0.4", + "p-each-series": "^2.1.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "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" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "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" + } + }, + "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 + }, + "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 + }, + "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" + } + } + } + }, + "@jest/environment": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.0.6.tgz", + "integrity": "sha512-4XywtdhwZwCpPJ/qfAkqExRsERW+UaoSRStSHCCiQTUpoYdLukj+YJbQSFrZjhlUDRZeNiU9SFH0u7iNimdiIg==", + "dev": true, + "requires": { + "@jest/fake-timers": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/node": "*", + "jest-mock": "^27.0.6" + } + }, + "@jest/fake-timers": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.0.6.tgz", + "integrity": "sha512-sqd+xTWtZ94l3yWDKnRTdvTeZ+A/V7SSKrxsrOKSqdyddb9CeNRF8fbhAU0D7ZJBpTTW2nbp6MftmKJDZfW2LQ==", + "dev": true, + "requires": { + "@jest/types": "^27.0.6", + "@sinonjs/fake-timers": "^7.0.2", + "@types/node": "*", + "jest-message-util": "^27.0.6", + "jest-mock": "^27.0.6", + "jest-util": "^27.0.6" + } + }, + "@jest/globals": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.0.6.tgz", + "integrity": "sha512-DdTGCP606rh9bjkdQ7VvChV18iS7q0IMJVP1piwTWyWskol4iqcVwthZmoJEf7obE1nc34OpIyoVGPeqLC+ryw==", + "dev": true, + "requires": { + "@jest/environment": "^27.0.6", + "@jest/types": "^27.0.6", + "expect": "^27.0.6" + } + }, + "@jest/reporters": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.0.6.tgz", + "integrity": "sha512-TIkBt09Cb2gptji3yJXb3EE+eVltW6BjO7frO7NEfjI9vSIYoISi5R3aI3KpEDXlB1xwB+97NXIqz84qYeYsfA==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^27.0.6", + "@jest/test-result": "^27.0.6", + "@jest/transform": "^27.0.6", + "@jest/types": "^27.0.6", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.4", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.3", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^27.0.6", + "jest-resolve": "^27.0.6", + "jest-util": "^27.0.6", + "jest-worker": "^27.0.6", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^8.0.0" + }, + "dependencies": { + "ansi-styles": { + "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" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "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" + } + }, + "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 + }, + "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 + }, + "jest-worker": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.0.6.tgz", + "integrity": "sha512-qupxcj/dRuA3xHPMUd40gr2EaAurFbkwzOh7wfPaeE9id7hyjURRQoqNfHifHK3XjJU6YJJUQKILGUnwGPEOCA==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "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" + } + } + } + }, + "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 + }, + "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" + } + } + } + }, + "@jest/source-map": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.0.6.tgz", + "integrity": "sha512-Fek4mi5KQrqmlY07T23JRi0e7Z9bXTOOD86V/uS0EIW4PClvPDqZOyFlLpNJheS6QI0FNX1CgmPjtJ4EA/2M+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.4", + "source-map": "^0.6.0" + }, + "dependencies": { + "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 + } + } + }, + "@jest/test-result": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.0.6.tgz", + "integrity": "sha512-ja/pBOMTufjX4JLEauLxE3LQBPaI2YjGFtXexRAjt1I/MbfNlMx0sytSX3tn5hSLzQsR3Qy2rd0hc1BWojtj9w==", + "dev": true, + "requires": { + "@jest/console": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/test-sequencer": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.0.6.tgz", + "integrity": "sha512-bISzNIApazYOlTHDum9PwW22NOyDa6VI31n6JucpjTVM0jD6JDgqEZ9+yn575nDdPF0+4csYDxNNW13NvFQGZA==", + "dev": true, + "requires": { + "@jest/test-result": "^27.0.6", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^27.0.6", + "jest-runtime": "^27.0.6" + } + }, + "@jest/transform": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.0.6.tgz", + "integrity": "sha512-rj5Dw+mtIcntAUnMlW/Vju5mr73u8yg+irnHwzgtgoeI6cCPOvUwQ0D1uQtc/APmWgvRweEb1g05pkUpxH3iCA==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^27.0.6", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^27.0.6", + "jest-regex-util": "^27.0.6", + "jest-util": "^27.0.6", + "micromatch": "^4.0.4", + "pirates": "^4.0.1", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "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" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "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" + } + }, + "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 + }, + "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 + }, + "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 + }, + "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" + } + } + } + }, + "@jest/types": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.0.6.tgz", + "integrity": "sha512-aSquT1qa9Pik26JK5/3rvnYb4bGtm1VFNesHKmNTwmPIgOrixvhL2ghIvFRNEpzy3gU+rUgjIF/KodbkFAl++g==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "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" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "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" + } + }, + "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 + }, + "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 + }, + "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" + } + } + } + }, + "@jsdevtools/coverage-istanbul-loader": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@jsdevtools/coverage-istanbul-loader/-/coverage-istanbul-loader-3.0.5.tgz", + "integrity": "sha512-EUCPEkaRPvmHjWAAZkWMT7JDzpw7FKB00WTISaiXsbNOd5hCHg77XLA8sLYLFDo1zepYLo2w7GstN8YBqRXZfA==", + "dev": true, + "requires": { + "convert-source-map": "^1.7.0", + "istanbul-lib-instrument": "^4.0.3", + "loader-utils": "^2.0.0", + "merge-source-map": "^1.1.0", + "schema-utils": "^2.7.0" + } + }, + "@ng-bootstrap/ng-bootstrap": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-9.1.3.tgz", + "integrity": "sha512-Sl4lis1F5uSPrd4WsLEMX8b3fqzeHr4rgTFhocpx/IedZPaPdGec4a91TjdqcM/fNwzoXj1AdGrcMLpFFOxmvw==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@ngtools/webpack": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-12.1.1.tgz", + "integrity": "sha512-NOHTBEjUkawQSU6sHA7EJSi5Ixw+oVmlYi17HXAhGRY1czasLQMiKQPnigbSgMLBR9Jhez7TttqAUtx6Pey2FQ==", + "dev": true, + "requires": { + "enhanced-resolve": "5.8.2" + } + }, + "@ngx-translate/core": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@ngx-translate/core/-/core-13.0.0.tgz", + "integrity": "sha512-+tzEp8wlqEnw0Gc7jtVRAJ6RteUjXw6JJR4O65KlnxOmJrCGPI0xjV/lKRnQeU0w4i96PQs/jtpL921Wrb7PWg==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@ngx-translate/http-loader": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@ngx-translate/http-loader/-/http-loader-6.0.0.tgz", + "integrity": "sha512-LCekn6qCbeXWlhESCxU1rAbZz33WzDG0lI7Ig0pYC1o5YxJWrkU9y3Y4tNi+jakQ7R6YhTR2D3ox6APxDtA0wA==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.7.tgz", + "integrity": "sha512-BTIhocbPBSrRmHxOAJFtR18oLhxTtAFDAvL8hY1S3iU8k+E60W/YFs4jrixGzQjMpF4qPXxIQHcjVD9dz1C2QA==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@npmcli/arborist": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/@npmcli/arborist/-/arborist-2.6.4.tgz", + "integrity": "sha512-A/pDQ/VZpdxaqsQS5XOWrhrPuC+ER7HLq+4ZkEmnO2yo/USFCWEsiUPYKhfY+sWXK3pgKjN7B7CEFmAnSoAt3g==", + "dev": true, + "requires": { + "@npmcli/installed-package-contents": "^1.0.7", + "@npmcli/map-workspaces": "^1.0.2", + "@npmcli/metavuln-calculator": "^1.1.0", + "@npmcli/move-file": "^1.1.0", + "@npmcli/name-from-folder": "^1.0.1", + "@npmcli/node-gyp": "^1.0.1", + "@npmcli/package-json": "^1.0.1", + "@npmcli/run-script": "^1.8.2", + "bin-links": "^2.2.1", + "cacache": "^15.0.3", + "common-ancestor-path": "^1.0.1", + "json-parse-even-better-errors": "^2.3.1", + "json-stringify-nice": "^1.1.4", + "mkdirp-infer-owner": "^2.0.0", + "npm-install-checks": "^4.0.0", + "npm-package-arg": "^8.1.0", + "npm-pick-manifest": "^6.1.0", + "npm-registry-fetch": "^11.0.0", + "pacote": "^11.2.6", + "parse-conflict-json": "^1.1.1", + "proc-log": "^1.0.0", + "promise-all-reject-late": "^1.0.0", + "promise-call-limit": "^1.0.1", + "read-package-json-fast": "^2.0.2", + "readdir-scoped-modules": "^1.1.0", + "semver": "^7.3.5", + "tar": "^6.1.0", + "treeverse": "^1.0.4", + "walk-up-path": "^1.0.0" + }, + "dependencies": { + "make-fetch-happen": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.0.3.tgz", + "integrity": "sha512-uZ/9Cf2vKqsSWZyXhZ9wHHyckBrkntgbnqV68Bfe8zZenlf7D6yuGMXvHZQ+jSnzPkjosuNP1HGasj1J4h8OlQ==", + "dev": true, + "requires": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^5.0.0", + "ssri": "^8.0.0" + } + }, + "npm-registry-fetch": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-11.0.0.tgz", + "integrity": "sha512-jmlgSxoDNuhAtxUIG6pVwwtz840i994dL14FoNVZisrmZW5kWd63IUTNv1m/hyRSGSqWjCUp/YZlS1BJyNp9XA==", + "dev": true, + "requires": { + "make-fetch-happen": "^9.0.1", + "minipass": "^3.1.3", + "minipass-fetch": "^1.3.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.0.0", + "npm-package-arg": "^8.0.0" + } + } + } + }, + "@npmcli/git": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-2.1.0.tgz", + "integrity": "sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw==", + "dev": true, + "requires": { + "@npmcli/promise-spawn": "^1.3.2", + "lru-cache": "^6.0.0", + "mkdirp": "^1.0.4", + "npm-pick-manifest": "^6.1.1", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^2.0.2" + } + }, + "@npmcli/installed-package-contents": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz", + "integrity": "sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==", + "dev": true, + "requires": { + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "@npmcli/map-workspaces": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-1.0.3.tgz", + "integrity": "sha512-SdlRlOoQw4WKD4vtb/n5gUkobEABYBEOo8fRE4L8CtBkyWDSvIrReTfKvQ/Jc/LQqDaaZ5iv1iMSQzKCUr1n1A==", + "dev": true, + "requires": { + "@npmcli/name-from-folder": "^1.0.1", + "glob": "^7.1.6", + "minimatch": "^3.0.4", + "read-package-json-fast": "^2.0.1" + } + }, + "@npmcli/metavuln-calculator": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-1.1.1.tgz", + "integrity": "sha512-9xe+ZZ1iGVaUovBVFI9h3qW+UuECUzhvZPxK9RaEA2mjU26o5D0JloGYWwLYvQELJNmBdQB6rrpuN8jni6LwzQ==", + "dev": true, + "requires": { + "cacache": "^15.0.5", + "pacote": "^11.1.11", + "semver": "^7.3.2" + } + }, + "@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "dev": true, + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + } + }, + "@npmcli/name-from-folder": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-1.0.1.tgz", + "integrity": "sha512-qq3oEfcLFwNfEYOQ8HLimRGKlD8WSeGEdtUa7hmzpR8Sa7haL1KVQrvgO6wqMjhWFFVjgtrh1gIxDz+P8sjUaA==", + "dev": true + }, + "@npmcli/node-gyp": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-1.0.2.tgz", + "integrity": "sha512-yrJUe6reVMpktcvagumoqD9r08fH1iRo01gn1u0zoCApa9lnZGEigVKUd2hzsCId4gdtkZZIVscLhNxMECKgRg==", + "dev": true + }, + "@npmcli/package-json": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-1.0.1.tgz", + "integrity": "sha512-y6jnu76E9C23osz8gEMBayZmaZ69vFOIk8vR1FJL/wbEJ54+9aVG9rLTjQKSXfgYZEr50nw1txBBFfBZZe+bYg==", + "dev": true, + "requires": { + "json-parse-even-better-errors": "^2.3.1" + } + }, + "@npmcli/promise-spawn": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz", + "integrity": "sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==", + "dev": true, + "requires": { + "infer-owner": "^1.0.4" + } + }, + "@npmcli/run-script": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-1.8.5.tgz", + "integrity": "sha512-NQspusBCpTjNwNRFMtz2C5MxoxyzlbuJ4YEhxAKrIonTiirKDtatsZictx9RgamQIx6+QuHMNmPl0wQdoESs9A==", + "dev": true, + "requires": { + "@npmcli/node-gyp": "^1.0.2", + "@npmcli/promise-spawn": "^1.3.2", + "infer-owner": "^1.0.4", + "node-gyp": "^7.1.0", + "read-package-json-fast": "^2.0.1" + } + }, + "@octokit/auth-token": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.4.5.tgz", + "integrity": "sha512-BpGYsPgJt05M7/L/5FoE1PiAbdxXFZkX/3kDYcsvd1v6UhlnE5e96dTDr0ezX/EFwciQxf3cNV0loipsURU+WA==", + "dev": true, + "requires": { + "@octokit/types": "^6.0.3" + } + }, + "@octokit/core": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.5.1.tgz", + "integrity": "sha512-omncwpLVxMP+GLpLPgeGJBF6IWJFjXDS5flY5VbppePYX9XehevbDykRH9PdCdvqt9TS5AOTiDide7h0qrkHjw==", + "dev": true, + "requires": { + "@octokit/auth-token": "^2.4.4", + "@octokit/graphql": "^4.5.8", + "@octokit/request": "^5.6.0", + "@octokit/request-error": "^2.0.5", + "@octokit/types": "^6.0.3", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/endpoint": { + "version": "6.0.12", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz", + "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==", + "dev": true, + "requires": { + "@octokit/types": "^6.0.3", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" + }, + "dependencies": { + "is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true + } + } + }, + "@octokit/graphql": { + "version": "4.6.4", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.6.4.tgz", + "integrity": "sha512-SWTdXsVheRmlotWNjKzPOb6Js6tjSqA2a8z9+glDJng0Aqjzti8MEWOtuT8ZSu6wHnci7LZNuarE87+WJBG4vg==", + "dev": true, + "requires": { + "@octokit/request": "^5.6.0", + "@octokit/types": "^6.0.3", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/openapi-types": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-8.2.0.tgz", + "integrity": "sha512-113BfIPwDYBAUA5bDSd4q/DzRDSZlUanupjLHeRAtb3Sw99XJwiP8KHGsGoOwPtzUaszVscf3wbfaA3VCR3uHA==", + "dev": true + }, + "@octokit/plugin-paginate-rest": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.14.0.tgz", + "integrity": "sha512-S2uEu2uHeI7Vf+Lvj8tv3O5/5TCAa8GHS0dUQN7gdM7vKA6ZHAbR6HkAVm5yMb1mbedLEbxOuQ+Fa0SQ7tCDLA==", + "dev": true, + "requires": { + "@octokit/types": "^6.18.0" + } + }, + "@octokit/plugin-request-log": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", + "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", + "dev": true + }, + "@octokit/plugin-rest-endpoint-methods": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.3.7.tgz", + "integrity": "sha512-LAgTLOsJ86ig2wYSpcSx+UWt7aQYYsEZ/Tf/pksAVQWKNcGuTVCDl9OUiPhQ7DZelNozYVWTO9Iyjd/soe4tug==", + "dev": true, + "requires": { + "@octokit/types": "^6.17.4", + "deprecation": "^2.3.1" + } + }, + "@octokit/request": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.0.tgz", + "integrity": "sha512-4cPp/N+NqmaGQwbh3vUsYqokQIzt7VjsgTYVXiwpUP2pxd5YiZB2XuTedbb0SPtv9XS7nzAKjAuQxmY8/aZkiA==", + "dev": true, + "requires": { + "@octokit/endpoint": "^6.0.1", + "@octokit/request-error": "^2.1.0", + "@octokit/types": "^6.16.1", + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.1", + "universal-user-agent": "^6.0.0" + }, + "dependencies": { + "is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true + } + } + }, + "@octokit/request-error": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz", + "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==", + "dev": true, + "requires": { + "@octokit/types": "^6.0.3", + "deprecation": "^2.0.0", + "once": "^1.4.0" + } + }, + "@octokit/rest": { + "version": "18.6.6", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.6.6.tgz", + "integrity": "sha512-kCLvz8MSh+KToXySdqUp80caBom1ZQmsX3gbT3osfbJy6fD86QObUjzAOD3D3Awz3X7ng24+lB+imvSr5EnM7g==", + "dev": true, + "requires": { + "@octokit/core": "^3.5.0", + "@octokit/plugin-paginate-rest": "^2.6.2", + "@octokit/plugin-request-log": "^1.0.2", + "@octokit/plugin-rest-endpoint-methods": "5.3.7" + } + }, + "@octokit/types": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.18.0.tgz", + "integrity": "sha512-H2xk9vlPWrG1oRzWkOCI/lcYUzskmnrF+suUKaCz+XylmmjyZWl0l+RIuuWX8EGW+uX15kBTRNKE/jpSmPA0IA==", + "dev": true, + "requires": { + "@octokit/openapi-types": "^8.2.0" + } + }, + "@polka/url": { + "version": "1.0.0-next.15", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.15.tgz", + "integrity": "sha512-15spi3V28QdevleWBNXE4pIls3nFZmBbUGrW9IVPwiQczuSb9n76TCB4bsk8TSel+I1OkHEdPhu5QKMfY6rQHA==", + "dev": true + }, + "@scarf/scarf": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.1.1.tgz", + "integrity": "sha512-VGbKDbk1RFIaSmdVb0cNjjWJoRWRI/Weo23AjRCC2nryO0iAS8pzsToJfPVPtVs74WHw4L1UTADNdIYRLkirZQ==" + }, + "@schematics/angular": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-12.0.4.tgz", + "integrity": "sha512-rC4/+c6p3S/ezDeJzAstrwzdpYgcYzHumtzVSDDM+3Kx0QBUTq/Nj6sk1e2C/fgtV5Jb2INEkTvrih+HP7I0wA==", + "dev": true, + "requires": { + "@angular-devkit/core": "12.0.4", + "@angular-devkit/schematics": "12.0.4", + "jsonc-parser": "3.0.0" + }, + "dependencies": { + "@angular-devkit/core": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-12.0.4.tgz", + "integrity": "sha512-gtQkLXuQK7NPkurw49//MFZWoRa9aVCIbxE2uxbDAzzQengx9nLUoezS2xVdM7m/SqVK72YL+ZFfSTXzfiSdnA==", + "dev": true, + "requires": { + "ajv": "8.2.0", + "ajv-formats": "2.0.2", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.7", + "source-map": "0.7.3" + } + }, + "ajv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.2.0.tgz", + "integrity": "sha512-WSNGFuyWd//XO8n/m/EaOlNLtO0yL8EXT/74LqT4khdhpZjP7lkj/kT5uwRmGitKEVp/Oj7ZUHeGfPtgHhQ5CA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-formats": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.0.2.tgz", + "integrity": "sha512-Brah4Uo5/U8v76c6euTwtjVFFaVishwnJrQBYpev1JRh4vjA1F4HY3UzQez41YUCszUCXKagG8v6eVRBHV1gkw==", + "dev": true, + "requires": { + "ajv": "^8.0.0" + } + } + } + }, + "@sideway/address": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.2.tgz", + "integrity": "sha512-idTz8ibqWFrPU8kMirL0CoPH/A29XOzzAzpyN3zQ4kAWnzmNfFmRaoMNN6VI8ske5M73HZyhIaW4OuSFIdM4oA==", + "dev": true, + "requires": { + "@hapi/hoek": "^9.0.0" + } + }, + "@sideway/formula": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz", + "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==", + "dev": true + }, + "@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", + "dev": true + }, + "@sinonjs/commons": { + "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" + } + }, + "@sinonjs/fake-timers": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", + "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true + }, + "@trysound/sax": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.1.1.tgz", + "integrity": "sha512-Z6DoceYb/1xSg5+e+ZlPZ9v0N16ZvZ+wYMraFue4HYrE4ttONKtsvruIRf6t9TBR0YvSOfi1hUU0fJfBLCDYow==", + "dev": true + }, + "@tsconfig/node10": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", + "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", + "dev": true + }, + "@tsconfig/node12": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", + "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", + "dev": true + }, + "@tsconfig/node14": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", + "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", + "dev": true + }, + "@tsconfig/node16": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.1.tgz", + "integrity": "sha512-FTgBI767POY/lKNDNbIzgAX6miIDBs6NTCbdlDb8TrWovHsSvaVIZDlTqym29C6UqhzwcJx4CYr+AlrMywA0cA==", + "dev": true + }, + "@types/babel__core": { + "version": "7.1.14", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.14.tgz", + "integrity": "sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", + "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", + "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.0.tgz", + "integrity": "sha512-IilJZ1hJBUZwMOVDNTdflOOLzJB/ZtljYVa7k3gEZN/jqIJIPkWHC6dvbX+DD2CwZDHB9wAKzZPzzqMIkW37/w==", + "dev": true, + "requires": { + "@babel/types": "^7.3.0" + } + }, + "@types/concat-stream": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-OU2+C7X+5Gs42JZzXoto7yOQ0A0=", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/eslint": { + "version": "7.2.13", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.13.tgz", + "integrity": "sha512-LKmQCWAlnVHvvXq4oasNUMTJJb2GwSyTY8+1C7OH5ILR8mPLaljv1jxL1bXW3xB3jFbQxTKxJAvI8PyjB09aBg==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.0.tgz", + "integrity": "sha512-O/ql2+rrCUe2W2rs7wMR+GqPRcgB6UiqN5RhrR5xruFlY7l9YLMn0ZkDzjoHLeiFkR8MCQZVudUuuvQ2BLC9Qw==", + "dev": true, + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "0.0.49", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.49.tgz", + "integrity": "sha512-K1AFuMe8a+pXmfHTtnwBvqoEylNKVeaiKYkjmcEAdytMQVJ/i9Fu7sc13GxgXdO49gkE7Hy8SyJonUZUn+eVaw==", + "dev": true + }, + "@types/expect": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/@types/expect/-/expect-1.20.4.tgz", + "integrity": "sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==", + "dev": true + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha1-yayFsqX9GENbjIXZ7LUObWyJP/g=", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/graceful-fs": { + "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": "*" + } + }, + "@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==", + "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": "*" + } + }, + "@types/istanbul-reports": { + "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": "*" + } + }, + "@types/jest": { + "version": "26.0.23", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.23.tgz", + "integrity": "sha512-ZHLmWMJ9jJ9PTiT58juykZpL7KjwJywFN3Rr2pTSkyQfydf/rk22yS7W8p5DaVUMQ2BQC7oYiU3FjbTM/mYrOA==", + "dev": true, + "requires": { + "jest-diff": "^26.0.0", + "pretty-format": "^26.0.0" + } + }, + "@types/json-schema": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", + "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", + "dev": true + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, + "@types/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==", + "dev": true + }, + "@types/node": { + "version": "15.12.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.2.tgz", + "integrity": "sha512-zjQ69G564OCIWIOHSXyQEEDpdpGl+G348RAKY0XXy9Z5kU9Vzv1GMNnkar/ZJ8dzXB3COzD9Mo9NtRZ4xfgUww==", + "dev": true + }, + "@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", + "dev": true + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "@types/prettier": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.3.1.tgz", + "integrity": "sha512-NVkb4p4YjI8E3O6+1m8I+8JlMpFZwfSbPGdaw0wXuyPRTEz0SLKwBUWNSO7Maoi8tQMPC8JLZNWkrcKPI7/sLA==", + "dev": true + }, + "@types/qs": { + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.6.tgz", + "integrity": "sha512-0/HnwIfW4ki2D8L8c9GVcG5I72s9jP5GSLVF0VIXDW00kmIpA6O33G7a8n59Tmh7Nz0WUC3rSb7PTY/sdW2JzA==", + "dev": true + }, + "@types/sockjs-client": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@types/sockjs-client/-/sockjs-client-1.5.0.tgz", + "integrity": "sha512-r8ENXtljrt8U6knz4fWsiuUVrDk9nkBeJOePWCzUJDRS20MN/OWoZj+gbsPhWSXSXF1aUaS4iAE4xa5jCFW9Dw==", + "dev": true + }, + "@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", + "dev": true + }, + "@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==", + "dev": true + }, + "@types/vinyl": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/vinyl/-/vinyl-2.0.5.tgz", + "integrity": "sha512-1m6uReH8R/RuLVQGvTT/4LlWq67jZEUxp+FBHt0hYv2BT7TUwFbKI0wa7JZVEU/XtlcnX1QcTuZ36es4rGj7jg==", + "dev": true, + "requires": { + "@types/expect": "^1.20.4", + "@types/node": "*" + } + }, + "@types/webpack-sources": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.9.tgz", + "integrity": "sha512-bvzMnzqoK16PQIC8AYHNdW45eREJQMd6WG/msQWX5V2+vZmODCOPb4TJcbgRljTZZTwTM4wUMcsI8FftNA7new==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.6.1" + }, + "dependencies": { + "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 + } + } + }, + "@types/yargs": { + "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": "*" + } + }, + "@types/yargs-parser": { + "version": "20.2.1", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", + "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==", + "dev": true + }, + "@typescript-eslint/eslint-plugin": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.27.0.tgz", + "integrity": "sha512-DsLqxeUfLVNp3AO7PC3JyaddmEHTtI9qTSAs+RB6ja27QvIM0TA8Cizn1qcS6vOu+WDLFJzkwkgweiyFhssDdQ==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "4.27.0", + "@typescript-eslint/scope-manager": "4.27.0", + "debug": "^4.3.1", + "functional-red-black-tree": "^1.0.1", + "lodash": "^4.17.21", + "regexpp": "^3.1.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "dependencies": { + "@typescript-eslint/experimental-utils": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.27.0.tgz", + "integrity": "sha512-n5NlbnmzT2MXlyT+Y0Jf0gsmAQzCnQSWXKy4RGSXVStjDvS5we9IWbh7qRVKdGcxT0WYlgcCYUK/HRg7xFhvjQ==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.7", + "@typescript-eslint/scope-manager": "4.27.0", + "@typescript-eslint/types": "4.27.0", + "@typescript-eslint/typescript-estree": "4.27.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + } + }, + "@typescript-eslint/types": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.27.0.tgz", + "integrity": "sha512-I4ps3SCPFCKclRcvnsVA/7sWzh7naaM/b4pBO2hVxnM3wrU51Lveybdw5WoIktU/V4KfXrTt94V9b065b/0+wA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.27.0.tgz", + "integrity": "sha512-KH03GUsUj41sRLLEy2JHstnezgpS5VNhrJouRdmh6yNdQ+yl8w5LrSwBkExM+jWwCJa7Ct2c8yl8NdtNRyQO6g==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.27.0", + "@typescript-eslint/visitor-keys": "4.27.0", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + } + }, + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" + } + } + } + }, + "@typescript-eslint/experimental-utils": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.23.0.tgz", + "integrity": "sha512-WAFNiTDnQfrF3Z2fQ05nmCgPsO5o790vOhmWKXbbYQTO9erE1/YsFot5/LnOUizLzU2eeuz6+U/81KV5/hFTGA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/scope-manager": "4.23.0", + "@typescript-eslint/types": "4.23.0", + "@typescript-eslint/typescript-estree": "4.23.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + }, + "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.23.0.tgz", + "integrity": "sha512-ZZ21PCFxPhI3n0wuqEJK9omkw51wi2bmeKJvlRZPH5YFkcawKOuRMQMnI8mH6Vo0/DoHSeZJnHiIx84LmVQY+w==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.23.0", + "@typescript-eslint/visitor-keys": "4.23.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.23.0.tgz", + "integrity": "sha512-5PNe5cmX9pSifit0H+nPoQBXdbNzi5tOEec+3riK+ku4e3er37pKxMKDH5Ct5Y4fhWxcD4spnlYjxi9vXbSpwg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.23.0", + "eslint-visitor-keys": "^2.0.0" + } + } + } + }, + "@typescript-eslint/parser": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.27.0.tgz", + "integrity": "sha512-XpbxL+M+gClmJcJ5kHnUpBGmlGdgNvy6cehgR6ufyxkEJMGP25tZKCaKyC0W/JVpuhU3VU1RBn7SYUPKSMqQvQ==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "4.27.0", + "@typescript-eslint/types": "4.27.0", + "@typescript-eslint/typescript-estree": "4.27.0", + "debug": "^4.3.1" + }, + "dependencies": { + "@typescript-eslint/types": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.27.0.tgz", + "integrity": "sha512-I4ps3SCPFCKclRcvnsVA/7sWzh7naaM/b4pBO2hVxnM3wrU51Lveybdw5WoIktU/V4KfXrTt94V9b065b/0+wA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.27.0.tgz", + "integrity": "sha512-KH03GUsUj41sRLLEy2JHstnezgpS5VNhrJouRdmh6yNdQ+yl8w5LrSwBkExM+jWwCJa7Ct2c8yl8NdtNRyQO6g==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.27.0", + "@typescript-eslint/visitor-keys": "4.27.0", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + } + } + } + }, + "@typescript-eslint/scope-manager": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.27.0.tgz", + "integrity": "sha512-DY73jK6SEH6UDdzc6maF19AHQJBFVRf6fgAXHPXCGEmpqD4vYgPEzqpFz1lf/daSbOcMpPPj9tyXXDPW2XReAw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.27.0", + "@typescript-eslint/visitor-keys": "4.27.0" + }, + "dependencies": { + "@typescript-eslint/types": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.27.0.tgz", + "integrity": "sha512-I4ps3SCPFCKclRcvnsVA/7sWzh7naaM/b4pBO2hVxnM3wrU51Lveybdw5WoIktU/V4KfXrTt94V9b065b/0+wA==", + "dev": true + } + } + }, + "@typescript-eslint/types": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.23.0.tgz", + "integrity": "sha512-oqkNWyG2SLS7uTWLZf6Sr7Dm02gA5yxiz1RP87tvsmDsguVATdpVguHr4HoGOcFOpCvx9vtCSCyQUGfzq28YCw==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.23.0.tgz", + "integrity": "sha512-5Sty6zPEVZF5fbvrZczfmLCOcby3sfrSPu30qKoY1U3mca5/jvU5cwsPb/CO6Q3ByRjixTMIVsDkqwIxCf/dMw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.23.0", + "@typescript-eslint/visitor-keys": "4.23.0", + "debug": "^4.1.1", + "globby": "^11.0.1", + "is-glob": "^4.0.1", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + }, + "dependencies": { + "@typescript-eslint/visitor-keys": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.23.0.tgz", + "integrity": "sha512-5PNe5cmX9pSifit0H+nPoQBXdbNzi5tOEec+3riK+ku4e3er37pKxMKDH5Ct5Y4fhWxcD4spnlYjxi9vXbSpwg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.23.0", + "eslint-visitor-keys": "^2.0.0" + } + } + } + }, + "@typescript-eslint/visitor-keys": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.27.0.tgz", + "integrity": "sha512-es0GRYNZp0ieckZ938cEANfEhsfHrzuLrePukLKtY3/KPXcq1Xd555Mno9/GOgXhKzn0QfkDLVgqWO3dGY80bg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.27.0", + "eslint-visitor-keys": "^2.0.0" + }, + "dependencies": { + "@typescript-eslint/types": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.27.0.tgz", + "integrity": "sha512-I4ps3SCPFCKclRcvnsVA/7sWzh7naaM/b4pBO2hVxnM3wrU51Lveybdw5WoIktU/V4KfXrTt94V9b065b/0+wA==", + "dev": true + } + } + }, + "@webassemblyjs/ast": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.0.tgz", + "integrity": "sha512-kX2W49LWsbthrmIRMbQZuQDhGtjyqXfEmmHyEi4XWnSZtPmxY0+3anPIzsnRb45VH/J55zlOfWvZuY47aJZTJg==", + "dev": true, + "requires": { + "@webassemblyjs/helper-numbers": "1.11.0", + "@webassemblyjs/helper-wasm-bytecode": "1.11.0" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.0.tgz", + "integrity": "sha512-Q/aVYs/VnPDVYvsCBL/gSgwmfjeCb4LW8+TMrO3cSzJImgv8lxxEPM2JA5jMrivE7LSz3V+PFqtMbls3m1exDA==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.0.tgz", + "integrity": "sha512-baT/va95eXiXb2QflSx95QGT5ClzWpGaa8L7JnJbgzoYeaA27FCvuBXU758l+KXWRndEmUXjP0Q5fibhavIn8w==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.0.tgz", + "integrity": "sha512-u9HPBEl4DS+vA8qLQdEQ6N/eJQ7gT7aNvMIo8AAWvAl/xMrcOSiI2M0MAnMCy3jIFke7bEee/JwdX1nUpCtdyA==", + "dev": true + }, + "@webassemblyjs/helper-numbers": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.0.tgz", + "integrity": "sha512-DhRQKelIj01s5IgdsOJMKLppI+4zpmcMQ3XboFPLwCpSNH6Hqo1ritgHgD0nqHeSYqofA6aBN/NmXuGjM1jEfQ==", + "dev": true, + "requires": { + "@webassemblyjs/floating-point-hex-parser": "1.11.0", + "@webassemblyjs/helper-api-error": "1.11.0", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.0.tgz", + "integrity": "sha512-MbmhvxXExm542tWREgSFnOVo07fDpsBJg3sIl6fSp9xuu75eGz5lz31q7wTLffwL3Za7XNRCMZy210+tnsUSEA==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.0.tgz", + "integrity": "sha512-3Eb88hcbfY/FCukrg6i3EH8H2UsD7x8Vy47iVJrP967A9JGqgBVL9aH71SETPx1JrGsOUVLo0c7vMCN22ytJew==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.0", + "@webassemblyjs/helper-buffer": "1.11.0", + "@webassemblyjs/helper-wasm-bytecode": "1.11.0", + "@webassemblyjs/wasm-gen": "1.11.0" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.0.tgz", + "integrity": "sha512-KXzOqpcYQwAfeQ6WbF6HXo+0udBNmw0iXDmEK5sFlmQdmND+tr773Ti8/5T/M6Tl/413ArSJErATd8In3B+WBA==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.0.tgz", + "integrity": "sha512-aqbsHa1mSQAbeeNcl38un6qVY++hh8OpCOzxhixSYgbRfNWcxJNJQwe2rezK9XEcssJbbWIkblaJRwGMS9zp+g==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.0.tgz", + "integrity": "sha512-A/lclGxH6SpSLSyFowMzO/+aDEPU4hvEiooCMXQPcQFPPJaYcPQNKGOCLUySJsYJ4trbpr+Fs08n4jelkVTGVw==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.0.tgz", + "integrity": "sha512-JHQ0damXy0G6J9ucyKVXO2j08JVJ2ntkdJlq1UTiUrIgfGMmA7Ik5VdC/L8hBK46kVJgujkBIoMtT8yVr+yVOQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.0", + "@webassemblyjs/helper-buffer": "1.11.0", + "@webassemblyjs/helper-wasm-bytecode": "1.11.0", + "@webassemblyjs/helper-wasm-section": "1.11.0", + "@webassemblyjs/wasm-gen": "1.11.0", + "@webassemblyjs/wasm-opt": "1.11.0", + "@webassemblyjs/wasm-parser": "1.11.0", + "@webassemblyjs/wast-printer": "1.11.0" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.0.tgz", + "integrity": "sha512-BEUv1aj0WptCZ9kIS30th5ILASUnAPEvE3tVMTrItnZRT9tXCLW2LEXT8ezLw59rqPP9klh9LPmpU+WmRQmCPQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.0", + "@webassemblyjs/helper-wasm-bytecode": "1.11.0", + "@webassemblyjs/ieee754": "1.11.0", + "@webassemblyjs/leb128": "1.11.0", + "@webassemblyjs/utf8": "1.11.0" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.0.tgz", + "integrity": "sha512-tHUSP5F4ywyh3hZ0+fDQuWxKx3mJiPeFufg+9gwTpYp324mPCQgnuVKwzLTZVqj0duRDovnPaZqDwoyhIO8kYg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.0", + "@webassemblyjs/helper-buffer": "1.11.0", + "@webassemblyjs/wasm-gen": "1.11.0", + "@webassemblyjs/wasm-parser": "1.11.0" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.0.tgz", + "integrity": "sha512-6L285Sgu9gphrcpDXINvm0M9BskznnzJTE7gYkjDbxET28shDqp27wpruyx3C2S/dvEwiigBwLA1cz7lNUi0kw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.0", + "@webassemblyjs/helper-api-error": "1.11.0", + "@webassemblyjs/helper-wasm-bytecode": "1.11.0", + "@webassemblyjs/ieee754": "1.11.0", + "@webassemblyjs/leb128": "1.11.0", + "@webassemblyjs/utf8": "1.11.0" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.0.tgz", + "integrity": "sha512-Fg5OX46pRdTgB7rKIUojkh9vXaVN6sGYCnEiJN1GYkb0RPwShZXp6KTDqmoMdQPKhcroOXh3fEzmkWmCYaKYhQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.0", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, + "abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "dev": true + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "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" + } + }, + "acorn-jsx": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "dev": true + }, + "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==", + "dev": true + }, + "adjust-sourcemap-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" + } + }, + "after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", + "dev": true + }, + "agent-base": { + "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" + } + }, + "agentkeepalive": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.1.4.tgz", + "integrity": "sha512-+V/rGa3EuU74H6wR04plBb7Ks10FbtUQgRj/FQOG7uUIEuaINI+AiqJR1k6t3SVNs7o7ZjIdus6706qqzVq8jQ==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + } + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.0.tgz", + "integrity": "sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true + }, + "ajv-formats": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.0.tgz", + "integrity": "sha512-USH2jBb+C/hIpwD2iRjp0pe0k+MvzG0mlSn/FIdCgQhUb9ALPRjt2KIQdfZDS9r0ZIeUAg7gOu9KL0PFqGqr5Q==", + "dev": true, + "requires": { + "ajv": "^8.0.0" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true + }, + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", + "dev": true + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-escapes": { + "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" + } + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "dev": true + }, + "anymatch": { + "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" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "argparse": { + "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" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-differ": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", + "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", + "dev": true + }, + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "arraybuffer.slice": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", + "dev": true + }, + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "dev": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "async-each-series": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-0.1.1.tgz", + "integrity": "sha1-dhfBkXQB/Yykooqtzj266Yr+tDI=", + "dev": true + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "atomically": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/atomically/-/atomically-1.7.0.tgz", + "integrity": "sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==", + "dev": true + }, + "autoprefixer": { + "version": "9.8.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz", + "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==", + "dev": true, + "requires": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", + "colorette": "^1.2.1", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "aws-sdk": { + "version": "2.927.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.927.0.tgz", + "integrity": "sha512-S1dbpq26bQNYBQPHAsZBt0/L/e0FAWFdjjQoU3zdaVIXa08eA9d/oRI3kEs568ErJgBjwWU1CUUlr1byBxKjUQ==", + "dev": true, + "requires": { + "buffer": "4.9.2", + "events": "1.1.1", + "ieee754": "1.1.13", + "jmespath": "0.15.0", + "querystring": "0.2.0", + "sax": "1.2.1", + "url": "0.10.3", + "uuid": "3.3.2", + "xml2js": "0.4.19" + }, + "dependencies": { + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true + } + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true + }, + "axios": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", + "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", + "dev": true, + "requires": { + "follow-redirects": "^1.10.0" + } + }, + "babel-jest": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.0.6.tgz", + "integrity": "sha512-iTJyYLNc4wRofASmofpOc5NK9QunwMk+TLFgGXsTFS8uEqmd8wdI7sga0FPe2oVH3b5Agt/EAK1QjPEuKL8VfA==", + "dev": true, + "requires": { + "@jest/transform": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^27.0.6", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "slash": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "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" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "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" + } + }, + "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 + }, + "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 + }, + "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" + } + } + } + }, + "babel-loader": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz", + "integrity": "sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==", + "dev": true, + "requires": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^1.4.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + } + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-istanbul": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", + "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^4.0.0", + "test-exclude": "^6.0.0" + } + }, + "babel-plugin-jest-hoist": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.0.6.tgz", + "integrity": "sha512-CewFeM9Vv2gM7Yr9n5eyyLVPRSiBnk6lKZRjgwYnGKSl9M14TMn2vkN02wTF04OGuSDLEzlWiMzvjXuW9mB6Gw==", + "dev": true, + "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-plugin-polyfill-corejs2": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz", + "integrity": "sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.2.2", + "semver": "^6.1.1" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.3.tgz", + "integrity": "sha512-rCOFzEIJpJEAU14XCcV/erIf/wZQMmMT5l5vXOpL5uoznyOGfDIjPj6FVytMvtzaKSTSVKouOCTPJ5OMUZH30g==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.2.2", + "core-js-compat": "^3.14.0" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz", + "integrity": "sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.2.2" + } + }, + "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", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "requires": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + } + }, + "babel-preset-jest": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.0.6.tgz", + "integrity": "sha512-WObA0/Biw2LrVVwZkF/2GqbOdzhKD6Fkdwhoy9ASIrOWr/zodcSpQh72JOkEn6NWyjmnPDjNSqaGN4KnpKzhXw==", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^27.0.6", + "babel-preset-current-node-syntax": "^1.0.0" + } + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + } + } + }, + "base64-arraybuffer": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", + "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=", + "dev": true + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "before-after-hook": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.2.tgz", + "integrity": "sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ==", + "dev": true + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "bin-links": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/bin-links/-/bin-links-2.2.1.tgz", + "integrity": "sha512-wFzVTqavpgCCYAh8SVBdnZdiQMxTkGR+T3b14CNpBXIBe2neJWaMGAZ55XWWHELJJ89dscuq0VCBqcVaIOgCMg==", + "dev": true, + "requires": { + "cmd-shim": "^4.0.1", + "mkdirp": "^1.0.3", + "npm-normalize-package-bin": "^1.0.0", + "read-cmd-shim": "^2.0.0", + "rimraf": "^3.0.0", + "write-file-atomic": "^3.0.3" + } + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "binaryextensions": { + "version": "4.15.0", + "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-4.15.0.tgz", + "integrity": "sha512-MkUl3szxXolQ2scI1PM14WOT951KnaTNJ0eMKg7WzOI4kvSxyNo/Cygx4LOBNhwyINhAuSQpJW1rYD9aBSxGaw==", + "dev": true + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + } + } + }, + "blob": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", + "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", + "dev": true + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "bootstrap": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.0.tgz", + "integrity": "sha512-Io55IuQY3kydzHtbGvQya3H+KorS/M9rSNyfCGCg9WZ4pyT/lCxIlpJgG1GXW/PswzC84Tr2fBYi+7+jFVQQBw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "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" + } + }, + "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==", + "dev": true + }, + "browser-sync": { + "version": "2.26.14", + "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.26.14.tgz", + "integrity": "sha512-3TtpsheGolJT6UFtM2CZWEcGJmI4ZEvoCKiKE2bvcDnPxRkhQT4nIGVtfiyPcoHKXGM0LwMOZmYJNWfiNfVXWA==", + "dev": true, + "requires": { + "browser-sync-client": "^2.26.14", + "browser-sync-ui": "^2.26.14", + "bs-recipes": "1.3.4", + "bs-snippet-injector": "^2.0.1", + "chokidar": "^3.5.1", + "connect": "3.6.6", + "connect-history-api-fallback": "^1", + "dev-ip": "^1.0.1", + "easy-extender": "^2.3.4", + "eazy-logger": "3.1.0", + "etag": "^1.8.1", + "fresh": "^0.5.2", + "fs-extra": "3.0.1", + "http-proxy": "^1.18.1", + "immutable": "^3", + "localtunnel": "^2.0.1", + "micromatch": "^4.0.2", + "opn": "5.3.0", + "portscanner": "2.1.1", + "qs": "6.2.3", + "raw-body": "^2.3.2", + "resp-modifier": "6.0.2", + "rx": "4.1.0", + "send": "0.16.2", + "serve-index": "1.9.1", + "serve-static": "1.13.2", + "server-destroy": "1.0.1", + "socket.io": "2.4.0", + "ua-parser-js": "^0.7.18", + "yargs": "^15.4.1" + }, + "dependencies": { + "ansi-styles": { + "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" + } + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "color-convert": { + "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" + } + }, + "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 + }, + "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" + } + }, + "locate-path": { + "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" + } + }, + "p-limit": { + "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" + } + }, + "p-locate": { + "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" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "browser-sync-client": { + "version": "2.27.4", + "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.27.4.tgz", + "integrity": "sha512-l0krAGZnpLaD+tUYdM25WeS4FP73ZoPeaxlVzOvmtL9uKSlvpmywsnDwa3PJzc3ubmDPAcD74ifJjl6MmVksXw==", + "dev": true, + "requires": { + "etag": "1.8.1", + "fresh": "0.5.2", + "mitt": "^1.1.3", + "rxjs": "^5.5.6" + }, + "dependencies": { + "rxjs": { + "version": "5.5.12", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", + "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", + "dev": true, + "requires": { + "symbol-observable": "1.0.1" + } + }, + "symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", + "dev": true + } + } + }, + "browser-sync-ui": { + "version": "2.27.4", + "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.27.4.tgz", + "integrity": "sha512-E58Mb6ycz57Nm393oqVJj4jxuLJH3MhZnY8AV+zd9LsNVGZjrKRNNIw5JPYYguyb37ZjLjq2x4u+38mRv3Sb7g==", + "dev": true, + "requires": { + "async-each-series": "0.1.1", + "connect-history-api-fallback": "^1", + "immutable": "^3", + "server-destroy": "1.0.1", + "socket.io-client": "^2.4.0", + "stream-throttle": "^0.1.3" + } + }, + "browser-sync-webpack-plugin": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/browser-sync-webpack-plugin/-/browser-sync-webpack-plugin-2.3.0.tgz", + "integrity": "sha512-MDvuRrTCtoL11dTdwMymo9CNJvYxJoW67gOO61cThfzHNX40S5WcBU+0bVQ86ll7r7aNpNgyzxF7RtnXMTDbyA==", + "dev": true, + "requires": { + "lodash": "^4" + } + }, + "browserslist": { + "version": "4.16.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", + "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001219", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.723", + "escalade": "^3.1.1", + "node-releases": "^1.1.71" + } + }, + "bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "requires": { + "fast-json-stable-stringify": "2.x" + } + }, + "bs-recipes": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/bs-recipes/-/bs-recipes-1.3.4.tgz", + "integrity": "sha1-DS1NSKcYyMBEdp/cT4lZLci2lYU=", + "dev": true + }, + "bs-snippet-injector": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/bs-snippet-injector/-/bs-snippet-injector-2.0.1.tgz", + "integrity": "sha1-YbU5PxH1JVntEgaTEANDtu2wTdU=", + "dev": true + }, + "bser": { + "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" + } + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "builtins": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", + "dev": true + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + }, + "cacache": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.2.0.tgz", + "integrity": "sha512-uKoJSHmnrqXgthDFx/IU6ED/5xd+NNGe+Bb+kLZy7Ku4P+BaiWEUflAKPZ7eAzsYGcsAGASJZsybXp+quEcHTw==", + "dev": true, + "requires": { + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "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", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001241", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001241.tgz", + "integrity": "sha512-1uoSZ1Pq1VpH0WerIMqwptXHNNGfdl7d1cJUFs80CwQ/lVzdhTvsFZCeNFslze7AjsQnb4C85tzclPa1VShbeQ==", + "dev": true + }, + "canonical-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/canonical-path/-/canonical-path-1.0.0.tgz", + "integrity": "sha512-feylzsbDxi1gPZ1IjystzIQZagYYLvfKrSuygUCgf7z6x790VEzze5QEkdSV1U58RA7Hi0+v6fv4K54atOzATg==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "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==", + "dev": true + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "chevrotain": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-9.0.2.tgz", + "integrity": "sha512-6ZjgUdGvU4j1n1b2hTjb79Vr2V+qNtmP7f8FVt79+kdAYcUj2QfYNwI8ycCVsgHD/dIeO5Vr1hckkkfliVQTfg==", + "dev": true, + "requires": { + "@chevrotain/types": "^9.0.2", + "@chevrotain/utils": "^9.0.2", + "regexp-to-ast": "0.5.0" + } + }, + "chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "circular-dependency-plugin": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-5.2.2.tgz", + "integrity": "sha512-g38K9Cm5WRwlaH6g03B9OEz/0qRizI+2I7n+Gz+L5DxXJAPAiWQvwlYNm1V1jkdpUv95bOe/ASm2vfi/G560jQ==", + "dev": true + }, + "cjs-module-lexer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.1.tgz", + "integrity": "sha512-jVamGdJPDeuQilKhvVn1h3knuMOZzr8QDnpk+M9aMlCaMkTDd6fBWPhiDqFvFZ07pL0liqabAiuy8SY4jGHeaw==", + "dev": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-spinners": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.0.tgz", + "integrity": "sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q==", + "dev": true + }, + "cli-table": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.6.tgz", + "integrity": "sha512-ZkNZbnZjKERTY5NwC2SeMeLeifSPq/pubeRoTpdr3WchLlnZg6hEgvHkK5zL7KNFdd9PmHN8lxrENUwI3cE8vQ==", + "dev": true, + "requires": { + "colors": "1.0.3" + }, + "dependencies": { + "colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", + "dev": true + } + } + }, + "cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "requires": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + } + }, + "cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "dev": true + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "cloneable-readable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", + "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "cmd-shim": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-4.1.0.tgz", + "integrity": "sha512-lb9L7EM4I/ZRVuljLPEtUJOP+xiQVknZ4ZMpMgEp4JzNldPb27HU03hi6K1/6CoIuit/Zm/LQXySErFeXxDprw==", + "dev": true, + "requires": { + "mkdirp-infer-owner": "^2.0.0" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "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==", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", + "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==", + "dev": true, + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.2" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "color-string": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz", + "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==", + "dev": true, + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "colord": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.1.0.tgz", + "integrity": "sha512-H5sDP9XDk2uP+x/xSGkgB9SEFc1bojdI5DMKU0jmSXQtml2GIe48dj1DcSS0e53QQAHn+JKqUXbGeGX24xWD7w==", + "dev": true + }, + "colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", + "dev": true + }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true + }, + "colorspace": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.2.tgz", + "integrity": "sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ==", + "dev": true, + "requires": { + "color": "3.0.x", + "text-hex": "1.0.x" + } + }, + "combined-stream": { + "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" + } + }, + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true + }, + "common-ancestor-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", + "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "compare-versions": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", + "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", + "dev": true + }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", + "dev": true + }, + "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 + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", + "dev": true + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "concurrently": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-6.2.0.tgz", + "integrity": "sha512-v9I4Y3wFoXCSY2L73yYgwA9ESrQMpRn80jMcqMgHx720Hecz2GZAvTI6bREVST6lkddNypDKRN22qhK0X8Y00g==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "date-fns": "^2.16.1", + "lodash": "^4.17.21", + "read-pkg": "^5.2.0", + "rxjs": "^6.6.3", + "spawn-command": "^0.0.2-1", + "supports-color": "^8.1.0", + "tree-kill": "^1.2.2", + "yargs": "^16.2.0" + }, + "dependencies": { + "ansi-styles": { + "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" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "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" + } + } + } + }, + "color-convert": { + "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" + } + }, + "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 + }, + "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 + }, + "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" + } + } + } + }, + "conf": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/conf/-/conf-10.0.1.tgz", + "integrity": "sha512-QClEoNcruwBL84QgMEPHibL3ERxWIrRKhbjJKG1VsFBadm5QpS0jsu4QjY/maxUvhyAKXeyrs+ws+lC6PajnEg==", + "dev": true, + "requires": { + "ajv": "^8.1.0", + "ajv-formats": "^2.0.2", + "atomically": "^1.7.0", + "debounce-fn": "^4.0.0", + "dot-prop": "^6.0.1", + "env-paths": "^2.2.1", + "json-schema-typed": "^7.0.3", + "onetime": "^5.1.2", + "pkg-up": "^3.1.0", + "semver": "^7.3.5" + } + }, + "connect": { + "version": "3.6.6", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", + "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.0", + "parseurl": "~1.3.2", + "utils-merge": "1.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-anything": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.3.tgz", + "integrity": "sha512-GK6QUtisv4fNS+XcI7shX0Gx9ORg7QqIznyfho79JTnX1XhLiyZHfftvGiziqzRiEi/Bjhgpi+D2o7HxJFPnDQ==", + "dev": true, + "requires": { + "is-what": "^3.12.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "copy-webpack-plugin": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-9.0.0.tgz", + "integrity": "sha512-k8UB2jLIb1Jip2nZbCz83T/XfhfjX6mB1yLJNYKrpYi7FQimfOoFv/0//iT6HV1K8FwUB5yUbCcnpLebJXJTug==", + "dev": true, + "requires": { + "fast-glob": "^3.2.5", + "glob-parent": "^6.0.0", + "globby": "^11.0.3", + "normalize-path": "^3.0.0", + "p-limit": "^3.1.0", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "glob-parent": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.0.tgz", + "integrity": "sha512-Hdd4287VEJcZXUwv1l8a+vXC1GjOQqXe+VS30w/ypihpcnu9M1n3xeYeJu5CBpeEQj2nAab2xxz28GuA3vp4Ww==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "core-js": { + "version": "3.15.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.15.1.tgz", + "integrity": "sha512-h8VbZYnc9pDzueiS2610IULDkpFFPunHwIpl8yRwFahAEEdSpHlTy3h3z3rKq5h11CaUdBEeRViu9AYvbxiMeg==", + "dev": true + }, + "core-js-compat": { + "version": "3.15.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.15.2.tgz", + "integrity": "sha512-Wp+BJVvwopjI+A1EFqm2dwUmWYXrvucmtIB2LgXn/Rb+gWPKYxtmb4GKHGKG/KGF1eK9jfjzT38DITbTOCX/SQ==", + "dev": true, + "requires": { + "browserslist": "^4.16.6", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cosmiconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "critters": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.10.tgz", + "integrity": "sha512-p5VKhP1803+f+0Jq5P03w1SbiHtpAKm+1EpJHkiPxQPq0Vu9QLZHviJ02GRrWi0dlcJqrmzMWInbwp4d22RsGw==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "css": "^3.0.0", + "parse5": "^6.0.1", + "parse5-htmlparser2-tree-adapter": "^6.0.1", + "pretty-bytes": "^5.3.0" + }, + "dependencies": { + "ansi-styles": { + "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" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "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" + } + }, + "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 + }, + "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 + }, + "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" + } + } + } + }, + "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", + "which": "^2.0.1" + } + }, + "css": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz", + "integrity": "sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "source-map": "^0.6.1", + "source-map-resolve": "^0.6.0" + }, + "dependencies": { + "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 + } + } + }, + "css-blank-pseudo": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz", + "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==", + "dev": true, + "requires": { + "postcss": "^7.0.5" + }, + "dependencies": { + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "css-color-names": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-1.0.1.tgz", + "integrity": "sha512-/loXYOch1qU1biStIFsHH8SxTmOseh1IJqFvy8IujXOm1h+QjUdDhkzOrR5HG8K8mlxREj0yfi8ewCHx0eMxzA==", + "dev": true + }, + "css-declaration-sorter": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.0.3.tgz", + "integrity": "sha512-52P95mvW1SMzuRZegvpluT6yEv0FqQusydKQPZsNN5Q7hh8EwQvN8E2nwuJ16BBvNN6LcoIZXu/Bk58DAhrrxw==", + "dev": true, + "requires": { + "timsort": "^0.3.0" + } + }, + "css-has-pseudo": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz", + "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==", + "dev": true, + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^5.0.0-rc.4" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "dev": true + }, + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "dev": true, + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "css-loader": { + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.2.6.tgz", + "integrity": "sha512-0wyN5vXMQZu6BvjbrPdUJvkCzGEO24HC7IS7nW4llc6BBFC+zwR9CKtYGv63Puzsg10L/o12inMY5/2ByzfD6w==", + "dev": true, + "requires": { + "icss-utils": "^5.1.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.15", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^3.0.0", + "semver": "^7.3.5" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "css-minimizer-webpack-plugin": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.0.1.tgz", + "integrity": "sha512-RGFIv6iZWUPO2T1vE5+5pNCSs2H2xtHYRdfZPiiNH8Of6QOn9BeFnZSoHiQMkmsxOO/JkPe4BpKfs7slFIWcTA==", + "dev": true, + "requires": { + "cssnano": "^5.0.0", + "jest-worker": "^27.0.2", + "p-limit": "^3.0.2", + "postcss": "^8.2.9", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1", + "source-map": "^0.6.1" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "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 + } + } + }, + "css-parse": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-2.0.0.tgz", + "integrity": "sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q=", + "dev": true, + "requires": { + "css": "^2.0.0" + }, + "dependencies": { + "css": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + } + }, + "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 + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + } + } + }, + "css-prefers-color-scheme": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz", + "integrity": "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==", + "dev": true, + "requires": { + "postcss": "^7.0.5" + }, + "dependencies": { + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "css-select": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", + "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^5.0.0", + "domhandler": "^4.2.0", + "domutils": "^2.6.0", + "nth-check": "^2.0.0" + } + }, + "css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "requires": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "dependencies": { + "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 + } + } + }, + "css-what": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.1.tgz", + "integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==", + "dev": true + }, + "cssdb": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz", + "integrity": "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==", + "dev": true + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "cssnano": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.0.6.tgz", + "integrity": "sha512-NiaLH/7yqGksFGsFNvSRe2IV/qmEBAeDE64dYeD8OBrgp6lE8YoMeQJMtsv5ijo6MPyhuoOvFhI94reahBRDkw==", + "dev": true, + "requires": { + "cosmiconfig": "^7.0.0", + "cssnano-preset-default": "^5.1.3", + "is-resolvable": "^1.1.0" + } + }, + "cssnano-preset-default": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.1.3.tgz", + "integrity": "sha512-qo9tX+t4yAAZ/yagVV3b+QBKeLklQbmgR3wI7mccrDcR+bEk9iHgZN1E7doX68y9ThznLya3RDmR+nc7l6/2WQ==", + "dev": true, + "requires": { + "css-declaration-sorter": "^6.0.3", + "cssnano-utils": "^2.0.1", + "postcss-calc": "^8.0.0", + "postcss-colormin": "^5.2.0", + "postcss-convert-values": "^5.0.1", + "postcss-discard-comments": "^5.0.1", + "postcss-discard-duplicates": "^5.0.1", + "postcss-discard-empty": "^5.0.1", + "postcss-discard-overridden": "^5.0.1", + "postcss-merge-longhand": "^5.0.2", + "postcss-merge-rules": "^5.0.2", + "postcss-minify-font-values": "^5.0.1", + "postcss-minify-gradients": "^5.0.1", + "postcss-minify-params": "^5.0.1", + "postcss-minify-selectors": "^5.1.0", + "postcss-normalize-charset": "^5.0.1", + "postcss-normalize-display-values": "^5.0.1", + "postcss-normalize-positions": "^5.0.1", + "postcss-normalize-repeat-style": "^5.0.1", + "postcss-normalize-string": "^5.0.1", + "postcss-normalize-timing-functions": "^5.0.1", + "postcss-normalize-unicode": "^5.0.1", + "postcss-normalize-url": "^5.0.2", + "postcss-normalize-whitespace": "^5.0.1", + "postcss-ordered-values": "^5.0.2", + "postcss-reduce-initial": "^5.0.1", + "postcss-reduce-transforms": "^5.0.1", + "postcss-svgo": "^5.0.2", + "postcss-unique-selectors": "^5.0.1" + } + }, + "cssnano-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-2.0.1.tgz", + "integrity": "sha512-i8vLRZTnEH9ubIyfdZCAdIdgnHAUeQeByEeQ2I7oTilvP9oHO6RScpeq3GsFUVqeB8uZgOQ9pw8utofNn32hhQ==", + "dev": true + }, + "csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "requires": { + "css-tree": "^1.1.2" + } + }, + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "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" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + } + } + }, + "dargs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", + "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "data-urls": { + "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", + "whatwg-url": "^8.0.0" + } + }, + "date-fns": { + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.22.1.tgz", + "integrity": "sha512-yUFPQjrxEmIsMqlHhAhmxkuH769baF21Kk+nZwZGyrMoyLA+LugaQtC0+Tqf9CBUUULWwUJt6Q5ySI3LJDDCGg==", + "dev": true + }, + "dateformat": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.5.1.tgz", + "integrity": "sha512-OD0TZ+B7yP7ZgpJf5K2DIbj3FZvFvxgFUuaqA/V5zTjAtAAXZ1E8bktHxmAGs4x5b7PflqA9LeQ84Og7wYtF7Q==", + "dev": true + }, + "dayjs": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.5.tgz", + "integrity": "sha512-BUFis41ikLz+65iH6LHQCDm4YPMj5r1YFLdupPIyM4SGcXMmtiLQ7U37i+hGS8urIuqe7I/ou3IS1jVc4nbN4g==" + }, + "debounce-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/debounce-fn/-/debounce-fn-4.0.0.tgz", + "integrity": "sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==", + "dev": true, + "requires": { + "mimic-fn": "^3.0.0" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "debuglog": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", + "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=", + "dev": true + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decimal.js": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", + "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", + "dev": true + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "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==", + "dev": true + }, + "default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, + "define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "dependencies": { + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "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 + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "dependency-graph": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", + "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", + "dev": true + }, + "deprecation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", + "dev": true + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true + }, + "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==", + "dev": true + }, + "detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "dev-ip": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz", + "integrity": "sha1-p2o+0YVb56ASu4rBbLgPPADcKPA=", + "dev": true + }, + "dezalgo": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", + "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", + "dev": true, + "requires": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "didyoumean": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.1.tgz", + "integrity": "sha1-6S7f2tplN9SE1zwBcv0eugxJdv8=", + "dev": true + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "diff-sequences": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", + "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "dns-packet": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", + "dev": true, + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true + }, + "domexception": { + "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" + }, + "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true + } + } + }, + "domhandler": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.0.tgz", + "integrity": "sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA==", + "dev": true, + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.7.0.tgz", + "integrity": "sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg==", + "dev": true, + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "dot-prop": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + } + }, + "drange": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/drange/-/drange-1.1.1.tgz", + "integrity": "sha512-pYxfDYpued//QpnLIm4Avk7rsNtAtQkUES2cwAYSvD/wd2pKD71gN2Ebj3e7klzXwjocvE8c5vx/1fxwpqmSxA==", + "dev": true + }, + "duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, + "easy-extender": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.4.tgz", + "integrity": "sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q==", + "dev": true, + "requires": { + "lodash": "^4.17.10" + } + }, + "eazy-logger": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eazy-logger/-/eazy-logger-3.1.0.tgz", + "integrity": "sha512-/snsn2JqBtUSSstEl4R0RKjkisGHAhvYj89i7r3ytNUKW12y178KDZwXLXIgwDqLW6E/VRMT9qfld7wvFae8bQ==", + "dev": true, + "requires": { + "tfunk": "^4.0.0" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "ejs": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.6.tgz", + "integrity": "sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==", + "dev": true, + "requires": { + "jake": "^10.6.1" + } + }, + "electron-to-chromium": { + "version": "1.3.766", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.766.tgz", + "integrity": "sha512-u2quJ862q9reRKh/je3GXis3w38+RoXH1J9N3XjtsS6NzmUAosNsyZgUVFZPN/ZlJ3v6T0rTyZR3q/J5c6Sy5w==", + "dev": true + }, + "emittery": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", + "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", + "dev": true + }, + "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==" + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "optional": true, + "requires": { + "iconv-lite": "^0.6.2" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "engine.io": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.5.0.tgz", + "integrity": "sha512-21HlvPUKaitDGE4GXNtQ7PLP0Sz4aWLddMPw2VTyFz1FVZqu/kZsJUO8WNpKuE/OCL7nkfRaOui2ZCJloGznGA==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "debug": "~4.1.0", + "engine.io-parser": "~2.2.0", + "ws": "~7.4.2" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "dev": true + } + } + }, + "engine.io-client": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.5.2.tgz", + "integrity": "sha512-QEqIp+gJ/kMHeUun7f5Vv3bteRHppHH/FMBQX/esFj/fuYfjyUKWGMo3VCvIP/V8bE9KcjHmRZrhIz2Z9oNsDA==", + "dev": true, + "requires": { + "component-emitter": "~1.3.0", + "component-inherit": "0.0.3", + "debug": "~3.1.0", + "engine.io-parser": "~2.2.0", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.6", + "parseuri": "0.0.6", + "ws": "~7.4.2", + "xmlhttprequest-ssl": "~1.6.2", + "yeast": "0.1.2" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "dev": true + } + } + }, + "engine.io-parser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.1.tgz", + "integrity": "sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==", + "dev": true, + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.4", + "blob": "0.0.5", + "has-binary2": "~1.0.2" + } + }, + "enhanced-resolve": { + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.2.tgz", + "integrity": "sha512-F27oB3WuHDzvR2DOGNTaYy0D5o0cnrv8TeI482VM4kYgQd/FT9lUQwuNsJ0oOHtBUq7eiW5ytqzp7nBFknL+GA==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + }, + "env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true + }, + "err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, + "errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/error/-/error-10.4.0.tgz", + "integrity": "sha512-YxIFEJuhgcICugOUvRx5th0UM+ActZ9sjY0QJmeVwsQdvosZ7kYzc9QqS0Da3R5iUmgU5meGIxh0xBeZpMVeLw==", + "dev": true + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-module-lexer": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.6.0.tgz", + "integrity": "sha512-f8kcHX1ArhllUtb/wVSyvygoKCznIjnxhLxy7TCvIiMdT7fL4ZDTIKaadMe6eLvOXg6Wk02UeoFgUoZ2EKZZUA==", + "dev": true + }, + "es6-promise": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.0.5.tgz", + "integrity": "sha1-eILzCt3lskDM+n99eMVIMwlRrkI=", + "dev": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "escodegen": { + "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", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + }, + "levn": { + "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" + } + }, + "optionator": { + "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", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "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" + } + } + } + }, + "eslint": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.28.0.tgz", + "integrity": "sha512-UMfH0VSjP0G4p3EWirscJEQ/cHqnT/iuH6oNZOB94nBjWbMnhGEPxsZm1eyIW0C/9jLI0Fow4W5DXLjEI7mn1g==", + "dev": true, + "requires": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-styles": { + "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" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "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" + } + }, + "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 + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "globals": { + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.9.0.tgz", + "integrity": "sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "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 + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "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" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + } + } + }, + "eslint-config-prettier": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", + "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", + "dev": true + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + }, + "eslint-webpack-plugin": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-2.5.4.tgz", + "integrity": "sha512-7rYh0m76KyKSDE+B+2PUQrlNS4HJ51t3WKpkJg6vo2jFMbEPTG99cBV0Dm7LXSHucN4WGCG65wQcRiTFrj7iWw==", + "dev": true, + "requires": { + "@types/eslint": "^7.2.6", + "arrify": "^2.0.1", + "jest-worker": "^26.6.2", + "micromatch": "^4.0.2", + "normalize-path": "^3.0.0", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "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 + }, + "jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "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" + } + } + } + }, + "espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "esprima": { + "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 + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "dev": true + }, + "eventsource": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.0.tgz", + "integrity": "sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==", + "requires": { + "original": "^1.0.0" + } + }, + "execa": { + "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", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "expect": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.0.6.tgz", + "integrity": "sha512-psNLt8j2kwg42jGBDSfAlU49CEZxejN1f1PlANWDZqIhBOVU/c2Pm888FcjWJzFewhIsNWfZJeLjUjtKGiPuSw==", + "dev": true, + "requires": { + "@jest/types": "^27.0.6", + "ansi-styles": "^5.0.0", + "jest-get-type": "^27.0.6", + "jest-matcher-utils": "^27.0.6", + "jest-message-util": "^27.0.6", + "jest-regex-util": "^27.0.6" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "faker": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/faker/-/faker-5.5.3.tgz", + "integrity": "sha512-wLTv2a28wjUyWkbnX7u/ABZBkUkIF2fCd73V6P2oFqEGEktDfzWx4UxrSqtPRw0xPRAcjeAOIiJWqZm3pP4u3g==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-glob": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.6.tgz", + "integrity": "sha512-GnLuqj/pvQ7pX8/L4J84nijv6sAnlwvSDpMkJi9i7nPmPxGtRPkBSStfvDW5l6nMdX9VWe+pkKWFTgD+vF2QSQ==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "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==", + "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=", + "dev": true + }, + "fast-safe-stringify": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", + "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==", + "dev": true + }, + "fastq": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", + "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "fb-watchman": { + "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" + } + }, + "fecha": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.1.tgz", + "integrity": "sha512-MMMQ0ludy/nBs1/o0zVOiKTpG7qMbonKUzjJgQFEuvq6INZ1OraKPRAWkBq5vlKLOUMpmNYG1JoN3oDPUQ9m3Q==", + "dev": true + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "filelist": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.2.tgz", + "integrity": "sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ==", + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "fill-range": { + "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" + } + }, + "finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.3.1", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "find-versions": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-4.0.0.tgz", + "integrity": "sha512-wgpWy002tA+wgmO27buH/9KzyEOQnKsG/R0yrcjPT9BOFm0zRBVQbZ95nRGXWMywS8YR5knRbpohio0bcJABxQ==", + "dev": true, + "requires": { + "semver-regex": "^3.1.2" + } + }, + "find-yarn-workspace-root2": { + "version": "1.2.16", + "resolved": "https://registry.npmjs.org/find-yarn-workspace-root2/-/find-yarn-workspace-root2-1.2.16.tgz", + "integrity": "sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==", + "dev": true, + "requires": { + "micromatch": "^4.0.2", + "pkg-dir": "^4.2.0" + } + }, + "first-chunk-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz", + "integrity": "sha1-G97NuOCDwGZLkZRVgVd6Q6nzHXA=", + "dev": true, + "requires": { + "readable-stream": "^2.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.0.tgz", + "integrity": "sha512-XprP7lDrVT+kE2c2YlfiV+IfS9zxukiIOvNamPNsImNhXadSsQEbosItdL9bUQlCZXR13SvPk20BjWSWLA7m4A==", + "dev": true + }, + "flatten": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", + "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==", + "dev": true + }, + "fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", + "dev": true + }, + "follow-redirects": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz", + "integrity": "sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==", + "dev": true + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "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", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "fs-extra": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", + "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^3.0.0", + "universalify": "^0.1.0" + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "fs-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "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": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "generator-jhipster": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/generator-jhipster/-/generator-jhipster-7.1.0.tgz", + "integrity": "sha512-0AgROFowVO62gn+JjTzhab5vMgbjmXRpY/5grbi/pracAq/Zw0irT9Mv6kNp7fsvrJNMZ7+U4I2BNeAJY0ldoQ==", + "dev": true, + "requires": { + "aws-sdk": "2.927.0", + "axios": "0.21.1", + "chalk": "4.1.1", + "chevrotain": "9.0.2", + "commander": "7.2.0", + "conf": "10.0.1", + "didyoumean": "1.2.1", + "ejs": "3.1.6", + "faker": "5.5.3", + "find-up": "5.0.0", + "glob": "7.1.7", + "gulp-filter": "7.0.0", + "insight": "0.10.3", + "js-yaml": "4.1.0", + "lodash": "4.17.21", + "mem-fs-editor": "^9.0.0", + "minimatch": "3.0.4", + "normalize-path": "3.0.0", + "ora": "5.4.1", + "os-locale": "5.0.0", + "parse-gitignore": "1.0.1", + "pluralize": "8.0.0", + "prettier": "2.3.1", + "prettier-plugin-java": "1.2.0", + "prettier-plugin-packagejson": "2.2.11", + "progress": "2.0.3", + "randexp": "0.5.3", + "semver": "7.3.5", + "shelljs": "0.8.4", + "then-request": "6.0.2", + "uuid": "8.3.2", + "winston": "3.3.3", + "yeoman-environment": "3.4.1", + "yeoman-generator": "5.3.0" + }, + "dependencies": { + "ansi-styles": { + "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" + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "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" + } + }, + "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 + }, + "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 + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "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" + } + } + } + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "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==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "dev": true + }, + "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==", + "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==", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "git-hooks-list": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/git-hooks-list/-/git-hooks-list-1.0.3.tgz", + "integrity": "sha512-Y7wLWcrLUXwk2noSka166byGCvhMtDRpgHdzCno1UQv/n/Hegp++a2xBWJL1lJarnKD3SWaljD+0z1ztqxuKyQ==", + "dev": true + }, + "github-username": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/github-username/-/github-username-6.0.0.tgz", + "integrity": "sha512-7TTrRjxblSI5l6adk9zd+cV5d6i1OrJSo3Vr9xdGqFLBQo0mz5P9eIfKCDJ7eekVGGFLbce0qbPSnktXV2BjDQ==", + "dev": true, + "requires": { + "@octokit/rest": "^18.0.6" + } + }, + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + }, + "globby": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + }, + "dependencies": { + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + } + } + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, + "grouped-queue": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/grouped-queue/-/grouped-queue-2.0.0.tgz", + "integrity": "sha512-/PiFUa7WIsl48dUeCvhIHnwNmAAzlI/eHoJl0vu3nsFA366JleY7Ff8EVTplZu5kO0MIdZjKTTnzItL61ahbnw==", + "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 + }, + "gulp-filter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/gulp-filter/-/gulp-filter-7.0.0.tgz", + "integrity": "sha512-ZGWtJo0j1mHfP77tVuhyqem4MRA5NfNRjoVe6VAkLGeQQ/QGo2VsFwp7zfPTGDsd1rwzBmoDHhxpE6f5B3Zuaw==", + "dev": true, + "requires": { + "multimatch": "^5.0.0", + "plugin-error": "^1.0.1", + "streamfilter": "^3.0.0", + "to-absolute-glob": "^2.0.2" + } + }, + "gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "dev": true, + "requires": { + "duplexer": "^0.1.2" + } + }, + "handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dev": true, + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } + } + }, + "has-binary2": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", + "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", + "dev": true, + "requires": { + "isarray": "2.0.1" + }, + "dependencies": { + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + } + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", + "dev": true + }, + "hosted-git-info": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", + "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", + "dev": true + }, + "hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", + "dev": true + }, + "html-encoding-sniffer": { + "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" + } + }, + "html-entities": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", + "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", + "dev": true + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "dev": true, + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "http-errors": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + } + } + }, + "http-parser-js": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", + "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==" + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-agent": { + "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", + "debug": "4" + } + }, + "http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dev": true, + "requires": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "dev": true, + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==", + "dev": true + } + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-proxy-agent": { + "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" + } + }, + "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==", + "dev": true + }, + "humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", + "dev": true, + "requires": { + "ms": "^2.0.0" + } + }, + "husky": { + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/husky/-/husky-4.3.8.tgz", + "integrity": "sha512-LCqqsB0PzJQ/AlCgfrfzRe3e3+NvmefAdKQhRYpxS4u6clblBoDdzzvHi8fmxKRzvMxPY/1WZWzomPZww0Anow==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "ci-info": "^2.0.0", + "compare-versions": "^3.6.0", + "cosmiconfig": "^7.0.0", + "find-versions": "^4.0.0", + "opencollective-postinstall": "^2.0.2", + "pkg-dir": "^5.0.0", + "please-upgrade-node": "^3.2.0", + "slash": "^3.0.0", + "which-pm-runs": "^1.0.0" + }, + "dependencies": { + "ansi-styles": { + "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" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "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" + } + }, + "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 + }, + "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 + }, + "pkg-dir": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", + "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", + "dev": true, + "requires": { + "find-up": "^5.0.0" + } + }, + "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" + } + } + } + }, + "iconv-lite": { + "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" + } + }, + "icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "ignore-walk": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz", + "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==", + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "dev": true, + "optional": true + }, + "immutable": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", + "integrity": "sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-local": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true + }, + "inquirer": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.1.1.tgz", + "integrity": "sha512-hUDjc3vBkh/uk1gPfMAD/7Z188Q8cvTGl0nxwaCdwSbzFh6ZKkZh+s2ozVxbE5G9ZNRyeY0+lgbAIOUFsFf98w==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.3.0", + "run-async": "^2.4.0", + "rxjs": "^6.6.6", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-styles": { + "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" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "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" + } + }, + "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 + }, + "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 + }, + "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" + } + } + } + }, + "insight": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/insight/-/insight-0.10.3.tgz", + "integrity": "sha512-YOncxSN6Omh+1Oqxt+OJAvJVMDKw7l6IEG0wT2cTMGxjsTcroOGW4IR926QDzxg/uZHcFZ2cZbckDWdZhc2pZw==", + "dev": true, + "requires": { + "async": "^2.6.2", + "chalk": "^2.4.2", + "conf": "^1.4.0", + "inquirer": "^6.3.1", + "lodash.debounce": "^4.0.8", + "os-name": "^3.1.0", + "request": "^2.88.0", + "tough-cookie": "^3.0.1", + "uuid": "^3.3.2" + }, + "dependencies": { + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", + "dev": true + }, + "conf": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/conf/-/conf-1.4.0.tgz", + "integrity": "sha512-bzlVWS2THbMetHqXKB8ypsXN4DQ/1qopGwNJi1eYbpwesJcd86FBjFciCQX/YwAhp9bM7NVnPFqZ5LpV7gP0Dg==", + "dev": true, + "requires": { + "dot-prop": "^4.1.0", + "env-paths": "^1.0.0", + "make-dir": "^1.0.0", + "pkg-up": "^2.0.0", + "write-file-atomic": "^2.3.0" + } + }, + "dot-prop": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz", + "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", + "dev": true, + "requires": { + "is-obj": "^1.0.0" + } + }, + "env-paths": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-1.0.0.tgz", + "integrity": "sha1-QWgTO0K7BcOKNbGuQ5fIKYqzaeA=", + "dev": true + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "inquirer": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", + "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", + "dev": true, + "requires": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.12", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + } + } + }, + "internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dev": true, + "requires": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + } + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true + }, + "invert-kv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-3.0.1.tgz", + "integrity": "sha512-CYdFeFexxhv/Bcny+Q0BfOV+ltRlJcd4BBZBYFX/O0u4npJrgZtIcjokegtiSMAvlMTJ+Koq0GBCc//3bueQxw==", + "dev": true + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + }, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "requires": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + } + }, + "is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "dev": true + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-arguments": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", + "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "dev": true, + "requires": { + "call-bind": "^1.0.0" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-ci": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.0.tgz", + "integrity": "sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ==", + "dev": true, + "requires": { + "ci-info": "^3.1.1" + }, + "dependencies": { + "ci-info": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", + "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==", + "dev": true + } + } + }, + "is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "dev": true, + "requires": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + }, + "dependencies": { + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "dev": true + } + } + }, + "is-core-module": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", + "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", + "requires": { + "has": "^1.0.3" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-date-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", + "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==", + "dev": true + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "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==" + }, + "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==", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true + }, + "is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=", + "dev": true + }, + "is-negated-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", + "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-number-like": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", + "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", + "dev": true, + "requires": { + "lodash.isfinite": "^3.3.2" + } + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true + }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true + }, + "is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "requires": { + "is-path-inside": "^2.1.0" + } + }, + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "requires": { + "path-is-inside": "^1.0.2" + } + }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "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==", + "dev": true + }, + "is-regex": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", + "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.2" + } + }, + "is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", + "dev": true + }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "requires": { + "is-unc-path": "^1.0.0" + } + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "is-scoped": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-scoped/-/is-scoped-2.1.0.tgz", + "integrity": "sha512-Cv4OpPTHAK9kHYzkzCrof3VJh7H/PrG2MBUMvvJebaaUMbqhm0YAtXnvh0I3Hnj2tMZWwrRROWLSgfJrKqWmlQ==", + "dev": true, + "requires": { + "scoped-regex": "^2.0.0" + } + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "requires": { + "unc-path-regex": "^0.1.2" + } + }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isbinaryfile": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.8.tgz", + "integrity": "sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "istanbul-lib-report": { + "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", + "supports-color": "^7.1.0" + }, + "dependencies": { + "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 + }, + "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" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "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 + } + } + }, + "istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jake": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.2.tgz", + "integrity": "sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==", + "dev": true, + "requires": { + "async": "0.9.x", + "chalk": "^2.4.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + }, + "dependencies": { + "async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", + "dev": true + } + } + }, + "java-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/java-parser/-/java-parser-1.2.0.tgz", + "integrity": "sha512-2SVpsgGzB1d6mv3jT0rhDrDIe5CVdJwaSEXAbPLWdK4BiC/tyrCzeJtoJS4UwSo9qY174axcNHGcQtsEbrlMoA==", + "dev": true, + "requires": { + "chevrotain": "6.5.0", + "lodash": "4.17.21" + }, + "dependencies": { + "chevrotain": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-6.5.0.tgz", + "integrity": "sha512-BwqQ/AgmKJ8jcMEjaSnfMybnKMgGTrtDKowfTP3pX4jwVy0kNjRsT/AP6h+wC3+3NC+X8X15VWBnTCQlX+wQFg==", + "dev": true, + "requires": { + "regexp-to-ast": "0.4.0" + } + }, + "regexp-to-ast": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.4.0.tgz", + "integrity": "sha512-4qf/7IsIKfSNHQXSwial1IFmfM1Cc/whNBQqRwe0V2stPe7KmN1U0tWQiIx6JiirgSrisjE0eECdNf7Tav1Ntw==", + "dev": true + } + } + }, + "jest": { + "version": "27.0.4", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.0.4.tgz", + "integrity": "sha512-Px1iKFooXgGSkk1H8dJxxBIrM3tsc5SIuI4kfKYK2J+4rvCvPGr/cXktxh0e9zIPQ5g09kOMNfHQEmusBUf/ZA==", + "dev": true, + "requires": { + "@jest/core": "^27.0.4", + "import-local": "^3.0.2", + "jest-cli": "^27.0.4" + } + }, + "jest-changed-files": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.0.6.tgz", + "integrity": "sha512-BuL/ZDauaq5dumYh5y20sn4IISnf1P9A0TDswTxUi84ORGtVa86ApuBHqICL0vepqAnZiY6a7xeSPWv2/yy4eA==", + "dev": true, + "requires": { + "@jest/types": "^27.0.6", + "execa": "^5.0.0", + "throat": "^6.0.1" + } + }, + "jest-circus": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.0.6.tgz", + "integrity": "sha512-OJlsz6BBeX9qR+7O9lXefWoc2m9ZqcZ5Ohlzz0pTEAG4xMiZUJoacY8f4YDHxgk0oKYxj277AfOk9w6hZYvi1Q==", + "dev": true, + "requires": { + "@jest/environment": "^27.0.6", + "@jest/test-result": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^27.0.6", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.0.6", + "jest-matcher-utils": "^27.0.6", + "jest-message-util": "^27.0.6", + "jest-runtime": "^27.0.6", + "jest-snapshot": "^27.0.6", + "jest-util": "^27.0.6", + "pretty-format": "^27.0.6", + "slash": "^3.0.0", + "stack-utils": "^2.0.3", + "throat": "^6.0.1" + }, + "dependencies": { + "ansi-styles": { + "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" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "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" + } + }, + "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 + }, + "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 + }, + "pretty-format": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.6.tgz", + "integrity": "sha512-8tGD7gBIENgzqA+UBzObyWqQ5B778VIFZA/S66cclyd5YkFLYs2Js7gxDKf0MXtTc9zcS7t1xhdfcElJ3YIvkQ==", + "dev": true, + "requires": { + "@jest/types": "^27.0.6", + "ansi-regex": "^5.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "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" + } + } + } + }, + "jest-cli": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.0.6.tgz", + "integrity": "sha512-qUUVlGb9fdKir3RDE+B10ULI+LQrz+MCflEH2UJyoUjoHHCbxDrMxSzjQAPUMsic4SncI62ofYCcAvW6+6rhhg==", + "dev": true, + "requires": { + "@jest/core": "^27.0.6", + "@jest/test-result": "^27.0.6", + "@jest/types": "^27.0.6", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "import-local": "^3.0.2", + "jest-config": "^27.0.6", + "jest-util": "^27.0.6", + "jest-validate": "^27.0.6", + "prompts": "^2.0.1", + "yargs": "^16.0.3" + }, + "dependencies": { + "ansi-styles": { + "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" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "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" + } + }, + "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 + }, + "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 + }, + "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" + } + } + } + }, + "jest-config": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.0.6.tgz", + "integrity": "sha512-JZRR3I1Plr2YxPBhgqRspDE2S5zprbga3swYNrvY3HfQGu7p/GjyLOqwrYad97tX3U3mzT53TPHVmozacfP/3w==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^27.0.6", + "@jest/types": "^27.0.6", + "babel-jest": "^27.0.6", + "chalk": "^4.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "is-ci": "^3.0.0", + "jest-circus": "^27.0.6", + "jest-environment-jsdom": "^27.0.6", + "jest-environment-node": "^27.0.6", + "jest-get-type": "^27.0.6", + "jest-jasmine2": "^27.0.6", + "jest-regex-util": "^27.0.6", + "jest-resolve": "^27.0.6", + "jest-runner": "^27.0.6", + "jest-util": "^27.0.6", + "jest-validate": "^27.0.6", + "micromatch": "^4.0.4", + "pretty-format": "^27.0.6" + }, + "dependencies": { + "ansi-styles": { + "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" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "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" + } + }, + "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 + }, + "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 + }, + "pretty-format": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.6.tgz", + "integrity": "sha512-8tGD7gBIENgzqA+UBzObyWqQ5B778VIFZA/S66cclyd5YkFLYs2Js7gxDKf0MXtTc9zcS7t1xhdfcElJ3YIvkQ==", + "dev": true, + "requires": { + "@jest/types": "^27.0.6", + "ansi-regex": "^5.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "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" + } + } + } + }, + "jest-date-mock": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/jest-date-mock/-/jest-date-mock-1.0.8.tgz", + "integrity": "sha512-0Lyp+z9xvuNmLbK+5N6FOhSiBeux05Lp5bbveFBmYo40Aggl2wwxFoIrZ+rOWC8nDNcLeBoDd2miQdEDSf3iQw==", + "dev": true + }, + "jest-diff": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", + "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "dependencies": { + "ansi-styles": { + "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" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "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" + } + }, + "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 + }, + "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 + }, + "jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "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" + } + } + } + }, + "jest-docblock": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.0.6.tgz", + "integrity": "sha512-Fid6dPcjwepTFraz0YxIMCi7dejjJ/KL9FBjPYhBp4Sv1Y9PdhImlKZqYU555BlN4TQKaTc+F2Av1z+anVyGkA==", + "dev": true, + "requires": { + "detect-newline": "^3.0.0" + } + }, + "jest-each": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.0.6.tgz", + "integrity": "sha512-m6yKcV3bkSWrUIjxkE9OC0mhBZZdhovIW5ergBYirqnkLXkyEn3oUUF/QZgyecA1cF1QFyTE8bRRl8Tfg1pfLA==", + "dev": true, + "requires": { + "@jest/types": "^27.0.6", + "chalk": "^4.0.0", + "jest-get-type": "^27.0.6", + "jest-util": "^27.0.6", + "pretty-format": "^27.0.6" + }, + "dependencies": { + "ansi-styles": { + "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" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "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" + } + }, + "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 + }, + "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 + }, + "pretty-format": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.6.tgz", + "integrity": "sha512-8tGD7gBIENgzqA+UBzObyWqQ5B778VIFZA/S66cclyd5YkFLYs2Js7gxDKf0MXtTc9zcS7t1xhdfcElJ3YIvkQ==", + "dev": true, + "requires": { + "@jest/types": "^27.0.6", + "ansi-regex": "^5.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "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" + } + } + } + }, + "jest-environment-jsdom": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.0.6.tgz", + "integrity": "sha512-FvetXg7lnXL9+78H+xUAsra3IeZRTiegA3An01cWeXBspKXUhAwMM9ycIJ4yBaR0L7HkoMPaZsozCLHh4T8fuw==", + "dev": true, + "requires": { + "@jest/environment": "^27.0.6", + "@jest/fake-timers": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/node": "*", + "jest-mock": "^27.0.6", + "jest-util": "^27.0.6", + "jsdom": "^16.6.0" + } + }, + "jest-environment-node": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.0.6.tgz", + "integrity": "sha512-+Vi6yLrPg/qC81jfXx3IBlVnDTI6kmRr08iVa2hFCWmJt4zha0XW7ucQltCAPhSR0FEKEoJ3i+W4E6T0s9is0w==", + "dev": true, + "requires": { + "@jest/environment": "^27.0.6", + "@jest/fake-timers": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/node": "*", + "jest-mock": "^27.0.6", + "jest-util": "^27.0.6" + } + }, + "jest-get-type": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.0.6.tgz", + "integrity": "sha512-XTkK5exIeUbbveehcSR8w0bhH+c0yloW/Wpl+9vZrjzztCPWrxhHwkIFpZzCt71oRBsgxmuUfxEqOYoZI2macg==", + "dev": true + }, + "jest-haste-map": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.0.6.tgz", + "integrity": "sha512-4ldjPXX9h8doB2JlRzg9oAZ2p6/GpQUNAeiYXqcpmrKbP0Qev0wdZlxSMOmz8mPOEnt4h6qIzXFLDi8RScX/1w==", + "dev": true, + "requires": { + "@jest/types": "^27.0.6", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.3.2", + "graceful-fs": "^4.2.4", + "jest-regex-util": "^27.0.6", + "jest-serializer": "^27.0.6", + "jest-util": "^27.0.6", + "jest-worker": "^27.0.6", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + }, + "dependencies": { + "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 + }, + "jest-worker": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.0.6.tgz", + "integrity": "sha512-qupxcj/dRuA3xHPMUd40gr2EaAurFbkwzOh7wfPaeE9id7hyjURRQoqNfHifHK3XjJU6YJJUQKILGUnwGPEOCA==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + } + }, + "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" + } + } + } + }, + "jest-jasmine2": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.0.6.tgz", + "integrity": "sha512-cjpH2sBy+t6dvCeKBsHpW41mjHzXgsavaFMp+VWRf0eR4EW8xASk1acqmljFtK2DgyIECMv2yCdY41r2l1+4iA==", + "dev": true, + "requires": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^27.0.6", + "@jest/source-map": "^27.0.6", + "@jest/test-result": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^27.0.6", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.0.6", + "jest-matcher-utils": "^27.0.6", + "jest-message-util": "^27.0.6", + "jest-runtime": "^27.0.6", + "jest-snapshot": "^27.0.6", + "jest-util": "^27.0.6", + "pretty-format": "^27.0.6", + "throat": "^6.0.1" + }, + "dependencies": { + "ansi-styles": { + "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" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "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" + } + }, + "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 + }, + "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 + }, + "pretty-format": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.6.tgz", + "integrity": "sha512-8tGD7gBIENgzqA+UBzObyWqQ5B778VIFZA/S66cclyd5YkFLYs2Js7gxDKf0MXtTc9zcS7t1xhdfcElJ3YIvkQ==", + "dev": true, + "requires": { + "@jest/types": "^27.0.6", + "ansi-regex": "^5.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "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" + } + } + } + }, + "jest-junit": { + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-12.2.0.tgz", + "integrity": "sha512-ecGzF3KEQwLbMP5xMO7wqmgmyZlY/5yWDvgE/vFa+/uIT0KsU5nluf0D2fjIlOKB+tb6DiuSSpZuGpsmwbf7Fw==", + "dev": true, + "requires": { + "mkdirp": "^1.0.4", + "strip-ansi": "^5.2.0", + "uuid": "^8.3.2", + "xml": "^1.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "jest-leak-detector": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.0.6.tgz", + "integrity": "sha512-2/d6n2wlH5zEcdctX4zdbgX8oM61tb67PQt4Xh8JFAIy6LRKUnX528HulkaG6nD5qDl5vRV1NXejCe1XRCH5gQ==", + "dev": true, + "requires": { + "jest-get-type": "^27.0.6", + "pretty-format": "^27.0.6" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + }, + "pretty-format": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.6.tgz", + "integrity": "sha512-8tGD7gBIENgzqA+UBzObyWqQ5B778VIFZA/S66cclyd5YkFLYs2Js7gxDKf0MXtTc9zcS7t1xhdfcElJ3YIvkQ==", + "dev": true, + "requires": { + "@jest/types": "^27.0.6", + "ansi-regex": "^5.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + } + } + } + }, + "jest-matcher-utils": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.0.6.tgz", + "integrity": "sha512-OFgF2VCQx9vdPSYTHWJ9MzFCehs20TsyFi6bIHbk5V1u52zJOnvF0Y/65z3GLZHKRuTgVPY4Z6LVePNahaQ+tA==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^27.0.6", + "jest-get-type": "^27.0.6", + "pretty-format": "^27.0.6" + }, + "dependencies": { + "ansi-styles": { + "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" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "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" + } + }, + "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 + }, + "diff-sequences": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.0.6.tgz", + "integrity": "sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ==", + "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==", + "dev": true + }, + "jest-diff": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.0.6.tgz", + "integrity": "sha512-Z1mqgkTCSYaFgwTlP/NUiRzdqgxmmhzHY1Tq17zL94morOHfHu3K4bgSgl+CR4GLhpV8VxkuOYuIWnQ9LnFqmg==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^27.0.6", + "jest-get-type": "^27.0.6", + "pretty-format": "^27.0.6" + } + }, + "pretty-format": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.6.tgz", + "integrity": "sha512-8tGD7gBIENgzqA+UBzObyWqQ5B778VIFZA/S66cclyd5YkFLYs2Js7gxDKf0MXtTc9zcS7t1xhdfcElJ3YIvkQ==", + "dev": true, + "requires": { + "@jest/types": "^27.0.6", + "ansi-regex": "^5.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "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" + } + } + } + }, + "jest-message-util": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.0.6.tgz", + "integrity": "sha512-rBxIs2XK7rGy+zGxgi+UJKP6WqQ+KrBbD1YMj517HYN3v2BG66t3Xan3FWqYHKZwjdB700KiAJ+iES9a0M+ixw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.0.6", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.4", + "pretty-format": "^27.0.6", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "dependencies": { + "ansi-styles": { + "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" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "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" + } + }, + "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 + }, + "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 + }, + "pretty-format": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.6.tgz", + "integrity": "sha512-8tGD7gBIENgzqA+UBzObyWqQ5B778VIFZA/S66cclyd5YkFLYs2Js7gxDKf0MXtTc9zcS7t1xhdfcElJ3YIvkQ==", + "dev": true, + "requires": { + "@jest/types": "^27.0.6", + "ansi-regex": "^5.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "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" + } + } + } + }, + "jest-mock": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.0.6.tgz", + "integrity": "sha512-lzBETUoK8cSxts2NYXSBWT+EJNzmUVtVVwS1sU9GwE1DLCfGsngg+ZVSIe0yd0ZSm+y791esiuo+WSwpXJQ5Bw==", + "dev": true, + "requires": { + "@jest/types": "^27.0.6", + "@types/node": "*" + } + }, + "jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "dev": true + }, + "jest-preset-angular": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/jest-preset-angular/-/jest-preset-angular-9.0.4.tgz", + "integrity": "sha512-N/nPUwMXTW3bUiSzijn5vlQ51cuVEzJxDJ3s6EN8e3Wx2SF4Q9DBJIWpW+LVvSinLljYXJN9jPwkVstnnoJd9g==", + "dev": true, + "requires": { + "jest-environment-jsdom": "^27.0.0", + "pretty-format": "^27.0.0", + "ts-jest": "^27.0.0", + "webpack": "^4.0.0 || ^5.30.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + }, + "pretty-format": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.6.tgz", + "integrity": "sha512-8tGD7gBIENgzqA+UBzObyWqQ5B778VIFZA/S66cclyd5YkFLYs2Js7gxDKf0MXtTc9zcS7t1xhdfcElJ3YIvkQ==", + "dev": true, + "requires": { + "@jest/types": "^27.0.6", + "ansi-regex": "^5.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + } + } + } + }, + "jest-regex-util": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.0.6.tgz", + "integrity": "sha512-SUhPzBsGa1IKm8hx2F4NfTGGp+r7BXJ4CulsZ1k2kI+mGLG+lxGrs76veN2LF/aUdGosJBzKgXmNCw+BzFqBDQ==", + "dev": true + }, + "jest-resolve": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.0.6.tgz", + "integrity": "sha512-yKmIgw2LgTh7uAJtzv8UFHGF7Dm7XfvOe/LQ3Txv101fLM8cx2h1QVwtSJ51Q/SCxpIiKfVn6G2jYYMDNHZteA==", + "dev": true, + "requires": { + "@jest/types": "^27.0.6", + "chalk": "^4.0.0", + "escalade": "^3.1.1", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.0.6", + "jest-validate": "^27.0.6", + "resolve": "^1.20.0", + "slash": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "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" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "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" + } + }, + "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 + }, + "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 + }, + "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" + } + } + } + }, + "jest-resolve-dependencies": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.0.6.tgz", + "integrity": "sha512-mg9x9DS3BPAREWKCAoyg3QucCr0n6S8HEEsqRCKSPjPcu9HzRILzhdzY3imsLoZWeosEbJZz6TKasveczzpJZA==", + "dev": true, + "requires": { + "@jest/types": "^27.0.6", + "jest-regex-util": "^27.0.6", + "jest-snapshot": "^27.0.6" + } + }, + "jest-runner": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.0.6.tgz", + "integrity": "sha512-W3Bz5qAgaSChuivLn+nKOgjqNxM7O/9JOJoKDCqThPIg2sH/d4A/lzyiaFgnb9V1/w29Le11NpzTJSzga1vyYQ==", + "dev": true, + "requires": { + "@jest/console": "^27.0.6", + "@jest/environment": "^27.0.6", + "@jest/test-result": "^27.0.6", + "@jest/transform": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-docblock": "^27.0.6", + "jest-environment-jsdom": "^27.0.6", + "jest-environment-node": "^27.0.6", + "jest-haste-map": "^27.0.6", + "jest-leak-detector": "^27.0.6", + "jest-message-util": "^27.0.6", + "jest-resolve": "^27.0.6", + "jest-runtime": "^27.0.6", + "jest-util": "^27.0.6", + "jest-worker": "^27.0.6", + "source-map-support": "^0.5.6", + "throat": "^6.0.1" + }, + "dependencies": { + "ansi-styles": { + "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" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "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" + } + }, + "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 + }, + "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 + }, + "jest-worker": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.0.6.tgz", + "integrity": "sha512-qupxcj/dRuA3xHPMUd40gr2EaAurFbkwzOh7wfPaeE9id7hyjURRQoqNfHifHK3XjJU6YJJUQKILGUnwGPEOCA==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "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" + } + } + } + }, + "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" + } + } + } + }, + "jest-runtime": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.0.6.tgz", + "integrity": "sha512-BhvHLRVfKibYyqqEFkybsznKwhrsu7AWx2F3y9G9L95VSIN3/ZZ9vBpm/XCS2bS+BWz3sSeNGLzI3TVQ0uL85Q==", + "dev": true, + "requires": { + "@jest/console": "^27.0.6", + "@jest/environment": "^27.0.6", + "@jest/fake-timers": "^27.0.6", + "@jest/globals": "^27.0.6", + "@jest/source-map": "^27.0.6", + "@jest/test-result": "^27.0.6", + "@jest/transform": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^27.0.6", + "jest-message-util": "^27.0.6", + "jest-mock": "^27.0.6", + "jest-regex-util": "^27.0.6", + "jest-resolve": "^27.0.6", + "jest-snapshot": "^27.0.6", + "jest-util": "^27.0.6", + "jest-validate": "^27.0.6", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^16.0.3" + }, + "dependencies": { + "ansi-styles": { + "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" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "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" + } + }, + "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 + }, + "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 + }, + "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" + } + } + } + }, + "jest-serializer": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.0.6.tgz", + "integrity": "sha512-PtGdVK9EGC7dsaziskfqaAPib6wTViY3G8E5wz9tLVPhHyiDNTZn/xjZ4khAw+09QkoOVpn7vF5nPSN6dtBexA==", + "dev": true, + "requires": { + "@types/node": "*", + "graceful-fs": "^4.2.4" + } + }, + "jest-snapshot": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.0.6.tgz", + "integrity": "sha512-NTHaz8He+ATUagUgE7C/UtFcRoHqR2Gc+KDfhQIyx+VFgwbeEMjeP+ILpUTLosZn/ZtbNdCF5LkVnN/l+V751A==", + "dev": true, + "requires": { + "@babel/core": "^7.7.2", + "@babel/generator": "^7.7.2", + "@babel/parser": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.0.0", + "@jest/transform": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^27.0.6", + "graceful-fs": "^4.2.4", + "jest-diff": "^27.0.6", + "jest-get-type": "^27.0.6", + "jest-haste-map": "^27.0.6", + "jest-matcher-utils": "^27.0.6", + "jest-message-util": "^27.0.6", + "jest-resolve": "^27.0.6", + "jest-util": "^27.0.6", + "natural-compare": "^1.4.0", + "pretty-format": "^27.0.6", + "semver": "^7.3.2" + }, + "dependencies": { + "ansi-styles": { + "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" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "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" + } + }, + "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 + }, + "diff-sequences": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.0.6.tgz", + "integrity": "sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ==", + "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==", + "dev": true + }, + "jest-diff": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.0.6.tgz", + "integrity": "sha512-Z1mqgkTCSYaFgwTlP/NUiRzdqgxmmhzHY1Tq17zL94morOHfHu3K4bgSgl+CR4GLhpV8VxkuOYuIWnQ9LnFqmg==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^27.0.6", + "jest-get-type": "^27.0.6", + "pretty-format": "^27.0.6" + } + }, + "pretty-format": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.6.tgz", + "integrity": "sha512-8tGD7gBIENgzqA+UBzObyWqQ5B778VIFZA/S66cclyd5YkFLYs2Js7gxDKf0MXtTc9zcS7t1xhdfcElJ3YIvkQ==", + "dev": true, + "requires": { + "@jest/types": "^27.0.6", + "ansi-regex": "^5.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "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" + } + } + } + }, + "jest-sonar-reporter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jest-sonar-reporter/-/jest-sonar-reporter-2.0.0.tgz", + "integrity": "sha512-ZervDCgEX5gdUbdtWsjdipLN3bKJwpxbvhkYNXTAYvAckCihobSLr9OT/IuyNIRT1EZMDDwR6DroWtrq+IL64w==", + "dev": true, + "requires": { + "xml": "^1.0.1" + } + }, + "jest-util": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.0.6.tgz", + "integrity": "sha512-1JjlaIh+C65H/F7D11GNkGDDZtDfMEM8EBXsvd+l/cxtgQ6QhxuloOaiayt89DxUvDarbVhqI98HhgrM1yliFQ==", + "dev": true, + "requires": { + "@jest/types": "^27.0.6", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^3.0.0", + "picomatch": "^2.2.3" + }, + "dependencies": { + "ansi-styles": { + "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" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "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" + } + }, + "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 + }, + "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 + }, + "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" + } + } + } + }, + "jest-validate": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.0.6.tgz", + "integrity": "sha512-yhZZOaMH3Zg6DC83n60pLmdU1DQE46DW+KLozPiPbSbPhlXXaiUTDlhHQhHFpaqIFRrInko1FHXjTRpjWRuWfA==", + "dev": true, + "requires": { + "@jest/types": "^27.0.6", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^27.0.6", + "leven": "^3.1.0", + "pretty-format": "^27.0.6" + }, + "dependencies": { + "ansi-styles": { + "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" + } + }, + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "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" + } + }, + "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 + }, + "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 + }, + "pretty-format": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.6.tgz", + "integrity": "sha512-8tGD7gBIENgzqA+UBzObyWqQ5B778VIFZA/S66cclyd5YkFLYs2Js7gxDKf0MXtTc9zcS7t1xhdfcElJ3YIvkQ==", + "dev": true, + "requires": { + "@jest/types": "^27.0.6", + "ansi-regex": "^5.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "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" + } + } + } + }, + "jest-watcher": { + "version": "27.0.6", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.0.6.tgz", + "integrity": "sha512-/jIoKBhAP00/iMGnTwUBLgvxkn7vsOweDrOTSPzc7X9uOyUtJIDthQBTI1EXz90bdkrxorUZVhJwiB69gcHtYQ==", + "dev": true, + "requires": { + "@jest/test-result": "^27.0.6", + "@jest/types": "^27.0.6", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^27.0.6", + "string-length": "^4.0.1" + }, + "dependencies": { + "ansi-styles": { + "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" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "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" + } + }, + "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 + }, + "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 + }, + "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" + } + } + } + }, + "jest-worker": { + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.0.2.tgz", + "integrity": "sha512-EoBdilOTTyOgmHXtw/cPc+ZrCA0KJMrkXzkrPGNwLmnvvlN1nj7MPrxpT7m+otSv2e1TLaVffzDnE/LB14zJMg==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "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 + }, + "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" + } + } + } + }, + "jmespath": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", + "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=", + "dev": true + }, + "joi": { + "version": "17.4.0", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.4.0.tgz", + "integrity": "sha512-F4WiW2xaV6wc1jxete70Rw4V/VuMd6IN+a5ilZsxG4uYtUXWu2kq9W5P2dz30e7Gmw8RCbY/u/uk+dMPma9tAg==", + "dev": true, + "requires": { + "@hapi/hoek": "^9.0.0", + "@hapi/topo": "^5.0.0", + "@sideway/address": "^4.1.0", + "@sideway/formula": "^3.0.0", + "@sideway/pinpoint": "^2.0.0" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml": { + "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" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsdom": { + "version": "16.6.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.6.0.tgz", + "integrity": "sha512-Ty1vmF4NHJkolaEmdjtxTfSfkdb8Ywarwf63f+F8/mDD1uLSSWDxDuMiZxiPhwunLrn9LOSVItWj4bLYsLN3Dg==", + "dev": true, + "requires": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.5", + "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "acorn": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.1.tgz", + "integrity": "sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==", + "dev": true + }, + "tough-cookie": { + "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", + "universalify": "^0.1.2" + } + } + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "json-schema-typed": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-7.0.3.tgz", + "integrity": "sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json-stringify-nice": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz", + "integrity": "sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==" + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "requires": { + "minimist": "^1.2.5" + } + }, + "jsonc-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", + "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", + "dev": true + }, + "jsonfile": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", + "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "just-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/just-diff/-/just-diff-3.1.1.tgz", + "integrity": "sha512-sdMWKjRq8qWZEjDcVA6llnUT8RDEBIfOiGpYFPYa9u+2c39JCsejktSP7mj5eRid5EIvTzIpQ2kDOCw1Nq9BjQ==", + "dev": true + }, + "just-diff-apply": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/just-diff-apply/-/just-diff-apply-3.0.0.tgz", + "integrity": "sha512-K2MLc+ZC2DVxX4V61bIKPeMUUfj1YYZ3h0myhchDXOW1cKoPZMnjIoNCqv9bF2n5Oob1PFxuR2gVJxkxz4e58w==", + "dev": true + }, + "karma-source-map-support": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", + "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", + "dev": true, + "requires": { + "source-map-support": "^0.5.5" + } + }, + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true + }, + "klona": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.4.tgz", + "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==", + "dev": true + }, + "kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", + "dev": true + }, + "lcid": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-3.1.1.tgz", + "integrity": "sha512-M6T051+5QCGLBQb8id3hdvIW8+zeFV2FyBGFS9IEK5H9Wt4MueD4bW1eWikpHgZp+5xR3l5c8pZUkQsIA0BFZg==", + "dev": true, + "requires": { + "invert-kv": "^3.0.0" + } + }, + "less": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/less/-/less-4.1.1.tgz", + "integrity": "sha512-w09o8tZFPThBscl5d0Ggp3RcrKIouBoQscnOMgFH3n5V3kN/CXGHNfCkRPtxJk6nKryDXaV9aHLK55RXuH4sAw==", + "dev": true, + "requires": { + "copy-anything": "^2.0.1", + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^2.5.2", + "parse-node-version": "^1.0.1", + "source-map": "~0.6.0", + "tslib": "^1.10.0" + }, + "dependencies": { + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "optional": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "optional": 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 + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "less-loader": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-10.0.0.tgz", + "integrity": "sha512-JjioAkw9qyavL0BzMPUOHJa0a20fh+ipq/MNZH4OkU8qERsCMeZIWRE0FDBIx2O+cFguvY01vHh/lmBA9LyWDg==", + "dev": true, + "requires": { + "klona": "^2.0.4" + } + }, + "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==", + "dev": true + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "license-webpack-plugin": { + "version": "2.3.19", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.3.19.tgz", + "integrity": "sha512-z/izhwFRYHs1sCrDgrTUsNJpd+Xsd06OcFWSwHz/TiZygm5ucweVZi1Hu14Rf6tOj/XAl1Ebyc7GW6ZyyINyWA==", + "dev": true, + "requires": { + "@types/webpack-sources": "^0.1.5", + "webpack-sources": "^1.2.0" + } + }, + "limiter": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", + "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==", + "dev": true + }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "lint-staged": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-11.0.0.tgz", + "integrity": "sha512-3rsRIoyaE8IphSUtO1RVTFl1e0SLBtxxUOPBtHxQgBHS5/i6nqvjcUfNioMa4BU9yGnPzbO+xkfLtXtxBpCzjw==", + "dev": true, + "requires": { + "chalk": "^4.1.1", + "cli-truncate": "^2.1.0", + "commander": "^7.2.0", + "cosmiconfig": "^7.0.0", + "debug": "^4.3.1", + "dedent": "^0.7.0", + "enquirer": "^2.3.6", + "execa": "^5.0.0", + "listr2": "^3.8.2", + "log-symbols": "^4.1.0", + "micromatch": "^4.0.4", + "normalize-path": "^3.0.0", + "please-upgrade-node": "^3.2.0", + "string-argv": "0.3.1", + "stringify-object": "^3.3.0" + }, + "dependencies": { + "ansi-styles": { + "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" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "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" + } + }, + "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 + }, + "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 + }, + "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" + } + } + } + }, + "listr2": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.10.0.tgz", + "integrity": "sha512-eP40ZHihu70sSmqFNbNy2NL1YwImmlMmPh9WO5sLmPDleurMHt3n+SwEWNu2kzKScexZnkyFtc1VI0z/TGlmpw==", + "dev": true, + "requires": { + "cli-truncate": "^2.1.0", + "colorette": "^1.2.2", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rxjs": "^6.6.7", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + } + }, + "load-yaml-file": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/load-yaml-file/-/load-yaml-file-0.2.0.tgz", + "integrity": "sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.5", + "js-yaml": "^3.13.0", + "pify": "^4.0.1", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "loader-runner": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", + "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", + "dev": true + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "localtunnel": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-2.0.1.tgz", + "integrity": "sha512-LiaI5wZdz0xFkIQpXbNI62ZnNn8IMsVhwxHmhA+h4vj8R9JG/07bQHWwQlyy7b95/5fVOCHJfIHv+a5XnkvaJA==", + "dev": true, + "requires": { + "axios": "0.21.1", + "debug": "4.3.1", + "openurl": "1.1.1", + "yargs": "16.2.0" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true + }, + "lodash.isfinite": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", + "integrity": "sha1-+4m2WpqAKBgz8LdHizpRBPiY67M=", + "dev": true + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "dependencies": { + "ansi-styles": { + "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" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "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" + } + }, + "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 + }, + "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 + }, + "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" + } + } + } + }, + "log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "requires": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "dependencies": { + "ansi-styles": { + "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" + } + }, + "color-convert": { + "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" + } + }, + "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 + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } + } + }, + "logform": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.2.0.tgz", + "integrity": "sha512-N0qPlqfypFx7UHNn4B3lzS/b0uLqt2hmuoa+PpuXNYgozdJYAyauF5Ky0BWVjrxDlMWiT3qN4zPq3vVAfZy7Yg==", + "dev": true, + "requires": { + "colors": "^1.2.1", + "fast-safe-stringify": "^2.0.4", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "triple-beam": "^1.3.0" + } + }, + "loglevel": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", + "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "macos-release": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.0.tgz", + "integrity": "sha512-EIgv+QZ9r+814gjJj0Bt5vSLJLzswGmSUbUpbi9AIr/fsN2IWFBl2NucV9PAiek+U1STK468tEkxmVYUtuAN3g==", + "dev": true + }, + "magic-string": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, + "make-dir": { + "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" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "make-fetch-happen": { + "version": "8.0.14", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-8.0.14.tgz", + "integrity": "sha512-EsS89h6l4vbfJEtBZnENTOFk8mCRpY5ru36Xe5bcX1KYIli2mkSHqoFsp5O1wMDvTJJzxe/4THpCTtygjeeGWQ==", + "dev": true, + "requires": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.0.5", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^5.0.0", + "ssri": "^8.0.0" + } + }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true, + "requires": { + "tmpl": "1.0.x" + } + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "mem": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/mem/-/mem-5.1.1.tgz", + "integrity": "sha512-qvwipnozMohxLXG1pOqoLiZKNkC4r4qqRucSoDwXowsNGDSULiqFTRUF05vcZWnwJSG22qTsynQhxbaMtnX9gw==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.3", + "mimic-fn": "^2.1.0", + "p-is-promise": "^2.1.0" + }, + "dependencies": { + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + } + } + }, + "mem-fs": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/mem-fs/-/mem-fs-2.2.1.tgz", + "integrity": "sha512-yiAivd4xFOH/WXlUi6v/nKopBh1QLzwjFi36NK88cGt/PRXI8WeBASqY+YSjIVWvQTx3hR8zHKDBMV6hWmglNA==", + "dev": true, + "requires": { + "@types/node": "^15.6.1", + "@types/vinyl": "^2.0.4", + "vinyl": "^2.0.1", + "vinyl-file": "^3.0.0" + } + }, + "mem-fs-editor": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/mem-fs-editor/-/mem-fs-editor-9.0.1.tgz", + "integrity": "sha512-SqW+DkPbxZVzVldNHexoo5MiUR3YpIqiCVcZ/SZ6f7KToaSV7pMd4/URrkD5mnj35bd6NAK7SlftHSyW+Kgk4w==", + "dev": true, + "requires": { + "binaryextensions": "^4.15.0", + "commondir": "^1.0.1", + "deep-extend": "^0.6.0", + "ejs": "^3.1.6", + "globby": "^11.0.3", + "isbinaryfile": "^4.0.8", + "multimatch": "^5.0.0", + "normalize-path": "^3.0.0", + "textextensions": "^5.12.0" + } + }, + "memfs": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.2.2.tgz", + "integrity": "sha512-RE0CwmIM3CEvpcdK3rZ19BC4E6hv9kADkMN5rPduRak58cNArWLi/9jFLsa4rhsjfVxMP3v0jO7FHXq7SvFY5Q==", + "dev": true, + "requires": { + "fs-monkey": "1.0.3" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "merge-jsons-webpack-plugin": { + "version": "1.0.21", + "resolved": "https://registry.npmjs.org/merge-jsons-webpack-plugin/-/merge-jsons-webpack-plugin-1.0.21.tgz", + "integrity": "sha512-5Brw0DBi7tF48gm3BB21hu3qYWUMHuKWHKNqdZYmGTQlZQFTc63VFY/5LgonqusI/b0uvvjkpTdx1WrjInXreQ==", + "dev": true, + "requires": { + "es6-promise": "4.0.5", + "glob": "7.1.1" + }, + "dependencies": { + "glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", + "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "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 + } + } + }, + "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==", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "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" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "mime-db": { + "version": "1.48.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", + "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==", + "dev": true + }, + "mime-types": { + "version": "2.1.31", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", + "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", + "dev": true, + "requires": { + "mime-db": "1.48.0" + } + }, + "mimic-fn": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", + "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", + "dev": true + }, + "mini-css-extract-plugin": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-1.6.2.tgz", + "integrity": "sha512-WhDvO3SjGm40oV5y26GjMJYjd2UMqrLAGKy5YS2/3QKJy2F7jgynuHTir/tgUUOiNQu5saXHdc8reo7YuhhT4Q==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0", + "webpack-sources": "^1.1.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-fetch": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.3.3.tgz", + "integrity": "sha512-akCrLDWfbdAWkMLBxJEeWTdNsjML+dt5YgOI4gJ53vuO0vrmYQkUPxa6j6V65s9CcePIr2SSWqjT2EcrNseryQ==", + "dev": true, + "requires": { + "encoding": "^0.1.12", + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-json-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", + "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", + "dev": true, + "requires": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mitt": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz", + "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==", + "dev": true + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "mkdirp-infer-owner": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mkdirp-infer-owner/-/mkdirp-infer-owner-2.0.0.tgz", + "integrity": "sha512-sdqtiFt3lkOaYvTXSRIUjkIdPTcxgv5+fgqYE/5qgwdw12cOrAuzzgzvVExIkH/ul1oeHN3bCLOWSG3XOqbKKw==", + "dev": true, + "requires": { + "chownr": "^2.0.0", + "infer-owner": "^1.0.4", + "mkdirp": "^1.0.3" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "multimatch": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz", + "integrity": "sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==", + "dev": true, + "requires": { + "@types/minimatch": "^3.0.3", + "array-differ": "^3.0.0", + "array-union": "^2.1.0", + "arrify": "^2.0.1", + "minimatch": "^3.0.4" + } + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "nan": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", + "dev": true, + "optional": true + }, + "nanoid": { + "version": "3.1.23", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz", + "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==", + "dev": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "needle": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.7.0.tgz", + "integrity": "sha512-b4f4JgOl7GZVM1p+xuWBAsHwflng1s2yOu9lOThKAzULRW7eqSFYfN4gbuUFOMuE0hVAPWJnSz/90LMOlEGErw==", + "dev": true, + "optional": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true, + "optional": true + } + } + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "ngx-infinite-scroll": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/ngx-infinite-scroll/-/ngx-infinite-scroll-10.0.1.tgz", + "integrity": "sha512-7is0eJZ9kJPsaHohRmMhJ/QFHAW9jp9twO5HcHRvFM/Yl/R8QCiokgjwmH0/CR3MuxUanxfHZMfO3PbYTwlBEg==", + "requires": { + "@scarf/scarf": "^1.1.0", + "opencollective-postinstall": "^2.0.2" + } + }, + "ngx-webstorage": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/ngx-webstorage/-/ngx-webstorage-8.0.0.tgz", + "integrity": "sha512-dpHgboSi6adnYpwiAQ2/PRJe8dcvSbM2qWTacTCUPVPeWlhLvTCtIl1GA9BNDiZzYuyA3dmXyqlcDl/Th9Pi2A==", + "requires": { + "tslib": "^2.0.0" + } + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", + "dev": true + }, + "node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "dev": true + }, + "node-gyp": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz", + "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==", + "dev": true, + "requires": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.3", + "nopt": "^5.0.0", + "npmlog": "^4.1.2", + "request": "^2.88.2", + "rimraf": "^3.0.2", + "semver": "^7.3.2", + "tar": "^6.0.2", + "which": "^2.0.2" + } + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true + }, + "node-notifier": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-9.0.1.tgz", + "integrity": "sha512-fPNFIp2hF/Dq7qLDzSg4vZ0J4e9v60gJR+Qx7RbjbWqzPDdEqeVpEx5CFeDAELIl+A/woaaNn1fQ5nEVerMxJg==", + "dev": true, + "requires": { + "growly": "^1.3.0", + "is-wsl": "^2.2.0", + "semver": "^7.3.2", + "shellwords": "^0.1.1", + "uuid": "^8.3.0", + "which": "^2.0.2" + } + }, + "node-releases": { + "version": "1.1.73", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz", + "integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==", + "dev": true + }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true + }, + "npm-bundled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", + "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", + "dev": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-install-checks": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-4.0.0.tgz", + "integrity": "sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==", + "dev": true, + "requires": { + "semver": "^7.1.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", + "dev": true + }, + "npm-package-arg": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.2.tgz", + "integrity": "sha512-6Eem455JsSMJY6Kpd3EyWE+n5hC+g9bSyHr9K9U2zqZb7+02+hObQ2c0+8iDk/mNF+8r1MhY44WypKJAkySIYA==", + "dev": true, + "requires": { + "hosted-git-info": "^4.0.1", + "semver": "^7.3.4", + "validate-npm-package-name": "^3.0.0" + } + }, + "npm-packlist": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-2.2.2.tgz", + "integrity": "sha512-Jt01acDvJRhJGthnUJVF/w6gumWOZxO7IkpY/lsX9//zqQgnF7OJaxgQXcerd4uQOLu7W5bkb4mChL9mdfm+Zg==", + "dev": true, + "requires": { + "glob": "^7.1.6", + "ignore-walk": "^3.0.3", + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-pick-manifest": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.1.tgz", + "integrity": "sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA==", + "dev": true, + "requires": { + "npm-install-checks": "^4.0.0", + "npm-normalize-package-bin": "^1.0.1", + "npm-package-arg": "^8.1.2", + "semver": "^7.3.4" + } + }, + "npm-registry-fetch": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-10.1.2.tgz", + "integrity": "sha512-KsM/TdPmntqgBFlfsbkOLkkE9ovZo7VpVcd+/eTdYszCrgy5zFl5JzWm+OxavFaEWlbkirpkou+ZYI00RmOBFA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0", + "make-fetch-happen": "^8.0.9", + "minipass": "^3.1.3", + "minipass-fetch": "^1.3.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.0.0", + "npm-package-arg": "^8.0.0" + } + }, + "npm-run-path": { + "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" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "nth-check": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.0.tgz", + "integrity": "sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==", + "dev": true, + "requires": { + "boolbase": "^1.0.0" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-inspect": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", + "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==", + "dev": true + }, + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "dev": true, + "requires": { + "fn.name": "1.x.x" + } + }, + "onetime": { + "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" + }, + "dependencies": { + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + } + } + }, + "open": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/open/-/open-8.2.1.tgz", + "integrity": "sha512-rXILpcQlkF/QuFez2BJDf3GsqpjGKbkUUToAIGo9A0Q6ZkoSGogZJulrUdwRkrAsoQvoZsrjCYt8+zblOk7JQQ==", + "dev": true, + "requires": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + } + }, + "opencollective-postinstall": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==" + }, + "opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "dev": true + }, + "openurl": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz", + "integrity": "sha1-OHW0sO96UsFW8NtB1GCduw+Us4c=", + "dev": true + }, + "opn": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", + "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + }, + "dependencies": { + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + } + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "requires": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "dependencies": { + "ansi-styles": { + "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" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "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" + } + }, + "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 + }, + "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 + }, + "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" + } + } + } + }, + "original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "requires": { + "url-parse": "^1.4.3" + } + }, + "os-locale": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-5.0.0.tgz", + "integrity": "sha512-tqZcNEDAIZKBEPnHPlVDvKrp7NzgLi7jRmhKiUoa2NUmhl13FtkAGLUVR+ZsYvApBQdBfYm43A4tXXQ4IrYLBA==", + "dev": true, + "requires": { + "execa": "^4.0.0", + "lcid": "^3.0.0", + "mem": "^5.0.0" + }, + "dependencies": { + "execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true + } + } + }, + "os-name": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-3.1.0.tgz", + "integrity": "sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg==", + "dev": true, + "requires": { + "macos-release": "^2.2.0", + "windows-release": "^3.1.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "p-each-series": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", + "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", + "dev": true + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + } + }, + "p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "dev": true, + "requires": { + "retry": "^0.12.0" + } + }, + "p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "dev": true, + "requires": { + "p-finally": "^1.0.0" + } + }, + "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==", + "dev": true + }, + "pacote": { + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-11.3.2.tgz", + "integrity": "sha512-lMO7V9aMhyE5gfaSFxKfW3OTdXuFBNQJfuNuet3NPzWWhOYIW90t85vHcHLDjdhgmfAdAHyh9q1HAap96ea0XA==", + "dev": true, + "requires": { + "@npmcli/git": "^2.0.1", + "@npmcli/installed-package-contents": "^1.0.6", + "@npmcli/promise-spawn": "^1.2.0", + "@npmcli/run-script": "^1.8.2", + "cacache": "^15.0.5", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "infer-owner": "^1.0.4", + "minipass": "^3.1.3", + "mkdirp": "^1.0.3", + "npm-package-arg": "^8.0.1", + "npm-packlist": "^2.1.4", + "npm-pick-manifest": "^6.0.0", + "npm-registry-fetch": "^10.0.0", + "promise-retry": "^2.0.1", + "read-package-json-fast": "^2.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.1.0" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha1-juqz5U+laSD+Fro493+iGqzC104=", + "dev": true + }, + "parse-conflict-json": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/parse-conflict-json/-/parse-conflict-json-1.1.1.tgz", + "integrity": "sha512-4gySviBiW5TRl7XHvp1agcS7SOe0KZOjC//71dzZVWJrY9hCrgtvl5v3SyIxCZ4fZF47TxD9nfzmxcx76xmbUw==", + "dev": true, + "requires": { + "json-parse-even-better-errors": "^2.3.0", + "just-diff": "^3.0.1", + "just-diff-apply": "^3.0.0" + } + }, + "parse-gitignore": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-gitignore/-/parse-gitignore-1.0.1.tgz", + "integrity": "sha512-UGyowyjtx26n65kdAMWhm6/3uy5uSrpcuH7tt+QEVudiBoVS+eqHxD5kbi9oWVRwj7sCzXqwuM+rUGw7earl6A==", + "dev": true + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true + }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "parse5-html-rewriting-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-6.0.1.tgz", + "integrity": "sha512-vwLQzynJVEfUlURxgnf51yAJDQTtVpNyGD8tKi2Za7m+akukNHxCcUQMAa/mUGLhCeicFdpy7Tlvj8ZNKadprg==", + "dev": true, + "requires": { + "parse5": "^6.0.1", + "parse5-sax-parser": "^6.0.1" + } + }, + "parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dev": true, + "requires": { + "parse5": "^6.0.1" + } + }, + "parse5-sax-parser": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-6.0.1.tgz", + "integrity": "sha512-kXX+5S81lgESA0LsDuGjAlBybImAChYRMT+/uKCEXFBFOeEhS52qUCydGhU3qLRD8D9DVjaUo821WK7DM4iCeg==", + "dev": true, + "requires": { + "parse5": "^6.0.1" + } + }, + "parseqs": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", + "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==", + "dev": true + }, + "parseuri": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", + "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==", + "dev": true + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "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==", + "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=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "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==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "dev": true, + "requires": { + "node-modules-regexp": "^1.0.0" + } + }, + "pkg-dir": { + "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" + }, + "dependencies": { + "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" + } + }, + "locate-path": { + "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" + } + }, + "p-limit": { + "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" + } + }, + "p-locate": { + "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" + } + } + } + }, + "pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "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" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, + "please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "dev": true, + "requires": { + "semver-compare": "^1.0.0" + } + }, + "plugin-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", + "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", + "dev": true, + "requires": { + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" + }, + "dependencies": { + "ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "dev": true, + "requires": { + "ansi-wrap": "^0.1.0" + } + } + } + }, + "pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "dev": true + }, + "portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "dev": true, + "requires": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + } + } + }, + "portscanner": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.1.1.tgz", + "integrity": "sha1-6rtAnk3iSVD1oqUW01rnaTQ/u5Y=", + "dev": true, + "requires": { + "async": "1.5.2", + "is-number-like": "^1.0.3" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.5.tgz", + "integrity": "sha512-NxTuJocUhYGsMiMFHDUkmjSKT3EdH4/WbGF6GCi1NDGk+vbcUTun4fpbOqaPtD8IIsztA2ilZm2DhYCuyN58gA==", + "dev": true, + "requires": { + "colorette": "^1.2.2", + "nanoid": "^3.1.23", + "source-map-js": "^0.6.2" + } + }, + "postcss-attribute-case-insensitive": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz", + "integrity": "sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^6.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-calc": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.0.0.tgz", + "integrity": "sha512-5NglwDrcbiy8XXfPM11F3HeC6hoT9W7GUH/Zi5U/p7u3Irv4rHhdDcIZwG0llHXV4ftsBjpfWMXAnXNl4lnt8g==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + } + }, + "postcss-color-functional-notation": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz", + "integrity": "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-color-gray": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz", + "integrity": "sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==", + "dev": true, + "requires": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.5", + "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-color-hex-alpha": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz", + "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==", + "dev": true, + "requires": { + "postcss": "^7.0.14", + "postcss-values-parser": "^2.0.1" + }, + "dependencies": { + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-color-mod-function": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz", + "integrity": "sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==", + "dev": true, + "requires": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-color-rebeccapurple": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz", + "integrity": "sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-colormin": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.2.0.tgz", + "integrity": "sha512-+HC6GfWU3upe5/mqmxuqYZ9B2Wl4lcoUUNkoaX59nEWV4EtADCMiBqui111Bu8R8IvaZTmqmxrqOAqjbHIwXPw==", + "dev": true, + "requires": { + "browserslist": "^4.16.6", + "caniuse-api": "^3.0.0", + "colord": "^2.0.1", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-convert-values": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.0.1.tgz", + "integrity": "sha512-C3zR1Do2BkKkCgC0g3sF8TS0koF2G+mN8xxayZx3f10cIRmTaAnpgpRQZjNekTZxM2ciSPoh2IWJm0VZx8NoQg==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-custom-media": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz", + "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==", + "dev": true, + "requires": { + "postcss": "^7.0.14" + }, + "dependencies": { + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-custom-properties": { + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz", + "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==", + "dev": true, + "requires": { + "postcss": "^7.0.17", + "postcss-values-parser": "^2.0.1" + }, + "dependencies": { + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-custom-selectors": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz", + "integrity": "sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "dev": true + }, + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "dev": true, + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-dir-pseudo-class": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz", + "integrity": "sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "dev": true + }, + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "dev": true, + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-discard-comments": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.0.1.tgz", + "integrity": "sha512-lgZBPTDvWrbAYY1v5GYEv8fEO/WhKOu/hmZqmCYfrpD6eyDWWzAOsl2rF29lpvziKO02Gc5GJQtlpkTmakwOWg==", + "dev": true + }, + "postcss-discard-duplicates": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.0.1.tgz", + "integrity": "sha512-svx747PWHKOGpAXXQkCc4k/DsWo+6bc5LsVrAsw+OU+Ibi7klFZCyX54gjYzX4TH+f2uzXjRviLARxkMurA2bA==", + "dev": true + }, + "postcss-discard-empty": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.0.1.tgz", + "integrity": "sha512-vfU8CxAQ6YpMxV2SvMcMIyF2LX1ZzWpy0lqHDsOdaKKLQVQGVP1pzhrI9JlsO65s66uQTfkQBKBD/A5gp9STFw==", + "dev": true + }, + "postcss-discard-overridden": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.0.1.tgz", + "integrity": "sha512-Y28H7y93L2BpJhrdUR2SR2fnSsT+3TVx1NmVQLbcnZWwIUpJ7mfcTC6Za9M2PG6w8j7UQRfzxqn8jU2VwFxo3Q==", + "dev": true + }, + "postcss-double-position-gradients": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz", + "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==", + "dev": true, + "requires": { + "postcss": "^7.0.5", + "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-env-function": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz", + "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-focus-visible": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz", + "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-focus-within": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz", + "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-font-variant": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.1.tgz", + "integrity": "sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-gap-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz", + "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-image-set-function": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz", + "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-import": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.0.2.tgz", + "integrity": "sha512-BJ2pVK4KhUyMcqjuKs9RijV5tatNzNa73e/32aBVE/ejYPe37iH+6vAu9WvqUkB5OAYgLHzbSvzHnorybJCm9g==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + } + }, + "postcss-initial": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.4.tgz", + "integrity": "sha512-3RLn6DIpMsK1l5UUy9jxQvoDeUN4gP939tDcKUHD/kM8SGSKbFAnvkpFpj3Bhtz3HGk1jWY5ZNWX6mPta5M9fg==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-lab-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz", + "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==", + "dev": true, + "requires": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-loader": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.1.0.tgz", + "integrity": "sha512-yA/cXBfACkthZNA2hQxOnaReVfQ6uLmvbEDQzNafpbK40URZJvP/28dL1DG174Gvz3ptkkHbbwDBCh+gXR94CA==", + "dev": true, + "requires": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.4", + "semver": "^7.3.5" + } + }, + "postcss-logical": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz", + "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-media-minmax": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz", + "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-merge-longhand": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.0.2.tgz", + "integrity": "sha512-BMlg9AXSI5G9TBT0Lo/H3PfUy63P84rVz3BjCFE9e9Y9RXQZD3+h3YO1kgTNsNJy7bBc1YQp8DmSnwLIW5VPcw==", + "dev": true, + "requires": { + "css-color-names": "^1.0.1", + "postcss-value-parser": "^4.1.0", + "stylehacks": "^5.0.1" + } + }, + "postcss-merge-rules": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.0.2.tgz", + "integrity": "sha512-5K+Md7S3GwBewfB4rjDeol6V/RZ8S+v4B66Zk2gChRqLTCC8yjnHQ601omj9TKftS19OPGqZ/XzoqpzNQQLwbg==", + "dev": true, + "requires": { + "browserslist": "^4.16.6", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^2.0.1", + "postcss-selector-parser": "^6.0.5", + "vendors": "^1.0.3" + } + }, + "postcss-minify-font-values": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.0.1.tgz", + "integrity": "sha512-7JS4qIsnqaxk+FXY1E8dHBDmraYFWmuL6cgt0T1SWGRO5bzJf8sUoelwa4P88LEWJZweHevAiDKxHlofuvtIoA==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-minify-gradients": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.0.1.tgz", + "integrity": "sha512-odOwBFAIn2wIv+XYRpoN2hUV3pPQlgbJ10XeXPq8UY2N+9ZG42xu45lTn/g9zZ+d70NKSQD6EOi6UiCMu3FN7g==", + "dev": true, + "requires": { + "cssnano-utils": "^2.0.1", + "is-color-stop": "^1.1.0", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-minify-params": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.0.1.tgz", + "integrity": "sha512-4RUC4k2A/Q9mGco1Z8ODc7h+A0z7L7X2ypO1B6V8057eVK6mZ6xwz6QN64nHuHLbqbclkX1wyzRnIrdZehTEHw==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.2", + "browserslist": "^4.16.0", + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0", + "uniqs": "^2.0.0" + } + }, + "postcss-minify-selectors": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.1.0.tgz", + "integrity": "sha512-NzGBXDa7aPsAcijXZeagnJBKBPMYLaJJzB8CQh6ncvyl2sIndLVWfbcDi0SBjRWk5VqEjXvf8tYwzoKf4Z07og==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.2", + "postcss-selector-parser": "^6.0.5" + } + }, + "postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "dev": true + }, + "postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "dev": true, + "requires": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.4" + } + }, + "postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "requires": { + "icss-utils": "^5.0.0" + } + }, + "postcss-nesting": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz", + "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-normalize-charset": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.0.1.tgz", + "integrity": "sha512-6J40l6LNYnBdPSk+BHZ8SF+HAkS4q2twe5jnocgd+xWpz/mx/5Sa32m3W1AA8uE8XaXN+eg8trIlfu8V9x61eg==", + "dev": true + }, + "postcss-normalize-display-values": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.0.1.tgz", + "integrity": "sha512-uupdvWk88kLDXi5HEyI9IaAJTE3/Djbcrqq8YgjvAVuzgVuqIk3SuJWUisT2gaJbZm1H9g5k2w1xXilM3x8DjQ==", + "dev": true, + "requires": { + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-normalize-positions": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.0.1.tgz", + "integrity": "sha512-rvzWAJai5xej9yWqlCb1OWLd9JjW2Ex2BCPzUJrbaXmtKtgfL8dBMOOMTX6TnvQMtjk3ei1Lswcs78qKO1Skrg==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-normalize-repeat-style": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.0.1.tgz", + "integrity": "sha512-syZ2itq0HTQjj4QtXZOeefomckiV5TaUO6ReIEabCh3wgDs4Mr01pkif0MeVwKyU/LHEkPJnpwFKRxqWA/7O3w==", + "dev": true, + "requires": { + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-normalize-string": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.0.1.tgz", + "integrity": "sha512-Ic8GaQ3jPMVl1OEn2U//2pm93AXUcF3wz+OriskdZ1AOuYV25OdgS7w9Xu2LO5cGyhHCgn8dMXh9bO7vi3i9pA==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-normalize-timing-functions": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.0.1.tgz", + "integrity": "sha512-cPcBdVN5OsWCNEo5hiXfLUnXfTGtSFiBU9SK8k7ii8UD7OLuznzgNRYkLZow11BkQiiqMcgPyh4ZqXEEUrtQ1Q==", + "dev": true, + "requires": { + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-normalize-unicode": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.0.1.tgz", + "integrity": "sha512-kAtYD6V3pK0beqrU90gpCQB7g6AOfP/2KIPCVBKJM2EheVsBQmx/Iof+9zR9NFKLAx4Pr9mDhogB27pmn354nA==", + "dev": true, + "requires": { + "browserslist": "^4.16.0", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-normalize-url": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.0.2.tgz", + "integrity": "sha512-k4jLTPUxREQ5bpajFQZpx8bCF2UrlqOTzP9kEqcEnOfwsRshWs2+oAFIHfDQB8GO2PaUaSE0NlTAYtbluZTlHQ==", + "dev": true, + "requires": { + "is-absolute-url": "^3.0.3", + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-normalize-whitespace": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.0.1.tgz", + "integrity": "sha512-iPklmI5SBnRvwceb/XH568yyzK0qRVuAG+a1HFUsFRf11lEJTiQQa03a4RSCQvLKdcpX7XsI1Gen9LuLoqwiqA==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-ordered-values": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.0.2.tgz", + "integrity": "sha512-8AFYDSOYWebJYLyJi3fyjl6CqMEG/UVworjiyK1r573I56kb3e879sCJLGvR3merj+fAdPpVplXKQZv+ey6CgQ==", + "dev": true, + "requires": { + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-overflow-shorthand": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz", + "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-page-break": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz", + "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-place": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz", + "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-preset-env": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz", + "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==", + "dev": true, + "requires": { + "autoprefixer": "^9.6.1", + "browserslist": "^4.6.4", + "caniuse-lite": "^1.0.30000981", + "css-blank-pseudo": "^0.1.4", + "css-has-pseudo": "^0.10.0", + "css-prefers-color-scheme": "^3.1.1", + "cssdb": "^4.4.0", + "postcss": "^7.0.17", + "postcss-attribute-case-insensitive": "^4.0.1", + "postcss-color-functional-notation": "^2.0.1", + "postcss-color-gray": "^5.0.0", + "postcss-color-hex-alpha": "^5.0.3", + "postcss-color-mod-function": "^3.0.3", + "postcss-color-rebeccapurple": "^4.0.1", + "postcss-custom-media": "^7.0.8", + "postcss-custom-properties": "^8.0.11", + "postcss-custom-selectors": "^5.1.2", + "postcss-dir-pseudo-class": "^5.0.0", + "postcss-double-position-gradients": "^1.0.0", + "postcss-env-function": "^2.0.2", + "postcss-focus-visible": "^4.0.0", + "postcss-focus-within": "^3.0.0", + "postcss-font-variant": "^4.0.0", + "postcss-gap-properties": "^2.0.0", + "postcss-image-set-function": "^3.0.1", + "postcss-initial": "^3.0.0", + "postcss-lab-function": "^2.0.1", + "postcss-logical": "^3.0.0", + "postcss-media-minmax": "^4.0.0", + "postcss-nesting": "^7.0.0", + "postcss-overflow-shorthand": "^2.0.0", + "postcss-page-break": "^2.0.0", + "postcss-place": "^4.0.1", + "postcss-pseudo-class-any-link": "^6.0.0", + "postcss-replace-overflow-wrap": "^3.0.0", + "postcss-selector-matches": "^4.0.0", + "postcss-selector-not": "^4.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-pseudo-class-any-link": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz", + "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "dev": true + }, + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "dev": true, + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-reduce-initial": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.0.1.tgz", + "integrity": "sha512-zlCZPKLLTMAqA3ZWH57HlbCjkD55LX9dsRyxlls+wfuRfqCi5mSlZVan0heX5cHr154Dq9AfbH70LyhrSAezJw==", + "dev": true, + "requires": { + "browserslist": "^4.16.0", + "caniuse-api": "^3.0.0" + } + }, + "postcss-reduce-transforms": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.0.1.tgz", + "integrity": "sha512-a//FjoPeFkRuAguPscTVmRQUODP+f3ke2HqFNgGPwdYnpeC29RZdCBvGRGTsKpMURb/I3p6jdKoBQ2zI+9Q7kA==", + "dev": true, + "requires": { + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-replace-overflow-wrap": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz", + "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-selector-matches": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz", + "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "postcss": "^7.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-selector-not": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.1.tgz", + "integrity": "sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "postcss": "^7.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-selector-parser": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", + "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-svgo": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.0.2.tgz", + "integrity": "sha512-YzQuFLZu3U3aheizD+B1joQ94vzPfE6BNUcSYuceNxlVnKKsOtdo6hL9/zyC168Q8EwfLSgaDSalsUGa9f2C0A==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.1.0", + "svgo": "^2.3.0" + } + }, + "postcss-unique-selectors": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.0.1.tgz", + "integrity": "sha512-gwi1NhHV4FMmPn+qwBNuot1sG1t2OmacLQ/AX29lzyggnjd+MnVD5uqQmpXO3J17KGL2WAxQruj1qTd3H0gG/w==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.2", + "postcss-selector-parser": "^6.0.5", + "uniqs": "^2.0.0" + } + }, + "postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", + "dev": true + }, + "postcss-values-parser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz", + "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==", + "dev": true, + "requires": { + "flatten": "^1.0.2", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "preferred-pm": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/preferred-pm/-/preferred-pm-3.0.3.tgz", + "integrity": "sha512-+wZgbxNES/KlJs9q40F/1sfOd/j7f1O9JaHcW5Dsn3aUUOZg3L2bjpVUcKV2jvtElYfoTuQiNeMfQJ4kwUAhCQ==", + "dev": true, + "requires": { + "find-up": "^5.0.0", + "find-yarn-workspace-root2": "1.2.16", + "path-exists": "^4.0.0", + "which-pm": "2.0.0" + } + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "prettier": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.1.tgz", + "integrity": "sha512-p+vNbgpLjif/+D+DwAZAbndtRrR0md0MwfmOVN9N+2RgyACMT+7tfaRnT+WDPkqnuVwleyuBIG2XBxKDme3hPA==", + "dev": true + }, + "prettier-plugin-java": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/prettier-plugin-java/-/prettier-plugin-java-1.2.0.tgz", + "integrity": "sha512-Ts2kwjQiUZlr0TvvL5IAHwlnlYoAXucEzJqu56dhG09Fq3YDU+N3FCcfbJAYpvTCC3cetXA1sXpiu+exu1zzFw==", + "dev": true, + "requires": { + "java-parser": "1.2.0", + "lodash": "4.17.21", + "prettier": "2.3.1" + } + }, + "prettier-plugin-packagejson": { + "version": "2.2.11", + "resolved": "https://registry.npmjs.org/prettier-plugin-packagejson/-/prettier-plugin-packagejson-2.2.11.tgz", + "integrity": "sha512-oJCBCEkHIKScEv6qNQC47S39NXlevbzwvoJE3gflmBB8/3BEsC6ZRi+hwFVajw32b4tDI9hFXPIzmVd/T8Rm9w==", + "dev": true, + "requires": { + "sort-package-json": "1.50.0" + } + }, + "pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true + }, + "pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "15.0.14", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz", + "integrity": "sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "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" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "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" + } + }, + "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 + }, + "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 + }, + "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" + } + } + } + }, + "proc-log": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-1.0.0.tgz", + "integrity": "sha512-aCk8AO51s+4JyuYGg3Q/a6gnrlDO09NpVWePtjp7xwphcoQ04x5WAfCyugcsbLooWcMJ87CLkD4+604IckEdhg==", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "promise": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", + "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==", + "dev": true, + "requires": { + "asap": "~2.0.6" + } + }, + "promise-all-reject-late": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz", + "integrity": "sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==", + "dev": true + }, + "promise-call-limit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-call-limit/-/promise-call-limit-1.0.1.tgz", + "integrity": "sha512-3+hgaa19jzCGLuSCbieeRsu5C2joKfYn8pY6JAuXFRVfF4IO+L7UPpFWNTeWT9pM7uhskvbPPd/oEOktCn317Q==", + "dev": true + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "requires": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + } + }, + "prompts": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.1.tgz", + "integrity": "sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ==", + "dev": true, + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "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==", + "dev": true + }, + "qs": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.3.tgz", + "integrity": "sha1-HPyyXBCpsrSDBT/zn138kjOQjP4=", + "dev": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "randexp": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.5.3.tgz", + "integrity": "sha512-U+5l2KrcMNOUPYvazA3h5ekF80FHTUG+87SEAmHZmolh1M+i/WyTCxVzmi+tidIa1tM4BSe8g2Y/D3loWDjj+w==", + "dev": true, + "requires": { + "drange": "^1.0.2", + "ret": "^0.2.0" + } + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", + "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.3", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "raw-loader": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", + "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "dev": true, + "requires": { + "pify": "^2.3.0" + } + }, + "read-cmd-shim": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-2.0.0.tgz", + "integrity": "sha512-HJpV9bQpkl6KwjxlJcBoqu9Ba0PQg8TqSNIOrulGt54a0uup0HtevreFHzYzkm0lpnleRdNBzXznKrgxglEHQw==", + "dev": true + }, + "read-package-json-fast": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.2.tgz", + "integrity": "sha512-5fyFUyO9B799foVk4n6ylcoAktG/FbE3jwRKxvwaeSrIunaoMc0u81dzXxjeAFKOce7O5KncdfwpGvvs6r5PsQ==", + "dev": true, + "requires": { + "json-parse-even-better-errors": "^2.3.0", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "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" + } + }, + "locate-path": { + "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" + } + }, + "p-limit": { + "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" + } + }, + "p-locate": { + "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" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdir-scoped-modules": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz", + "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==", + "dev": true, + "requires": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", + "dev": true + }, + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", + "dev": true + }, + "regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regex-parser": { + "version": "2.2.11", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", + "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==", + "dev": true + }, + "regexp-to-ast": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.5.0.tgz", + "integrity": "sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==", + "dev": true + }, + "regexp.prototype.flags": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true + }, + "regexpu-core": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", + "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + } + }, + "regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", + "dev": true + }, + "regjsparser": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz", + "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", + "dev": true + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "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" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "resolve-url-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz", + "integrity": "sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==", + "dev": true, + "requires": { + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^7.0.35", + "source-map": "0.6.1" + }, + "dependencies": { + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "resp-modifier": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/resp-modifier/-/resp-modifier-6.0.2.tgz", + "integrity": "sha1-sSTeXE+6/LpUH0j/pzlw9KpFa08=", + "dev": true, + "requires": { + "debug": "^2.2.0", + "minimatch": "^3.0.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.2.2.tgz", + "integrity": "sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==", + "dev": true + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", + "dev": true + }, + "rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", + "dev": true + }, + "rimraf": { + "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" + } + }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "rx": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", + "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=", + "dev": true + }, + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "requires": { + "tslib": "^1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + }, + "dependencies": { + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + } + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sass": { + "version": "1.35.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.35.1.tgz", + "integrity": "sha512-oCisuQJstxMcacOPmxLNiLlj4cUyN2+8xJnG7VanRoh2GOLr9RqkvI4AxA4a6LHVg/rsu+PmxXeGhrdSF9jCiQ==", + "dev": true, + "requires": { + "chokidar": ">=3.0.0 <4.0.0" + } + }, + "sass-loader": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.1.0.tgz", + "integrity": "sha512-FVJZ9kxVRYNZTIe2xhw93n3xJNYZADr+q69/s98l9nTCrWASo+DR2Ot0s5xTKQDDEosUkatsGeHxcH4QBp5bSg==", + "dev": true, + "requires": { + "klona": "^2.0.4", + "neo-async": "^2.6.2" + } + }, + "sax": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", + "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=", + "dev": true + }, + "saxes": { + "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" + } + }, + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + } + } + }, + "scoped-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/scoped-regex/-/scoped-regex-2.1.0.tgz", + "integrity": "sha512-g3WxHrqSWCZHGHlSrF51VXFdjImhwvH8ZO/pryFH56Qi0cDsZfylQa/t0jCzVQFNbNvM00HfHjkDPEuarKDSWQ==", + "dev": true + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selfsigned": { + "version": "1.10.11", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz", + "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==", + "dev": true, + "requires": { + "node-forge": "^0.10.0" + } + }, + "semver": { + "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" + } + }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "dev": true + }, + "semver-regex": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-3.1.2.tgz", + "integrity": "sha512-bXWyL6EAKOJa81XG1OZ/Yyuq+oT0b2YLlxx7c+mrdYPaPbnj6WgVULXhinMIeZGufuUBu/eVRqXEhiv4imfwxA==", + "dev": true + }, + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + } + } + }, + "serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" + } + }, + "server-destroy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", + "integrity": "sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0=", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + } + } + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "shebang-command": { + "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" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "shelljs": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", + "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", + "dev": true, + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "dev": true, + "requires": { + "is-arrayish": "^0.3.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true + } + } + }, + "sirv": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.12.tgz", + "integrity": "sha512-+jQoCxndz7L2tqQL4ZyzfDhky0W/4ZJip3XoOuxyQWnAwMxindLl3Xv1qT4x1YX/re0leShvTm8Uk0kQspGhBg==", + "dev": true, + "requires": { + "@polka/url": "^1.0.0-next.15", + "mime": "^2.3.1", + "totalist": "^1.0.0" + }, + "dependencies": { + "mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "dev": true + } + } + }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "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==", + "dev": true + }, + "slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "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" + } + }, + "color-convert": { + "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" + } + }, + "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 + } + } + }, + "smart-buffer": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", + "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "socket.io": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.4.0.tgz", + "integrity": "sha512-9UPJ1UTvKayuQfVv2IQ3k7tCQC/fboDyIK62i99dAQIyHKaBsNdTpwHLgKJ6guRWxRtC9H+138UwpaGuQO9uWQ==", + "dev": true, + "requires": { + "debug": "~4.1.0", + "engine.io": "~3.5.0", + "has-binary2": "~1.0.2", + "socket.io-adapter": "~1.1.0", + "socket.io-client": "2.4.0", + "socket.io-parser": "~3.4.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "socket.io-adapter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", + "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==", + "dev": true + }, + "socket.io-client": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.4.0.tgz", + "integrity": "sha512-M6xhnKQHuuZd4Ba9vltCLT9oa+YvTsP8j9NcEiLElfIg8KeYPyhWOes6x4t+LTAC8enQbE/995AdTem2uNyKKQ==", + "dev": true, + "requires": { + "backo2": "1.0.2", + "component-bind": "1.0.0", + "component-emitter": "~1.3.0", + "debug": "~3.1.0", + "engine.io-client": "~3.5.0", + "has-binary2": "~1.0.2", + "indexof": "0.0.1", + "parseqs": "0.0.6", + "parseuri": "0.0.6", + "socket.io-parser": "~3.3.0", + "to-array": "0.1.4" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "socket.io-parser": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.2.tgz", + "integrity": "sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg==", + "dev": true, + "requires": { + "component-emitter": "~1.3.0", + "debug": "~3.1.0", + "isarray": "2.0.1" + } + } + } + }, + "socket.io-parser": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz", + "integrity": "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "debug": "~4.1.0", + "isarray": "2.0.1" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + } + } + }, + "sockjs": { + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", + "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", + "dev": true, + "requires": { + "faye-websocket": "^0.11.3", + "uuid": "^3.4.0", + "websocket-driver": "^0.7.4" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } + } + }, + "sockjs-client": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.0.tgz", + "integrity": "sha512-8Dt3BDi4FYNrCFGTL/HtwVzkARrENdwOUf1ZoW/9p3M8lZdFT35jVdrHza+qgxuG9H3/shR4cuX/X9umUrjP8Q==", + "requires": { + "debug": "^3.2.6", + "eventsource": "^1.0.7", + "faye-websocket": "^0.11.3", + "inherits": "^2.0.4", + "json3": "^3.3.3", + "url-parse": "^1.4.7" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "socks": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.1.tgz", + "integrity": "sha512-kLQ9N5ucj8uIcxrDwjm0Jsqk06xdpBjGNQtpXy4Q8/QY2k+fY7nZH8CARy+hkbG+SGAovmzzuauCpBlb8FrnBA==", + "dev": true, + "requires": { + "ip": "^1.1.5", + "smart-buffer": "^4.1.0" + } + }, + "socks-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz", + "integrity": "sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==", + "dev": true, + "requires": { + "agent-base": "^6.0.2", + "debug": "4", + "socks": "^2.3.3" + } + }, + "sort-object-keys": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sort-object-keys/-/sort-object-keys-1.1.3.tgz", + "integrity": "sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==", + "dev": true + }, + "sort-package-json": { + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/sort-package-json/-/sort-package-json-1.50.0.tgz", + "integrity": "sha512-qZpqhMU9XTntebgAgc4hv/D6Fzhh7kFnwvV6a7+q8y8J5JoaDqPYQnvXPf7BBqG95tdE8X6JVNo7/jDzcbdfUg==", + "dev": true, + "requires": { + "detect-indent": "^6.0.0", + "detect-newline": "3.1.0", + "git-hooks-list": "1.0.3", + "globby": "10.0.0", + "is-plain-obj": "2.1.0", + "sort-object-keys": "^1.1.3" + }, + "dependencies": { + "globby": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.0.tgz", + "integrity": "sha512-3LifW9M4joGZasyYPz2A1U74zbC/45fvpXUvO/9KbSa+VV0aGZarWkfdgKyR9sExNP0t0x0ss/UMJpNpcaTspw==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + } + }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + } + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + }, + "source-map-js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", + "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==", + "dev": true + }, + "source-map-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.0.tgz", + "integrity": "sha512-GKGWqWvYr04M7tn8dryIWvb0s8YM41z82iQv01yBtIylgxax0CwvSy6gc2Y02iuXwEfGWRlMicH0nvms9UZphw==", + "dev": true, + "requires": { + "abab": "^2.0.5", + "iconv-lite": "^0.6.2", + "source-map-js": "^0.6.2" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, + "source-map-resolve": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", + "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0" + } + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "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 + } + } + }, + "source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "dev": true + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "spawn-command": { + "version": "0.0.2-1", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", + "integrity": "sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=", + "dev": true + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz", + "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==", + "dev": true + }, + "spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "dev": true, + "requires": { + "minipass": "^3.1.1" + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", + "dev": true + }, + "stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", + "dev": true, + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "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==", + "dev": true + } + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "dev": true + }, + "stream-throttle": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz", + "integrity": "sha1-rdV8jXzHOoFjDTHNVdOWHPr7qcM=", + "dev": true, + "requires": { + "commander": "^2.2.0", + "limiter": "^1.0.5" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + } + } + }, + "streamfilter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/streamfilter/-/streamfilter-3.0.0.tgz", + "integrity": "sha512-kvKNfXCmUyC8lAXSSHCIXBUlo/lhsLcCU/OmzACZYpRUdtKIH68xYhm/+HI15jFJYtNJGYtCgn2wmIiExY1VwA==", + "dev": true, + "requires": { + "readable-stream": "^3.0.6" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "string-argv": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", + "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "dev": true + }, + "string-length": { + "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" + } + }, + "string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dev": true, + "requires": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "dependencies": { + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + } + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "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==", + "dev": true + }, + "strip-bom-buf": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-buf/-/strip-bom-buf-1.0.0.tgz", + "integrity": "sha1-HLRar1dTD0yvhsf3UXnSyaUd1XI=", + "dev": true, + "requires": { + "is-utf8": "^0.2.1" + } + }, + "strip-bom-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz", + "integrity": "sha1-+H217yYT9paKpUWr/h7HKLaoKco=", + "dev": true, + "requires": { + "first-chunk-stream": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + } + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "style-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-2.0.0.tgz", + "integrity": "sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "stylehacks": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.0.1.tgz", + "integrity": "sha512-Es0rVnHIqbWzveU1b24kbw92HsebBepxfcqe5iix7t9j0PQqhs0IxXVXv0pY2Bxa08CgMkzD6OWql7kbGOuEdA==", + "dev": true, + "requires": { + "browserslist": "^4.16.0", + "postcss-selector-parser": "^6.0.4" + } + }, + "stylus": { + "version": "0.54.8", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.8.tgz", + "integrity": "sha512-vr54Or4BZ7pJafo2mpf0ZcwA74rpuYCZbxrHBsH8kbcXOwSfvBFwsRfpGO5OD5fhG5HDCFW737PKaawI7OqEAg==", + "dev": true, + "requires": { + "css-parse": "~2.0.0", + "debug": "~3.1.0", + "glob": "^7.1.6", + "mkdirp": "~1.0.4", + "safer-buffer": "^2.1.2", + "sax": "~1.2.4", + "semver": "^6.3.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "stylus-loader": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-6.1.0.tgz", + "integrity": "sha512-qKO34QCsOtSJrXxQQmXsPeaVHh6hMumBAFIoJTcsSr2VzrA6o/CW9HCGR8spCjzJhN8oKQHdj/Ytx0wwXyElkw==", + "dev": true, + "requires": { + "fast-glob": "^3.2.5", + "klona": "^2.0.4", + "normalize-path": "^3.0.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "supports-hyperlinks": { + "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" + }, + "dependencies": { + "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 + }, + "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" + } + } + } + }, + "svgo": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.3.1.tgz", + "integrity": "sha512-riDDIQgXpEnn0BEl9Gvhh1LNLIyiusSpt64IR8upJu7MwxnzetmF/Y57pXQD2NMX2lVyMRzXt5f2M5rO4wG7Dw==", + "dev": true, + "requires": { + "@trysound/sax": "0.1.1", + "chalk": "^4.1.0", + "commander": "^7.1.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.2", + "csso": "^4.2.0", + "stable": "^0.1.8" + }, + "dependencies": { + "ansi-styles": { + "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" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "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" + } + }, + "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 + }, + "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 + }, + "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" + } + } + } + }, + "swagger-ui-dist": { + "version": "3.50.0", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-3.50.0.tgz", + "integrity": "sha512-BklniOBPlvZ6M9oGkhUwOf5HvxhkHBIycXN3ndju8WlLmi1xfMSdOA2AR6pNswlwURzsZUe1rh80aUyjnpD+Zw==" + }, + "symbol-observable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", + "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", + "dev": true + }, + "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==", + "dev": true + }, + "table": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", + "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", + "dev": true, + "requires": { + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "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" + } + }, + "color-convert": { + "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" + } + }, + "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 + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + } + } + }, + "tapable": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz", + "integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==", + "dev": true + }, + "tar": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.0.tgz", + "integrity": "sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==", + "dev": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + }, + "terminal-link": { + "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" + } + }, + "terser": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.7.0.tgz", + "integrity": "sha512-HP5/9hp2UaZt5fYkuhNBR8YyRcT8juw8+uFbAme53iN9hblvKnLUTKkmwJG6ocWpIKf8UK4DoeWG4ty0J6S6/g==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.19" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + } + } + }, + "terser-webpack-plugin": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.1.3.tgz", + "integrity": "sha512-cxGbMqr6+A2hrIB5ehFIF+F/iST5ZOxvOmy9zih9ySbP1C2oEWQSOUS+2SNBTjzx5xLKO4xnod9eywdfq1Nb9A==", + "dev": true, + "requires": { + "jest-worker": "^27.0.2", + "p-limit": "^3.1.0", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1", + "source-map": "^0.6.1", + "terser": "^5.7.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "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 + } + } + }, + "test-exclude": { + "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", + "minimatch": "^3.0.4" + } + }, + "text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", + "dev": true + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "textextensions": { + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-5.12.0.tgz", + "integrity": "sha512-IYogUDaP65IXboCiPPC0jTLLBzYlhhw2Y4b0a2trPgbHNGGGEfuHE6tds+yDcCf4mpNDaGISFzwSSezcXt+d6w==", + "dev": true + }, + "tfunk": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tfunk/-/tfunk-4.0.0.tgz", + "integrity": "sha512-eJQ0dGfDIzWNiFNYFVjJ+Ezl/GmwHaFTBTjrtqNPW0S7cuVDBrZrmzUz6VkMeCR4DZFqhd4YtLwsw3i2wYHswQ==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "dlv": "^1.1.3" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "dev": true, + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==", + "dev": true + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "qs": { + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", + "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + } + } + }, + "throat": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", + "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", + "dev": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "dev": true + }, + "to-absolute-glob": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", + "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", + "dev": true, + "requires": { + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" + } + }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "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" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "totalist": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", + "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", + "dev": true + }, + "tough-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "dev": true, + "requires": { + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tr46": { + "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" + } + }, + "tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true + }, + "treeverse": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/treeverse/-/treeverse-1.0.4.tgz", + "integrity": "sha512-whw60l7r+8ZU8Tu/Uc2yxtc4ZTZbR/PF3u1IPNKGQ6p8EICLb3Z2lAgoqw9bqYd8IkgnsaOcLzYHFckjqNsf0g==", + "dev": true + }, + "triple-beam": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", + "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==", + "dev": true + }, + "ts-jest": { + "version": "27.0.3", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.0.3.tgz", + "integrity": "sha512-U5rdMjnYam9Ucw+h0QvtNDbc5+88nxt7tbIvqaZUhFrfG4+SkWhMXjejCLVGcpILTPuV+H3W/GZDZrnZFpPeXw==", + "dev": true, + "requires": { + "bs-logger": "0.x", + "buffer-from": "1.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^27.0.0", + "json5": "2.x", + "lodash": "4.x", + "make-error": "1.x", + "mkdirp": "1.x", + "semver": "7.x", + "yargs-parser": "20.x" + } + }, + "ts-node": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.0.0.tgz", + "integrity": "sha512-ROWeOIUvfFbPZkoDis0L/55Fk+6gFQNZwwKPLinacRl6tsxstTF1DbAcLKkovwnpKMVvOMHP1TIbnwXwtLg1gg==", + "dev": true, + "requires": { + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.17", + "yn": "3.1.1" + } + }, + "tsconfig-paths": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", + "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "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==", + "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==", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "typedarray-to-buffer": { + "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" + } + }, + "typescript": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz", + "integrity": "sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg==", + "dev": true + }, + "ua-parser-js": { + "version": "0.7.28", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.28.tgz", + "integrity": "sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g==", + "dev": true + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + } + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", + "dev": true + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "universal-user-agent": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", + "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", + "dev": true + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", + "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-parse": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz", + "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==", + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "v8-to-istanbul": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.0.0.tgz", + "integrity": "sha512-LkmXi8UUNxnCC+JlH7/fsfsKr5AU110l+SYGJimWNkWhxbN5EyeOtm1MJ0hhvqMMOhGwBj1Fp70Yv9i+hX0QAg==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + } + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "validate-npm-package-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", + "dev": true, + "requires": { + "builtins": "^1.0.3" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vinyl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", + "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", + "dev": true, + "requires": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + }, + "dependencies": { + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + } + } + }, + "vinyl-file": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/vinyl-file/-/vinyl-file-3.0.0.tgz", + "integrity": "sha1-sQTZ5ECf+jJfqt1SBkLQo7SIs2U=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.3.0", + "strip-bom-buf": "^1.0.0", + "strip-bom-stream": "^2.0.0", + "vinyl": "^2.0.1" + } + }, + "w3c-hr-time": { + "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" + } + }, + "w3c-xmlserializer": { + "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" + } + }, + "wait-on": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-5.3.0.tgz", + "integrity": "sha512-DwrHrnTK+/0QFaB9a8Ol5Lna3k7WvUR4jzSKmz0YaPBpuN2sACyiPVKVfj6ejnjcajAcvn3wlbTyMIn9AZouOg==", + "dev": true, + "requires": { + "axios": "^0.21.1", + "joi": "^17.3.0", + "lodash": "^4.17.21", + "minimist": "^1.2.5", + "rxjs": "^6.6.3" + } + }, + "walk-up-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-1.0.0.tgz", + "integrity": "sha512-hwj/qMDUEjCU5h0xr90KGCf0tg0/LgJbmOWgrWKYlcJZM7XvquvUJZ0G/HMGr7F7OQMOUuPHWP9JpriinkAlkg==", + "dev": true + }, + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true, + "requires": { + "makeerror": "1.0.x" + } + }, + "watchpack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.2.0.tgz", + "integrity": "sha512-up4YAn/XHgZHIxFBVCdlMiWDj6WaLKpwVeGQk2I5thdYxF/KmF0aaz6TfJZ/hfl1h/XlcDr7k1KH7ThDagpFaA==", + "dev": true, + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true + }, + "webpack": { + "version": "5.41.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.41.1.tgz", + "integrity": "sha512-AJZIIsqJ/MVTmegEq9Tlw5mk5EHdGiJbDdz9qP15vmUH+oxI1FdWcL0E9EO8K/zKaRPWqEs7G/OPxq1P61u5Ug==", + "dev": true, + "requires": { + "@types/eslint-scope": "^3.7.0", + "@types/estree": "^0.0.48", + "@webassemblyjs/ast": "1.11.0", + "@webassemblyjs/wasm-edit": "1.11.0", + "@webassemblyjs/wasm-parser": "1.11.0", + "acorn": "^8.2.1", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.8.0", + "es-module-lexer": "^0.6.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.4", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.0.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.2.0", + "webpack-sources": "^2.3.0" + }, + "dependencies": { + "@types/estree": { + "version": "0.0.48", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.48.tgz", + "integrity": "sha512-LfZwXoGUDo0C3me81HXgkBg5CTQYb6xzEl+fNmbO4JdRiSKQ8A0GD1OBBvKAIsbCUgoyAty7m99GqqMQe784ew==", + "dev": true + }, + "acorn": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.1.tgz", + "integrity": "sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==", + "dev": true + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "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 + }, + "webpack-sources": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.0.tgz", + "integrity": "sha512-WyOdtwSvOML1kbgtXbTDnEW0jkJ7hZr/bDByIwszhWd/4XX1A3XMkrbFMsuH4+/MfLlZCUzlAdg4r7jaGKEIgQ==", + "dev": true, + "requires": { + "source-list-map": "^2.0.1", + "source-map": "^0.6.1" + } + } + } + }, + "webpack-bundle-analyzer": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.4.2.tgz", + "integrity": "sha512-PIagMYhlEzFfhMYOzs5gFT55DkUdkyrJi/SxJp8EF3YMWhS+T9vvs2EoTetpk5qb6VsCq02eXTlRDOydRhDFAQ==", + "dev": true, + "requires": { + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "chalk": "^4.1.0", + "commander": "^6.2.0", + "gzip-size": "^6.0.0", + "lodash": "^4.17.20", + "opener": "^1.5.2", + "sirv": "^1.0.7", + "ws": "^7.3.1" + }, + "dependencies": { + "acorn": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.1.tgz", + "integrity": "sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==", + "dev": true + }, + "acorn-walk": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.1.1.tgz", + "integrity": "sha512-FbJdceMlPHEAWJOILDk1fXD8lnTlEIWFkqtfk+MvmL5q/qlHfN7GEHcsFZWt/Tea9jRNPWUZG4G976nqAAmU9w==", + "dev": true + }, + "ansi-styles": { + "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" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "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" + } + }, + "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 + }, + "commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "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==", + "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" + } + } + } + }, + "webpack-dev-middleware": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.0.0.tgz", + "integrity": "sha512-9zng2Z60pm6A98YoRcA0wSxw1EYn7B7y5owX/Tckyt9KGyULTkLtiavjaXlWqOMkM0YtqGgL3PvMOFgyFLq8vw==", + "dev": true, + "requires": { + "colorette": "^1.2.2", + "mem": "^8.1.1", + "memfs": "^3.2.2", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "mem": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/mem/-/mem-8.1.1.tgz", + "integrity": "sha512-qFCFUDs7U3b8mBDPyz5EToEKoAkgCzqquIgi9nkkR9bixxOVOre+09lbuH7+9Kn2NFpm56M3GUWVbU2hQgdACA==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.3", + "mimic-fn": "^3.1.0" + } + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "webpack-dev-server": { + "version": "3.11.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz", + "integrity": "sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ==", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.3.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.8", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.26", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.8", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "^0.3.21", + "sockjs-client": "^1.5.0", + "spdy": "^4.0.2", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "^13.3.2" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "dev": true + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "p-limit": { + "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" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "webpack-dev-middleware": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", + "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", + "dev": true, + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } + } + }, + "webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + } + }, + "webpack-notifier": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/webpack-notifier/-/webpack-notifier-1.13.0.tgz", + "integrity": "sha512-QLk6l/TZKGhyN6Hd1zobaiYno7S9YPX3wH86+YOSufHes77SegGhnGdj+4vrLDFK5A4ZKoQD5GRXXFnM0h0N8A==", + "dev": true, + "requires": { + "node-notifier": "^9.0.0", + "strip-ansi": "^6.0.0" + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "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 + } + } + }, + "webpack-subresource-integrity": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.5.2.tgz", + "integrity": "sha512-GBWYBoyalbo5YClwWop9qe6Zclp8CIXYGIz12OPclJhIrSplDxs1Ls1JDMH8xBPPrg1T6ISaTW9Y6zOrwEiAzw==", + "dev": true, + "requires": { + "webpack-sources": "^1.3.0" + } + }, + "websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==" + }, + "webstomp-client": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/webstomp-client/-/webstomp-client-1.2.6.tgz", + "integrity": "sha512-9HajO6Ki2ViEGIusLZtjM2lcO2VaQUvtXhLQQ4Cm543RLjfTCEgI3sFaiXts3TvfZgrtY/vI/+qUkm2qWD/NVg==" + }, + "whatwg-encoding": { + "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" + } + }, + "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==", + "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", + "webidl-conversions": "^6.1.0" + } + }, + "which": { + "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" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "which-pm": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-pm/-/which-pm-2.0.0.tgz", + "integrity": "sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==", + "dev": true, + "requires": { + "load-yaml-file": "^0.2.0", + "path-exists": "^4.0.0" + } + }, + "which-pm-runs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", + "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=", + "dev": true + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true + }, + "windows-release": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.3.3.tgz", + "integrity": "sha512-OSOGH1QYiW5yVor9TtmXKQvt2vjQqbYS+DqmsZw+r7xDwLXEeT3JGW0ZppFmHx4diyXmxt238KFR3N9jzevBRg==", + "dev": true, + "requires": { + "execa": "^1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "winston": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.3.3.tgz", + "integrity": "sha512-oEXTISQnC8VlSAKf1KYSSd7J6IWuRPQqDdo8eoRNaYKLvwSb5+79Z3Yi1lrl6KDpU6/VWaxpakDAtb1oQ4n9aw==", + "dev": true, + "requires": { + "@dabh/diagnostics": "^2.0.2", + "async": "^3.1.0", + "is-stream": "^2.0.0", + "logform": "^2.2.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.4.0" + }, + "dependencies": { + "async": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", + "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==", + "dev": true + } + } + }, + "winston-transport": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.4.0.tgz", + "integrity": "sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw==", + "dev": true, + "requires": { + "readable-stream": "^2.3.7", + "triple-beam": "^1.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "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==", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "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==" + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "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", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "ws": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.1.tgz", + "integrity": "sha512-2c6faOUH/nhoQN6abwMloF7Iyl0ZS2E9HGtsiLrWn0zOOMWlhtDmdf/uihDt6jnuCxgtwGBNy6Onsoy2s2O2Ow==", + "dev": true + }, + "xml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=", + "dev": true + }, + "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==", + "dev": true + }, + "xml2js": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~9.0.1" + } + }, + "xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", + "dev": true + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "xmlhttprequest-ssl": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.3.tgz", + "integrity": "sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q==", + "dev": true + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "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==" + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", + "dev": true + }, + "yeoman-environment": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/yeoman-environment/-/yeoman-environment-3.4.1.tgz", + "integrity": "sha512-Bu3kN5sTOyAcbO/cKEQf6KOxsLta9oRF59saLOKnt3OQM+hXapnWaAHcrat3dygd6l34KjxwM5AMJp09TDa8yw==", + "dev": true, + "requires": { + "@npmcli/arborist": "^2.2.2", + "are-we-there-yet": "^1.1.5", + "arrify": "^2.0.1", + "binaryextensions": "^4.15.0", + "chalk": "^4.1.0", + "cli-table": "^0.3.1", + "commander": "7.1.0", + "dateformat": "^4.5.0", + "debug": "^4.1.1", + "diff": "^5.0.0", + "error": "^10.4.0", + "escape-string-regexp": "^4.0.0", + "execa": "^5.0.0", + "find-up": "^5.0.0", + "globby": "^11.0.1", + "grouped-queue": "^2.0.0", + "inquirer": "^8.0.0", + "is-scoped": "^2.1.0", + "lodash": "^4.17.10", + "log-symbols": "^4.0.0", + "mem-fs": "^1.2.0 || ^2.0.0", + "mem-fs-editor": "^8.1.2 || ^9.0.0", + "minimatch": "^3.0.4", + "npmlog": "^4.1.2", + "p-queue": "^6.6.2", + "pacote": "^11.2.6", + "preferred-pm": "^3.0.3", + "pretty-bytes": "^5.3.0", + "semver": "^7.1.3", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0", + "text-table": "^0.2.0", + "textextensions": "^5.12.0", + "untildify": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "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" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "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" + } + }, + "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 + }, + "commander": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.1.0.tgz", + "integrity": "sha512-pRxBna3MJe6HKnBGsDyMv8ETbptw3axEdYHoqNh7gu5oDcew8fs0xnivZGm06Ogk8zGAJ9VX+OPEr2GXEQK4dg==", + "dev": true + }, + "diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "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==", + "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" + } + } + } + }, + "yeoman-generator": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/yeoman-generator/-/yeoman-generator-5.3.0.tgz", + "integrity": "sha512-OE+qDs/c5V3HP29hUlyUO7ejpLSJX93LZ+KFRmyYmPMvcbnsdHynF6LyOh0vLPuqsi/x50MxZfob/EIQ06E4EQ==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "dargs": "^7.0.0", + "debug": "^4.1.1", + "execa": "^4.1.0", + "github-username": "^6.0.0", + "lodash": "^4.17.11", + "minimist": "^1.2.5", + "read-pkg-up": "^7.0.1", + "run-async": "^2.0.0", + "semver": "^7.2.1", + "shelljs": "^0.8.4", + "text-table": "^0.2.0" + }, + "dependencies": { + "ansi-styles": { + "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" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "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" + } + }, + "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 + }, + "execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "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 + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "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" + } + } + } + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + }, + "zone.js": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.4.tgz", + "integrity": "sha512-DDh2Ab+A/B+9mJyajPjHFPWfYU1H+pdun4wnnk0OcQTNjem1XQSZ2CDW+rfZEUDjv5M19SBqAkjZi0x5wuB5Qw==", + "requires": { + "tslib": "^2.0.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..c057946 --- /dev/null +++ b/package.json @@ -0,0 +1,142 @@ +{ + "name": "data-survey", + "version": "0.0.1-SNAPSHOT", + "private": true, + "description": "Description for DataSurvey", + "license": "UNLICENSED", + "scripts": { + "prettier:check": "prettier --check \"{,src/**/,webpack/}*.{md,json,yml,html,js,ts,tsx,css,scss,java}\"", + "prettier:format": "prettier --write \"{,src/**/,webpack/}*.{md,json,yml,html,js,ts,tsx,css,scss,java}\"", + "lint": "eslint . --ext .js,.ts", + "lint:fix": "npm run lint -- --fix", + "cleanup": "rimraf target/classes/static/", + "clean-www": "rimraf target/classes/static/app/{src,target/}", + "jest": "jest --coverage --logHeapUsage --maxWorkers=2 --config jest.conf.js", + "start": "ng serve --hmr", + "start-tls": "npm run webapp:dev -- --env.tls", + "serve": "npm run start", + "build": "npm run webapp:prod", + "pretest": "npm run lint", + "test": "ng test --coverage --log-heap-usage -w=2", + "test:watch": "npm run test -- --watch", + "watch": "concurrently npm:start npm:backend:start", + "webapp:build": "npm run clean-www && npm run webapp:build:dev", + "webapp:build:dev": "ng build --configuration development", + "webapp:build:prod": "ng build --configuration production", + "webapp:dev": "ng serve", + "webapp:dev-verbose": "ng serve --verbose", + "webapp:prod": "npm run clean-www && npm run webapp:build:prod", + "webapp:test": "npm run test", + "docker:db:up": "docker-compose -f src/main/docker/mysql.yml up -d", + "docker:db:down": "docker-compose -f src/main/docker/mysql.yml down -v --remove-orphans", + "docker:others:await": "", + "predocker:others:up": "", + "docker:others:up": "", + "docker:others:down": "", + "ci:e2e:prepare:docker": "npm run docker:db:up && npm run docker:others:up && docker ps -a", + "ci:e2e:prepare": "npm run ci:e2e:prepare:docker", + "ci:e2e:teardown:docker": "npm run docker:db:down --if-present && npm run docker:others:down && docker ps -a", + "ci:e2e:teardown": "npm run ci:e2e:teardown:docker", + "backend:info": "./mvnw -ntp enforcer:display-info --batch-mode", + "backend:doc:test": "./mvnw -ntp javadoc:javadoc --batch-mode", + "backend:nohttp:test": "./mvnw -ntp checkstyle:check --batch-mode", + "backend:start": "./mvnw -P-webapp", + "java:jar": "./mvnw -ntp verify -DskipTests --batch-mode", + "java:war": "./mvnw -ntp verify -DskipTests --batch-mode -Pwar", + "java:docker": "./mvnw -ntp verify -DskipTests jib:dockerBuild", + "backend:unit:test": "./mvnw -ntp -P-webapp verify --batch-mode -Dlogging.level.ROOT=OFF -Dlogging.level.org.zalando=OFF -Dlogging.level.tech.jhipster=OFF -Dlogging.level.org.datasurvey=OFF -Dlogging.level.org.springframework=OFF -Dlogging.level.org.springframework.web=OFF -Dlogging.level.org.springframework.security=OFF", + "backend:build-cache": "./mvnw dependency:go-offline", + "java:jar:dev": "npm run java:jar -- -Pdev,webapp", + "java:jar:prod": "npm run java:jar -- -Pprod", + "java:war:dev": "npm run java:war -- -Pdev,webapp", + "java:war:prod": "npm run java:war -- -Pprod", + "java:docker:dev": "npm run java:docker -- -Pdev,webapp", + "java:docker:prod": "npm run java:docker -- -Pprod", + "ci:backend:test": "npm run backend:info && npm run backend:doc:test && npm run backend:nohttp:test && npm run backend:unit:test", + "ci:server:package": "npm run java:$npm_package_config_packaging:$npm_package_config_default_environment", + "ci:e2e:package": "npm run java:$npm_package_config_packaging:$npm_package_config_default_environment -- -Pe2e -Denforcer.skip=true", + "preci:e2e:server:start": "npm run docker:db:await --if-present && npm run docker:others:await --if-present", + "ci:e2e:server:start": "java -jar target/e2e.$npm_package_config_packaging --spring.profiles.active=$npm_package_config_default_environment -Dlogging.level.ROOT=OFF -Dlogging.level.org.zalando=OFF -Dlogging.level.tech.jhipster=OFF -Dlogging.level.org.datasurvey=OFF -Dlogging.level.org.springframework=OFF -Dlogging.level.org.springframework.web=OFF -Dlogging.level.org.springframework.security=OFF --logging.level.org.springframework.web=ERROR", + "ci:frontend:build": "npm run webapp:build:$npm_package_config_default_environment", + "ci:frontend:test": "npm run ci:frontend:build && npm test" + }, + "config": { + "backend_port": 8080, + "default_environment": "prod", + "packaging": "jar" + }, + "dependencies": { + "@angular/common": "12.0.5", + "@angular/compiler": "12.0.5", + "@angular/core": "12.0.5", + "@angular/forms": "12.0.5", + "@angular/localize": "12.0.5", + "@angular/platform-browser": "12.0.5", + "@angular/platform-browser-dynamic": "12.0.5", + "@angular/router": "12.0.5", + "@fortawesome/angular-fontawesome": "0.9.0", + "@fortawesome/fontawesome-svg-core": "1.2.35", + "@fortawesome/free-solid-svg-icons": "5.15.3", + "@ng-bootstrap/ng-bootstrap": "9.1.3", + "@ngx-translate/core": "13.0.0", + "@ngx-translate/http-loader": "6.0.0", + "bootstrap": "4.6.0", + "dayjs": "1.10.5", + "ngx-infinite-scroll": "10.0.1", + "ngx-webstorage": "8.0.0", + "rxjs": "6.6.7", + "sockjs-client": "1.5.0", + "swagger-ui-dist": "3.50.0", + "tslib": "2.3.0", + "webstomp-client": "1.2.6", + "zone.js": "0.11.4" + }, + "devDependencies": { + "@angular-builders/custom-webpack": "12.1.0", + "@angular-builders/jest": "12.1.0", + "@angular-eslint/eslint-plugin": "12.1.0", + "@angular/cli": "12.0.4", + "@angular/compiler-cli": "12.0.5", + "@angular/service-worker": "12.0.5", + "@types/jest": "26.0.23", + "@types/node": "15.12.2", + "@types/sockjs-client": "1.5.0", + "@typescript-eslint/eslint-plugin": "4.27.0", + "@typescript-eslint/parser": "4.27.0", + "browser-sync": "2.26.14", + "browser-sync-webpack-plugin": "2.3.0", + "concurrently": "6.2.0", + "copy-webpack-plugin": "9.0.0", + "eslint": "7.28.0", + "eslint-config-prettier": "8.3.0", + "eslint-webpack-plugin": "2.5.4", + "generator-jhipster": "7.1.0", + "husky": "4.3.8", + "jest": "27.0.4", + "jest-date-mock": "1.0.8", + "jest-junit": "12.2.0", + "jest-sonar-reporter": "2.0.0", + "lint-staged": "11.0.0", + "merge-jsons-webpack-plugin": "1.0.21", + "prettier": "2.3.1", + "prettier-plugin-java": "1.2.0", + "prettier-plugin-packagejson": "2.2.11", + "rimraf": "3.0.2", + "ts-jest": "27.0.3", + "typescript": "4.2.4", + "wait-on": "5.3.0", + "webpack-bundle-analyzer": "4.4.2", + "webpack-merge": "5.8.0", + "webpack-notifier": "1.13.0" + }, + "engines": { + "node": ">=14.17.1" + }, + "cacheDirectories": [ + "node_modules" + ], + "jestSonar": { + "reportPath": "target/test-results/jest", + "reportFile": "TESTS-results-sonar.xml" + } +} diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..7595ca8 --- /dev/null +++ b/pom.xml @@ -0,0 +1,1174 @@ + + + 4.0.0 + + org.datasurvey + data-survey + 0.0.1-SNAPSHOT + jar + Data Survey + + + + + + + + + + + + + + 3.3.9 + 11 + v14.17.1 + 7.18.1 + + UTF-8 + UTF-8 + yyyyMMddHHmmss + ${java.version} + ${java.version} + org.datasurvey.DataSurveyApp + -Djava.security.egd=file:/dev/./urandom -Xmx256m + jdt_apt + false + + + + + + + 7.1.0 + + 2.4.7 + + 5.4.32.Final + + 3.27.0-GA + + 4.3.5 + 4.3.5 + 2.0.1.Final + 2.3.3 + 0.19.0 + 1.4.2.Final + + 3.1.0 + 3.9.1 + 3.8.1 + 3.3.0 + 2.10 + 3.0.0-M3 + 3.0.0-M5 + 2.2.1 + 3.2.0 + 3.0.0-M5 + 3.3.1 + 3.1.2 + 8.43 + 0.0.8 + 1.12.0 + 1.10 + 3.0.0 + 4.0.5 + 0.8.7 + 3.1.1 + 1.0.0 + 1.0.0 + 3.9.0.2155 + + + + + + + tech.jhipster + jhipster-dependencies + ${jhipster-dependencies.version} + pom + import + + + + + + + + tech.jhipster + jhipster-framework + + + javax.annotation + javax.annotation-api + + + org.springframework.boot + spring-boot-starter-cache + + + com.fasterxml.jackson.module + jackson-module-jaxb-annotations + + + com.fasterxml.jackson.datatype + jackson-datatype-hibernate5 + + + com.fasterxml.jackson.datatype + jackson-datatype-hppc + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + + + com.h2database + h2 + test + + + io.springfox + springfox-oas + + + io.springfox + springfox-swagger2 + + + io.springfox + springfox-bean-validators + + + com.zaxxer + HikariCP + + + org.apache.commons + commons-lang3 + + + org.testcontainers + mysql + test + + + javax.cache + cache-api + + + mysql + mysql-connector-java + + + org.ehcache + ehcache + + + org.hibernate + hibernate-jcache + + + org.hibernate + hibernate-jpamodelgen + provided + + + org.hibernate + hibernate-core + + + org.hibernate.validator + hibernate-validator + + + org.liquibase + liquibase-core + + ${liquibase.version} + + + org.mapstruct + mapstruct + ${mapstruct.version} + + + org.mapstruct + mapstruct-processor + ${mapstruct.version} + provided + + + org.springframework.boot + spring-boot-configuration-processor + provided + + + org.springframework.boot + spring-boot-loader-tools + + + org.springframework.boot + spring-boot-starter-actuator + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-logging + + + org.springframework.boot + spring-boot-starter-mail + + + org.springframework.boot + spring-boot-starter-security + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-test + test + + + org.junit.vintage + junit-vintage-engine + + + + + org.springframework.boot + spring-boot-test + test + + + org.springframework.security + spring-security-test + test + + + com.tngtech.archunit + archunit-junit5-api + ${archunit-junit5.version} + test + + + + + com.tngtech.archunit + archunit-junit5-engine + ${archunit-junit5.version} + test + + + org.zalando + problem-spring-web + + + org.springframework.boot + spring-boot-starter-websocket + + + io.jsonwebtoken + jjwt-api + + + io.jsonwebtoken + jjwt-impl + runtime + + + io.jsonwebtoken + jjwt-jackson + runtime + + + + + org.springframework.security + spring-security-data + + + io.micrometer + micrometer-registry-prometheus + + + io.dropwizard.metrics + metrics-core + + + org.springframework.security + spring-security-messaging + + + + + + spring-boot:run + + + org.apache.maven.plugins + maven-compiler-plugin + + + org.apache.maven.plugins + maven-checkstyle-plugin + + + org.apache.maven.plugins + maven-javadoc-plugin + + + org.apache.maven.plugins + maven-eclipse-plugin + + + org.apache.maven.plugins + maven-enforcer-plugin + + + org.apache.maven.plugins + maven-failsafe-plugin + + + org.apache.maven.plugins + maven-idea-plugin + + + org.apache.maven.plugins + maven-resources-plugin + + + org.apache.maven.plugins + maven-surefire-plugin + + + org.jacoco + jacoco-maven-plugin + + + org.sonarsource.scanner.maven + sonar-maven-plugin + + + org.liquibase + liquibase-maven-plugin + + + org.springframework.boot + spring-boot-maven-plugin + + + com.google.cloud.tools + jib-maven-plugin + + + org.codehaus.mojo + properties-maven-plugin + + + + + + + org.apache.maven.plugins + maven-checkstyle-plugin + ${maven-checkstyle-plugin.version} + + + com.puppycrawl.tools + checkstyle + ${checkstyle.version} + + + io.spring.nohttp + nohttp-checkstyle + ${nohttp-checkstyle.version} + + + + checkstyle.xml + pom.xml,README.md + .git/**/*,target/**/*,node_modules/**/*,node/**/* + ./ + + + + + check + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${java.version} + ${java.version} + + + org.springframework.boot + spring-boot-configuration-processor + ${spring-boot.version} + + + org.mapstruct + mapstruct-processor + ${mapstruct.version} + + + + org.hibernate + hibernate-jpamodelgen + ${hibernate.version} + + + org.glassfish.jaxb + jaxb-runtime + ${jaxb-runtime.version} + + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + ${maven-javadoc-plugin.version} + + ${maven.compiler.source} + + + + org.apache.maven.plugins + maven-war-plugin + ${maven-war-plugin.version} + + + default-war + + war + + package + + + + WEB-INF/**,META-INF/** + false + target/classes/static/ + + + src/main/webapp + + WEB-INF/** + + + + + + + com.github.eirslett + frontend-maven-plugin + ${frontend-maven-plugin.version} + + target + + + + org.codehaus.mojo + properties-maven-plugin + ${properties-maven-plugin.version} + + + initialize + + read-project-properties + + + + sonar-project.properties + + + + + + + + pl.project13.maven + git-commit-id-plugin + ${git-commit-id-plugin.version} + + + + revision + + + + + false + false + true + + ^git.commit.id.abbrev$ + ^git.commit.id.describe$ + ^git.branch$ + + + + + org.jacoco + jacoco-maven-plugin + ${jacoco-maven-plugin.version} + + + pre-unit-tests + + prepare-agent + + + + + post-unit-test + test + + report + + + + pre-integration-tests + + prepare-agent-integration + + + + + post-integration-tests + post-integration-test + + report-integration + + + + + + com.google.cloud.tools + jib-maven-plugin + ${jib-maven-plugin.version} + + + adoptopenjdk:11-jre-hotspot + + + datasurvey:latest + + + + bash + + /entrypoint.sh + + + 8080 + + + ALWAYS + 0 + + USE_CURRENT_TIMESTAMP + 1000 + + + src/main/docker/jib + + + /entrypoint.sh + 755 + + + + + + + org.liquibase + liquibase-maven-plugin + ${liquibase.version} + + ${project.basedir}/src/main/resources/config/liquibase/master.xml + ${project.basedir}/src/main/resources/config/liquibase/changelog/${maven.build.timestamp}_changelog.xml + com.mysql.cj.jdbc.Driver + jdbc:mysql://localhost:3306/DataSurvey + DataSurvey + root + + hibernate:spring:org.datasurvey.domain?dialect=org.hibernate.dialect.MySQL8Dialect&hibernate.physical_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy&hibernate.implicit_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy + true + debug + !test + + + + org.liquibase + liquibase-core + ${liquibase.version} + + + org.liquibase.ext + liquibase-hibernate5 + ${liquibase-hibernate5.version} + + + org.springframework.boot + spring-boot-starter-data-jpa + ${spring-boot.version} + + + javax.validation + validation-api + ${validation-api.version} + + + org.javassist + javassist + ${javassist.version} + + + + + maven-clean-plugin + ${maven-clean-plugin.version} + + + maven-site-plugin + ${maven-site-plugin.version} + + + org.apache.maven.plugins + maven-eclipse-plugin + ${maven-eclipse-plugin.version} + + true + true + + + + org.apache.maven.plugins + maven-enforcer-plugin + ${maven-enforcer-plugin.version} + + + enforce-versions + + enforce + + + + enforce-dependencyConvergence + + + + + false + + + enforce + + + + + + + You are running an older version of Maven. JHipster requires at least Maven ${maven.version} + [${maven.version},) + + + You are running an incompatible version of Java. JHipster supports JDK 8 to 16. + [1.8,17) + + + + + + org.apache.maven.plugins + maven-idea-plugin + ${maven-idea-plugin.version} + + node_modules + + + + org.apache.maven.plugins + maven-resources-plugin + ${maven-resources-plugin.version} + + + default-resources + validate + + copy-resources + + + ${project.build.directory}/classes + false + + # + + + + src/main/resources/ + true + + config/*.yml + + + + src/main/resources/ + false + + config/*.yml + + + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + + alphabetical + + **/*IT* + **/*IntTest* + + + + + org.apache.maven.plugins + maven-failsafe-plugin + ${maven-failsafe-plugin.version} + + + ${project.build.outputDirectory} + + alphabetical + + **/*IT* + **/*IntTest* + + + + + integration-test + + integration-test + + + + verify + + verify + + + + + + org.sonarsource.scanner.maven + sonar-maven-plugin + ${sonar-maven-plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + + repackage + + + + + ${start-class} + true + + + + + + + + + + + no-liquibase + + ,no-liquibase + + + + api-docs + + ,api-docs + + + + tls + + ,tls + + + + webapp + + true + + + + + + + net.nicoulaj.maven.plugins + checksum-maven-plugin + ${checksum-maven-plugin.version} + + + + files + + generate-resources + + + + + + ${project.basedir} + + src/main/webapp/**/*.* + package.json + webpack/*.* + + + **/app/**/service-worker.js + **/app/**/vendor.css + + + + false + false + false + + SHA-1 + + true + true + + + + org.apache.maven.plugins + maven-antrun-plugin + ${maven-antrun-plugin.version} + + + eval-frontend-checksum + generate-resources + + run + + + + + + + + + + + + + true + + + + + + com.github.eirslett + frontend-maven-plugin + + + install-node-and-npm + + install-node-and-npm + + + ${node.version} + ${npm.version} + + + + npm install + + npm + + + + webapp build dev + + npm + + generate-resources + + run webapp:build + + ${project.version} + + false + + + + + + + + + dev${profile.no-liquibase} + + + + dev + + true + + + + org.springframework.boot + spring-boot-starter-undertow + + + org.springframework.boot + spring-boot-devtools + true + + + + + dev${profile.tls}${profile.no-liquibase} + + + + prod + + + org.springframework.boot + spring-boot-starter-undertow + + + + + + maven-clean-plugin + + + + target/classes/static/ + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + build-info + + + + + + com.github.eirslett + frontend-maven-plugin + + + install-node-and-npm + + install-node-and-npm + + + ${node.version} + ${npm.version} + + + + npm install + + npm + + + + webapp build test + + npm + + test + + run webapp:test + false + + + + webapp build prod + + npm + + generate-resources + + run webapp:prod + + ${project.version} + + false + + + + + + pl.project13.maven + git-commit-id-plugin + + + + + + prod${profile.api-docs}${profile.tls}${profile.no-liquibase} + + + + war + + + + org.apache.maven.plugins + maven-war-plugin + + + + + + + IDE + + + org.mapstruct + mapstruct-processor + ${mapstruct.version} + + + org.hibernate + hibernate-jpamodelgen + + + + + + eclipse + + + m2e.version + + + + + + org.springframework.boot + spring-boot-starter-undertow + + + + + + + + org.eclipse.m2e + lifecycle-mapping + ${lifecycle-mapping.version} + + + + + + org.jacoco + + jacoco-maven-plugin + + + ${jacoco-maven-plugin.version} + + + prepare-agent + + + + + + + + + com.github.eirslett + frontend-maven-plugin + ${frontend-maven-plugin.version} + + install-node-and-npm + npm + + + + + + + + + + + + + + + + + diff --git a/sonar-project.properties b/sonar-project.properties new file mode 100644 index 0000000..e898668 --- /dev/null +++ b/sonar-project.properties @@ -0,0 +1,30 @@ +sonar.projectKey=DataSurvey +sonar.projectName=DataSurvey generated by jhipster +sonar.projectVersion=1.0 + +sonar.sources=src/main/ +sonar.host.url=http://localhost:9001 + +sonar.test.inclusions=src/test/**/*.*, src/main/webapp/app/**/*.spec.ts +sonar.coverage.jacoco.xmlReportPaths=target/site/**/jacoco*.xml +sonar.java.codeCoveragePlugin=jacoco +sonar.junit.reportPaths=target/surefire-reports,target/failsafe-reports +sonar.testExecutionReportPaths=target/test-results/jest/TESTS-results-sonar.xml +sonar.javascript.lcov.reportPaths=target/test-results/lcov.info + +sonar.sourceEncoding=UTF-8 +sonar.exclusions=src/main/webapp/content/**/*.*, src/main/webapp/i18n/*.js, target/classes/static/**/*.* + +sonar.issue.ignore.multicriteria=S3437,S4502,S4684,UndocumentedApi +# Rule https://rules.sonarsource.com/java/RSPEC-3437 is ignored, as a JPA-managed field cannot be transient +sonar.issue.ignore.multicriteria.S3437.resourceKey=src/main/java/**/* +sonar.issue.ignore.multicriteria.S3437.ruleKey=squid:S3437 +# Rule https://rules.sonarsource.com/java/RSPEC-1176 is ignored, as we want to follow "clean code" guidelines and classes, methods and arguments names should be self-explanatory +sonar.issue.ignore.multicriteria.UndocumentedApi.resourceKey=src/main/java/**/* +sonar.issue.ignore.multicriteria.UndocumentedApi.ruleKey=squid:UndocumentedApi +# Rule https://rules.sonarsource.com/java/RSPEC-4502 is ignored, as for JWT tokens we are not subject to CSRF attack +sonar.issue.ignore.multicriteria.S4502.resourceKey=src/main/java/**/* +sonar.issue.ignore.multicriteria.S4502.ruleKey=squid:S4502 +# Rule https://rules.sonarsource.com/java/RSPEC-4684 +sonar.issue.ignore.multicriteria.S4684.resourceKey=src/main/java/**/* +sonar.issue.ignore.multicriteria.S4684.ruleKey=java:S4684 diff --git a/src/main/docker/app.yml b/src/main/docker/app.yml new file mode 100644 index 0000000..8d89591 --- /dev/null +++ b/src/main/docker/app.yml @@ -0,0 +1,28 @@ +# This configuration is intended for development purpose, it's **your** responsibility to harden it for production +version: '3.8' +services: + datasurvey-app: + image: datasurvey + environment: + - _JAVA_OPTIONS=-Xmx512m -Xms256m + - SPRING_PROFILES_ACTIVE=prod,api-docs + - MANAGEMENT_METRICS_EXPORT_PROMETHEUS_ENABLED=true + - SPRING_DATASOURCE_URL=jdbc:mysql://datasurvey-mysql:3306/datasurvey?useUnicode=true&characterEncoding=utf8&useSSL=false&useLegacyDatetimeCode=false&serverTimezone=UTC&createDatabaseIfNotExist=true + - SPRING_LIQUIBASE_URL=jdbc:mysql://datasurvey-mysql:3306/datasurvey?useUnicode=true&characterEncoding=utf8&useSSL=false&useLegacyDatetimeCode=false&serverTimezone=UTC&createDatabaseIfNotExist=true + - JHIPSTER_SLEEP=30 # gives time for other services to boot before the application + # If you want to expose these ports outside your dev PC, + # remove the "127.0.0.1:" prefix + ports: + - 127.0.0.1:8080:8080 + datasurvey-mysql: + image: mysql:8.0.25 + # volumes: + # - ~/volumes/jhipster/DataSurvey/mysql/:/var/lib/mysql/ + environment: + - MYSQL_ALLOW_EMPTY_PASSWORD=yes + - MYSQL_DATABASE=datasurvey + # If you want to expose these ports outside your dev PC, + # remove the "127.0.0.1:" prefix + ports: + - 127.0.0.1:3306:3306 + command: mysqld --lower_case_table_names=1 --skip-ssl --character_set_server=utf8mb4 --explicit_defaults_for_timestamp diff --git a/src/main/docker/grafana/provisioning/dashboards/JVM.json b/src/main/docker/grafana/provisioning/dashboards/JVM.json new file mode 100644 index 0000000..5104abc --- /dev/null +++ b/src/main/docker/grafana/provisioning/dashboards/JVM.json @@ -0,0 +1,3778 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "limit": 100, + "name": "Annotations & Alerts", + "showIn": 0, + "type": "dashboard" + }, + { + "datasource": "Prometheus", + "enable": true, + "expr": "resets(process_uptime_seconds{application=\"$application\", instance=\"$instance\"}[1m]) > 0", + "iconColor": "rgba(255, 96, 96, 1)", + "name": "Restart Detection", + "showIn": 0, + "step": "1m", + "tagKeys": "restart-tag", + "textFormat": "uptime reset", + "titleFormat": "Restart" + } + ] + }, + "description": "Dashboard for Micrometer instrumented applications (Java, Spring Boot, Micronaut)", + "editable": true, + "gnetId": 4701, + "graphTooltip": 1, + "iteration": 1553765841423, + "links": [], + "panels": [ + { + "content": "\n# Acknowledgments\n\nThank you to [Michael Weirauch](https://twitter.com/emwexx) for creating this dashboard: see original JVM (Micrometer) dashboard at [https://grafana.com/dashboards/4701](https://grafana.com/dashboards/4701)\n\n\n\n", + "gridPos": { + "h": 3, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 141, + "links": [], + "mode": "markdown", + "timeFrom": null, + "timeShift": null, + "title": "Acknowledgments", + "type": "text" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 3 + }, + "id": 125, + "panels": [], + "repeat": null, + "title": "Quick Facts", + "type": "row" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": true, + "colors": ["rgba(245, 54, 54, 0.9)", "rgba(237, 129, 40, 0.89)", "rgba(50, 172, 45, 0.97)"], + "datasource": "Prometheus", + "decimals": 1, + "editable": true, + "error": false, + "format": "s", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 0, + "y": 4 + }, + "height": "", + "id": 63, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "70%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "process_uptime_seconds{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "", + "metric": "", + "refId": "A", + "step": 14400 + } + ], + "thresholds": "", + "title": "Uptime", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": true, + "colors": ["rgba(245, 54, 54, 0.9)", "rgba(237, 129, 40, 0.89)", "rgba(50, 172, 45, 0.97)"], + "datasource": "Prometheus", + "decimals": null, + "editable": true, + "error": false, + "format": "dateTimeAsIso", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 6, + "y": 4 + }, + "height": "", + "id": 92, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "70%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "process_start_time_seconds{application=\"$application\", instance=\"$instance\"}*1000", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "", + "metric": "", + "refId": "A", + "step": 14400 + } + ], + "thresholds": "", + "title": "Start time", + "type": "singlestat", + "valueFontSize": "70%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": true, + "colors": ["rgba(50, 172, 45, 0.97)", "rgba(237, 129, 40, 0.89)", "rgba(245, 54, 54, 0.9)"], + "datasource": "Prometheus", + "decimals": 2, + "editable": true, + "error": false, + "format": "percent", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 12, + "y": 4 + }, + "id": 65, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "70%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "sum(jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", area=\"heap\"})*100/sum(jvm_memory_max_bytes{application=\"$application\",instance=\"$instance\", area=\"heap\"})", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "", + "refId": "A", + "step": 14400 + } + ], + "thresholds": "70,90", + "title": "Heap used", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": true, + "colors": ["rgba(50, 172, 45, 0.97)", "rgba(237, 129, 40, 0.89)", "rgba(245, 54, 54, 0.9)"], + "datasource": "Prometheus", + "decimals": 2, + "editable": true, + "error": false, + "format": "percent", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 18, + "y": 4 + }, + "id": 75, + "interval": null, + "links": [], + "mappingType": 2, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "70%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + }, + { + "from": "-99999999999999999999999999999999", + "text": "N/A", + "to": "0" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "sum(jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", area=\"nonheap\"})*100/sum(jvm_memory_max_bytes{application=\"$application\",instance=\"$instance\", area=\"nonheap\"})", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "", + "refId": "A", + "step": 14400 + } + ], + "thresholds": "70,90", + "title": "Non-Heap used", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + }, + { + "op": "=", + "text": "x", + "value": "" + } + ], + "valueName": "current" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 7 + }, + "id": 126, + "panels": [], + "repeat": null, + "title": "I/O Overview", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 8 + }, + "id": 111, + "legend": { + "avg": false, + "current": true, + "max": false, + "min": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(rate(http_server_requests_seconds_count{application=\"$application\", instance=\"$instance\"}[1m]))", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "HTTP", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Rate", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": null, + "format": "ops", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "HTTP": "#890f02", + "HTTP - 5xx": "#bf1b00" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 8 + }, + "id": 112, + "legend": { + "avg": false, + "current": true, + "max": false, + "min": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(rate(http_server_requests_seconds_count{application=\"$application\", instance=\"$instance\", status=~\"5..\"}[1m]))", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "HTTP - 5xx", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Errors", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": null, + "format": "ops", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 8 + }, + "id": 113, + "legend": { + "avg": false, + "current": true, + "max": false, + "min": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(rate(http_server_requests_seconds_sum{application=\"$application\", instance=\"$instance\", status!~\"5..\"}[1m]))/sum(rate(http_server_requests_seconds_count{application=\"$application\", instance=\"$instance\", status!~\"5..\"}[1m]))", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "HTTP - AVG", + "refId": "A" + }, + { + "expr": "max(http_server_requests_seconds_max{application=\"$application\", instance=\"$instance\", status!~\"5..\"})", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "HTTP - MAX", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Duration", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "s", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 15 + }, + "id": 127, + "panels": [], + "repeat": null, + "title": "JVM Memory", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 16 + }, + "id": 24, + "legend": { + "avg": false, + "current": true, + "max": true, + "min": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", area=\"heap\"})", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 2400 + }, + { + "expr": "sum(jvm_memory_committed_bytes{application=\"$application\", instance=\"$instance\", area=\"heap\"})", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "committed", + "refId": "B", + "step": 2400 + }, + { + "expr": "sum(jvm_memory_max_bytes{application=\"$application\", instance=\"$instance\", area=\"heap\"})", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "max", + "refId": "C", + "step": 2400 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "JVM Heap", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["mbytes", "short"], + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 16 + }, + "id": 25, + "legend": { + "avg": false, + "current": true, + "max": true, + "min": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", area=\"nonheap\"})", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 2400 + }, + { + "expr": "sum(jvm_memory_committed_bytes{application=\"$application\", instance=\"$instance\", area=\"nonheap\"})", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "committed", + "refId": "B", + "step": 2400 + }, + { + "expr": "sum(jvm_memory_max_bytes{application=\"$application\", instance=\"$instance\", area=\"nonheap\"})", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "max", + "refId": "C", + "step": 2400 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "JVM Non-Heap", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["mbytes", "short"], + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 16 + }, + "id": 26, + "legend": { + "alignAsTable": false, + "avg": false, + "current": true, + "max": true, + "min": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\"})", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 2400 + }, + { + "expr": "sum(jvm_memory_committed_bytes{application=\"$application\", instance=\"$instance\"})", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "committed", + "refId": "B", + "step": 2400 + }, + { + "expr": "sum(jvm_memory_max_bytes{application=\"$application\", instance=\"$instance\"})", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "max", + "refId": "C", + "step": 2400 + }, + { + "expr": "process_memory_vss_bytes{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "hide": true, + "intervalFactor": 2, + "legendFormat": "vss", + "metric": "", + "refId": "D", + "step": 2400 + }, + { + "expr": "process_memory_rss_bytes{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "rss", + "refId": "E", + "step": 2400 + }, + { + "expr": "process_memory_pss_bytes{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "pss", + "refId": "F", + "step": 2400 + }, + { + "expr": "process_memory_swap_bytes{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "swap", + "refId": "G", + "step": 2400 + }, + { + "expr": "process_memory_swappss_bytes{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "swappss", + "refId": "H", + "step": 2400 + }, + { + "expr": "process_memory_pss_bytes{application=\"$application\", instance=\"$instance\"} + process_memory_swap_bytes{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "phys (pss+swap)", + "refId": "I", + "step": 2400 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "JVM Total", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["mbytes", "short"], + "yaxes": [ + { + "format": "bytes", + "label": "", + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 23 + }, + "id": 128, + "panels": [], + "repeat": null, + "title": "JVM Misc", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 0, + "y": 24 + }, + "id": 106, + "legend": { + "avg": false, + "current": true, + "max": true, + "min": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "system_cpu_usage{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "system", + "metric": "", + "refId": "A", + "step": 2400 + }, + { + "expr": "process_cpu_usage{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "process", + "refId": "B" + }, + { + "expr": "avg_over_time(process_cpu_usage{application=\"$application\", instance=\"$instance\"}[1h])", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "process-1h", + "refId": "C" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "CPU", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["short", "short"], + "yaxes": [ + { + "decimals": 1, + "format": "percentunit", + "label": "", + "logBase": 1, + "max": "1", + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 6, + "y": 24 + }, + "id": 93, + "legend": { + "avg": false, + "current": true, + "max": true, + "min": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "system_load_average_1m{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "system-1m", + "metric": "", + "refId": "A", + "step": 2400 + }, + { + "expr": "", + "format": "time_series", + "intervalFactor": 2, + "refId": "B" + }, + { + "expr": "system_cpu_count{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "cpu", + "refId": "C" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Load", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["short", "short"], + "yaxes": [ + { + "decimals": 1, + "format": "short", + "label": "", + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 12, + "y": 24 + }, + "id": 32, + "legend": { + "avg": false, + "current": true, + "max": true, + "min": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_threads_live{application=\"$application\", instance=\"$instance\"} or jvm_threads_live_threads{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "live", + "metric": "", + "refId": "A", + "step": 2400 + }, + { + "expr": "jvm_threads_daemon{application=\"$application\", instance=\"$instance\"} or jvm_threads_daemon_threads{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "daemon", + "metric": "", + "refId": "B", + "step": 2400 + }, + { + "expr": "jvm_threads_peak{application=\"$application\", instance=\"$instance\"} or jvm_threads_peak_threads{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "peak", + "refId": "C", + "step": 2400 + }, + { + "expr": "process_threads{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "process", + "refId": "D", + "step": 2400 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Threads", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["short", "short"], + "yaxes": [ + { + "decimals": 0, + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "blocked": "#bf1b00", + "new": "#fce2de", + "runnable": "#7eb26d", + "terminated": "#511749", + "timed-waiting": "#c15c17", + "waiting": "#eab839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 1, + "gridPos": { + "h": 7, + "w": 6, + "x": 18, + "y": 24 + }, + "id": 124, + "legend": { + "alignAsTable": false, + "avg": false, + "current": true, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_threads_states_threads{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{state}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Thread States", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "debug": "#1F78C1", + "error": "#BF1B00", + "info": "#508642", + "trace": "#6ED0E0", + "warn": "#EAB839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 18, + "x": 0, + "y": 31 + }, + "height": "", + "id": 91, + "legend": { + "alignAsTable": false, + "avg": false, + "current": true, + "hideEmpty": false, + "hideZero": false, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": true, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "error", + "yaxis": 1 + }, + { + "alias": "warn", + "yaxis": 1 + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "increase(logback_events_total{application=\"$application\", instance=\"$instance\"}[1m])", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{level}}", + "metric": "", + "refId": "A", + "step": 1200 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Log Events (1m)", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["short", "short"], + "yaxes": [ + { + "decimals": 0, + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 18, + "y": 31 + }, + "id": 61, + "legend": { + "avg": false, + "current": true, + "max": true, + "min": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "process_open_fds{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "open", + "metric": "", + "refId": "A", + "step": 2400 + }, + { + "expr": "process_max_fds{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "max", + "metric": "", + "refId": "B", + "step": 2400 + }, + { + "expr": "process_files_open{application=\"$application\", instance=\"$instance\"} or process_files_open_files{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "open", + "refId": "C" + }, + { + "expr": "process_files_max{application=\"$application\", instance=\"$instance\"} or process_files_max_files{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "max", + "refId": "D" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "File Descriptors", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["short", "short"], + "yaxes": [ + { + "decimals": 0, + "format": "short", + "label": null, + "logBase": 10, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 38 + }, + "id": 129, + "panels": [], + "repeat": "persistence_counts", + "title": "JVM Memory Pools (Heap)", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 39 + }, + "id": 3, + "legend": { + "alignAsTable": false, + "avg": false, + "current": true, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "maxPerRow": 3, + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": "jvm_memory_pool_heap", + "scopedVars": { + "jvm_memory_pool_heap": { + "selected": false, + "text": "PS Eden Space", + "value": "PS Eden Space" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_heap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 1800 + }, + { + "expr": "jvm_memory_committed_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_heap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "commited", + "metric": "", + "refId": "B", + "step": 1800 + }, + { + "expr": "jvm_memory_max_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_heap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "max", + "metric": "", + "refId": "C", + "step": 1800 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "$jvm_memory_pool_heap", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["mbytes", "short"], + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 39 + }, + "id": 134, + "legend": { + "alignAsTable": false, + "avg": false, + "current": true, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "maxPerRow": 3, + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatIteration": 1553765841423, + "repeatPanelId": 3, + "scopedVars": { + "jvm_memory_pool_heap": { + "selected": false, + "text": "PS Old Gen", + "value": "PS Old Gen" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_heap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 1800 + }, + { + "expr": "jvm_memory_committed_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_heap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "commited", + "metric": "", + "refId": "B", + "step": 1800 + }, + { + "expr": "jvm_memory_max_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_heap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "max", + "metric": "", + "refId": "C", + "step": 1800 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "$jvm_memory_pool_heap", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["mbytes", "short"], + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 39 + }, + "id": 135, + "legend": { + "alignAsTable": false, + "avg": false, + "current": true, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "maxPerRow": 3, + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatIteration": 1553765841423, + "repeatPanelId": 3, + "scopedVars": { + "jvm_memory_pool_heap": { + "selected": false, + "text": "PS Survivor Space", + "value": "PS Survivor Space" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_heap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 1800 + }, + { + "expr": "jvm_memory_committed_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_heap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "commited", + "metric": "", + "refId": "B", + "step": 1800 + }, + { + "expr": "jvm_memory_max_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_heap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "max", + "metric": "", + "refId": "C", + "step": 1800 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "$jvm_memory_pool_heap", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["mbytes", "short"], + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 46 + }, + "id": 130, + "panels": [], + "repeat": null, + "title": "JVM Memory Pools (Non-Heap)", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 47 + }, + "id": 78, + "legend": { + "alignAsTable": false, + "avg": false, + "current": true, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "maxPerRow": 3, + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": "jvm_memory_pool_nonheap", + "scopedVars": { + "jvm_memory_pool_nonheap": { + "selected": false, + "text": "Metaspace", + "value": "Metaspace" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_nonheap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 1800 + }, + { + "expr": "jvm_memory_committed_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_nonheap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "commited", + "metric": "", + "refId": "B", + "step": 1800 + }, + { + "expr": "jvm_memory_max_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_nonheap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "max", + "metric": "", + "refId": "C", + "step": 1800 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "$jvm_memory_pool_nonheap", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["mbytes", "short"], + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 47 + }, + "id": 136, + "legend": { + "alignAsTable": false, + "avg": false, + "current": true, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "maxPerRow": 3, + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatIteration": 1553765841423, + "repeatPanelId": 78, + "scopedVars": { + "jvm_memory_pool_nonheap": { + "selected": false, + "text": "Compressed Class Space", + "value": "Compressed Class Space" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_nonheap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 1800 + }, + { + "expr": "jvm_memory_committed_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_nonheap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "commited", + "metric": "", + "refId": "B", + "step": 1800 + }, + { + "expr": "jvm_memory_max_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_nonheap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "max", + "metric": "", + "refId": "C", + "step": 1800 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "$jvm_memory_pool_nonheap", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["mbytes", "short"], + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 47 + }, + "id": 137, + "legend": { + "alignAsTable": false, + "avg": false, + "current": true, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "maxPerRow": 3, + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatIteration": 1553765841423, + "repeatPanelId": 78, + "scopedVars": { + "jvm_memory_pool_nonheap": { + "selected": false, + "text": "Code Cache", + "value": "Code Cache" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_nonheap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 1800 + }, + { + "expr": "jvm_memory_committed_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_nonheap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "commited", + "metric": "", + "refId": "B", + "step": 1800 + }, + { + "expr": "jvm_memory_max_bytes{application=\"$application\", instance=\"$instance\", id=\"$jvm_memory_pool_nonheap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "max", + "metric": "", + "refId": "C", + "step": 1800 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "$jvm_memory_pool_nonheap", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["mbytes", "short"], + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 54 + }, + "id": 131, + "panels": [], + "repeat": null, + "title": "Garbage Collection", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 55 + }, + "id": 98, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(jvm_gc_pause_seconds_count{application=\"$application\", instance=\"$instance\"}[1m])", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "{{action}} ({{cause}})", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Collections", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "ops", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": "", + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 55 + }, + "id": 101, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(jvm_gc_pause_seconds_sum{application=\"$application\", instance=\"$instance\"}[1m])/rate(jvm_gc_pause_seconds_count{application=\"$application\", instance=\"$instance\"}[1m])", + "format": "time_series", + "hide": false, + "instant": false, + "intervalFactor": 1, + "legendFormat": "avg {{action}} ({{cause}})", + "refId": "A" + }, + { + "expr": "jvm_gc_pause_seconds_max{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "hide": false, + "instant": false, + "intervalFactor": 1, + "legendFormat": "max {{action}} ({{cause}})", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Pause Durations", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "s", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": "", + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 1, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 55 + }, + "id": 99, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(jvm_gc_memory_allocated_bytes_total{application=\"$application\", instance=\"$instance\"}[1m])", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "allocated", + "refId": "A" + }, + { + "expr": "rate(jvm_gc_memory_promoted_bytes_total{application=\"$application\", instance=\"$instance\"}[1m])", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "promoted", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Allocated/Promoted", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 62 + }, + "id": 132, + "panels": [], + "repeat": null, + "title": "Classloading", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 63 + }, + "id": 37, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_classes_loaded{application=\"$application\", instance=\"$instance\"} or jvm_classes_loaded_classes{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "loaded", + "metric": "", + "refId": "A", + "step": 1200 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Classes loaded", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["short", "short"], + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 63 + }, + "id": 38, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "delta(jvm_classes_loaded{application=\"$application\",instance=\"$instance\"}[5m]) or delta(jvm_classes_loaded_classes{application=\"$application\",instance=\"$instance\"}[5m])", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "delta", + "metric": "", + "refId": "A", + "step": 1200 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Class delta (5m)", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["ops", "short"], + "yaxes": [ + { + "decimals": null, + "format": "short", + "label": "", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 70 + }, + "id": 133, + "panels": [], + "repeat": null, + "title": "Buffer Pools", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 0, + "y": 71 + }, + "id": 33, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_buffer_memory_used_bytes{application=\"$application\", instance=\"$instance\", id=\"direct\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 2400 + }, + { + "expr": "jvm_buffer_total_capacity_bytes{application=\"$application\", instance=\"$instance\", id=\"direct\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "capacity", + "metric": "", + "refId": "B", + "step": 2400 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Direct Buffers", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["short", "short"], + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 6, + "y": 71 + }, + "id": 83, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_buffer_count{application=\"$application\", instance=\"$instance\", id=\"direct\"} or jvm_buffer_count_buffers{application=\"$application\", instance=\"$instance\", id=\"direct\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "count", + "metric": "", + "refId": "A", + "step": 2400 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Direct Buffers", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["short", "short"], + "yaxes": [ + { + "decimals": 0, + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 12, + "y": 71 + }, + "id": 85, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_buffer_memory_used_bytes{application=\"$application\", instance=\"$instance\", id=\"mapped\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 2400 + }, + { + "expr": "jvm_buffer_total_capacity_bytes{application=\"$application\", instance=\"$instance\", id=\"mapped\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "capacity", + "metric": "", + "refId": "B", + "step": 2400 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Mapped Buffers", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["short", "short"], + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 18, + "y": 71 + }, + "id": 84, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_buffer_count{application=\"$application\", instance=\"$instance\", id=\"mapped\"} or jvm_buffer_count_buffers{application=\"$application\", instance=\"$instance\", id=\"mapped\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "count", + "metric": "", + "refId": "A", + "step": 2400 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Mapped Buffers", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": ["short", "short"], + "yaxes": [ + { + "decimals": 0, + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + } + ], + "refresh": "10s", + "schemaVersion": 18, + "style": "dark", + "tags": [], + "templating": { + "list": [ + { + "allValue": null, + "current": { + "text": "test", + "value": "test" + }, + "datasource": "Prometheus", + "definition": "", + "hide": 0, + "includeAll": false, + "label": "Application", + "multi": false, + "name": "application", + "options": [], + "query": "label_values(application)", + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "allFormat": "glob", + "allValue": null, + "current": { + "text": "localhost:8080", + "value": "localhost:8080" + }, + "datasource": "Prometheus", + "definition": "", + "hide": 0, + "includeAll": false, + "label": "Instance", + "multi": false, + "multiFormat": "glob", + "name": "instance", + "options": [], + "query": "label_values(jvm_memory_used_bytes{application=\"$application\"}, instance)", + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "allFormat": "glob", + "allValue": null, + "current": { + "text": "All", + "value": "$__all" + }, + "datasource": "Prometheus", + "definition": "", + "hide": 0, + "includeAll": true, + "label": "JVM Memory Pools Heap", + "multi": false, + "multiFormat": "glob", + "name": "jvm_memory_pool_heap", + "options": [], + "query": "label_values(jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", area=\"heap\"},id)", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 1, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "allFormat": "glob", + "allValue": null, + "current": { + "text": "All", + "value": "$__all" + }, + "datasource": "Prometheus", + "definition": "", + "hide": 0, + "includeAll": true, + "label": "JVM Memory Pools Non-Heap", + "multi": false, + "multiFormat": "glob", + "name": "jvm_memory_pool_nonheap", + "options": [], + "query": "label_values(jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", area=\"nonheap\"},id)", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 2, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + } + ] + }, + "time": { + "from": "now-30m", + "to": "now" + }, + "timepicker": { + "now": true, + "refresh_intervals": ["5s", "10s", "30s", "1m", "5m", "15m", "30m", "1h", "2h", "1d"], + "time_options": ["5m", "15m", "1h", "6h", "12h", "24h", "2d", "7d", "30d"] + }, + "timezone": "browser", + "title": "JVM (Micrometer)", + "uid": "Ud1CFe3iz", + "version": 1 +} diff --git a/src/main/docker/grafana/provisioning/dashboards/dashboard.yml b/src/main/docker/grafana/provisioning/dashboards/dashboard.yml new file mode 100644 index 0000000..4817a83 --- /dev/null +++ b/src/main/docker/grafana/provisioning/dashboards/dashboard.yml @@ -0,0 +1,11 @@ +apiVersion: 1 + +providers: + - name: 'Prometheus' + orgId: 1 + folder: '' + type: file + disableDeletion: false + editable: true + options: + path: /etc/grafana/provisioning/dashboards diff --git a/src/main/docker/grafana/provisioning/datasources/datasource.yml b/src/main/docker/grafana/provisioning/datasources/datasource.yml new file mode 100644 index 0000000..57b2bb3 --- /dev/null +++ b/src/main/docker/grafana/provisioning/datasources/datasource.yml @@ -0,0 +1,50 @@ +apiVersion: 1 + +# list of datasources that should be deleted from the database +deleteDatasources: + - name: Prometheus + orgId: 1 + +# list of datasources to insert/update depending +# whats available in the database +datasources: + # name of the datasource. Required + - name: Prometheus + # datasource type. Required + type: prometheus + # access mode. direct or proxy. Required + access: proxy + # org id. will default to orgId 1 if not specified + orgId: 1 + # url + # On MacOS, replace localhost by host.docker.internal + url: http://localhost:9090 + # database password, if used + password: + # database user, if used + user: + # database name, if used + database: + # enable/disable basic auth + basicAuth: false + # basic auth username + basicAuthUser: admin + # basic auth password + basicAuthPassword: admin + # enable/disable with credentials headers + withCredentials: + # mark as default datasource. Max one per org + isDefault: true + # fields that will be converted to json and stored in json_data + jsonData: + graphiteVersion: '1.1' + tlsAuth: false + tlsAuthWithCACert: false + # json object of data that will be encrypted. + secureJsonData: + tlsCACert: '...' + tlsClientCert: '...' + tlsClientKey: '...' + version: 1 + # allow users to edit datasources from the UI. + editable: true diff --git a/src/main/docker/jhipster-control-center.yml b/src/main/docker/jhipster-control-center.yml new file mode 100644 index 0000000..20c378e --- /dev/null +++ b/src/main/docker/jhipster-control-center.yml @@ -0,0 +1,52 @@ +## How to use JHCC docker compose +# To allow JHCC to reach JHipster application from a docker container note that we set the host as host.docker.internal +# To reach the application from a browser, you need to add '127.0.0.1 host.docker.internal' to your hosts file. +### Discovery mode +# JHCC support 3 kinds of discovery mode: Consul, Eureka and static +# In order to use one, please set SPRING_PROFILES_ACTIVE to one (and only one) of this values: consul,eureka,static +### Discovery properties +# According to the discovery mode choose as Spring profile, you have to set the right properties +# please note that current properties are set to run JHCC with default values, personalize them if needed +# and remove those from other modes. You can only have one mode active. +#### Eureka +# - EUREKA_CLIENT_SERVICE_URL_DEFAULTZONE=http://admin:admin@host.docker.internal:8761/eureka/ +#### Consul +# - SPRING_CLOUD_CONSUL_HOST=host.docker.internal +# - SPRING_CLOUD_CONSUL_PORT=8500 +#### Static +# Add instances to "MyApp" +# - SPRING_CLOUD_DISCOVERY_CLIENT_SIMPLE_INSTANCES_MYAPP_0_URI=http://host.docker.internal:8081 +# - SPRING_CLOUD_DISCOVERY_CLIENT_SIMPLE_INSTANCES_MYAPP_1_URI=http://host.docker.internal:8082 +# Or add a new application named MyNewApp +# - SPRING_CLOUD_DISCOVERY_CLIENT_SIMPLE_INSTANCES_MYNEWAPP_0_URI=http://host.docker.internal:8080 +# This configuration is intended for development purpose, it's **your** responsibility to harden it for production + +#### IMPORTANT +# If you choose Consul or Eureka mode: +# Do not forget to remove the prefix "127.0.0.1" in front of their port in order to expose them. +# This is required because JHCC need to communicate with Consul or Eureka. +# - In Consul mode, the ports are in the consul.yml file. +# - In Eureka mode, the ports are in the jhipster-registry.yml file. + +version: '3.8' +services: + jhipster-control-center: + image: 'jhipster/jhipster-control-center:v0.5.0' + command: + - /bin/sh + - -c + # Patch /etc/hosts to support resolving host.docker.internal to the internal IP address used by the host in all OSes + - echo "`ip route | grep default | cut -d ' ' -f3` host.docker.internal" | tee -a /etc/hosts > /dev/null && java -jar /jhipster-control-center.jar + environment: + - _JAVA_OPTIONS=-Xmx512m -Xms256m + - SPRING_PROFILES_ACTIVE=prod,api-docs,static + - JHIPSTER_SLEEP=30 # gives time for other services to boot before the application + - SPRING_SECURITY_USER_PASSWORD=admin + # The token should have the same value than the one declared in you Spring configuration under the jhipster.security.authentication.jwt.base64-secret configuration's entry + - JHIPSTER_SECURITY_AUTHENTICATION_JWT_BASE64_SECRET=ZjRmZGRhNzFhNDI5OTRmYjkzZmQ0NzI5Yzc3YTYyODBkMjFjZGY1OWMwNzY5YTJkOTA1ZDY3YzE1MWEwMGRkYzg4ZTNlOGUwNTAzMzdiMWVjNDA4NjFiY2JhNTNhYzhkZjQ3N2MyMmY5YzA5ZTFiNzIzMjJjMTg4MmFlNTUyOTY= + - SPRING_CLOUD_DISCOVERY_CLIENT_SIMPLE_INSTANCES_DATASURVEY_0_URI=http://host.docker.internal:8080 + - LOGGING_FILE_NAME=/tmp/jhipster-control-center.log + # If you want to expose these ports outside your dev PC, + # remove the "127.0.0.1:" prefix + ports: + - 127.0.0.1:7419:7419 diff --git a/src/main/docker/jib/entrypoint.sh b/src/main/docker/jib/entrypoint.sh new file mode 100644 index 0000000..3012ebf --- /dev/null +++ b/src/main/docker/jib/entrypoint.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +echo "The application will start in ${JHIPSTER_SLEEP}s..." && sleep ${JHIPSTER_SLEEP} +exec java ${JAVA_OPTS} -noverify -XX:+AlwaysPreTouch -Djava.security.egd=file:/dev/./urandom -cp /app/resources/:/app/classes/:/app/libs/* "org.datasurvey.DataSurveyApp" "$@" diff --git a/src/main/docker/monitoring.yml b/src/main/docker/monitoring.yml new file mode 100644 index 0000000..deafbf1 --- /dev/null +++ b/src/main/docker/monitoring.yml @@ -0,0 +1,31 @@ +# This configuration is intended for development purpose, it's **your** responsibility to harden it for production +version: '3.8' +services: + datasurvey-prometheus: + image: prom/prometheus:v2.27.1 + volumes: + - ./prometheus/:/etc/prometheus/ + command: + - '--config.file=/etc/prometheus/prometheus.yml' + # If you want to expose these ports outside your dev PC, + # remove the "127.0.0.1:" prefix + ports: + - 127.0.0.1:9090:9090 + # On MacOS, remove next line and replace localhost by host.docker.internal in prometheus/prometheus.yml and + # grafana/provisioning/datasources/datasource.yml + network_mode: 'host' # to test locally running service + datasurvey-grafana: + image: grafana/grafana:8.0.1 + volumes: + - ./grafana/provisioning/:/etc/grafana/provisioning/ + environment: + - GF_SECURITY_ADMIN_PASSWORD=admin + - GF_USERS_ALLOW_SIGN_UP=false + - GF_INSTALL_PLUGINS=grafana-piechart-panel + # If you want to expose these ports outside your dev PC, + # remove the "127.0.0.1:" prefix + ports: + - 127.0.0.1:3000:3000 + # On MacOS, remove next line and replace localhost by host.docker.internal in prometheus/prometheus.yml and + # grafana/provisioning/datasources/datasource.yml + network_mode: 'host' # to test locally running service diff --git a/src/main/docker/mysql.yml b/src/main/docker/mysql.yml new file mode 100644 index 0000000..dcb6ebd --- /dev/null +++ b/src/main/docker/mysql.yml @@ -0,0 +1,15 @@ +# This configuration is intended for development purpose, it's **your** responsibility to harden it for production +version: '3.8' +services: + datasurvey-mysql: + image: mysql:8.0.25 + # volumes: + # - ~/volumes/jhipster/DataSurvey/mysql/:/var/lib/mysql/ + environment: + - MYSQL_ALLOW_EMPTY_PASSWORD=yes + - MYSQL_DATABASE=datasurvey + # If you want to expose these ports outside your dev PC, + # remove the "127.0.0.1:" prefix + ports: + - 127.0.0.1:3306:3306 + command: mysqld --lower_case_table_names=1 --skip-ssl --character_set_server=utf8mb4 --explicit_defaults_for_timestamp diff --git a/src/main/docker/prometheus/prometheus.yml b/src/main/docker/prometheus/prometheus.yml new file mode 100644 index 0000000..b370a2f --- /dev/null +++ b/src/main/docker/prometheus/prometheus.yml @@ -0,0 +1,31 @@ +# Sample global config for monitoring JHipster applications +global: + scrape_interval: 15s # By default, scrape targets every 15 seconds. + evaluation_interval: 15s # By default, scrape targets every 15 seconds. + # scrape_timeout is set to the global default (10s). + + # Attach these labels to any time series or alerts when communicating with + # external systems (federation, remote storage, Alertmanager). + external_labels: + monitor: 'jhipster' + +# A scrape configuration containing exactly one endpoint to scrape: +# Here it's Prometheus itself. +scrape_configs: + # The job name is added as a label `job=` to any timeseries scraped from this config. + - job_name: 'prometheus' + + # Override the global default and scrape targets from this job every 5 seconds. + scrape_interval: 5s + + # scheme defaults to 'http' enable https in case your application is server via https + #scheme: https + # basic auth is not needed by default. See https://www.jhipster.tech/monitoring/#configuring-metrics-forwarding for details + #basic_auth: + # username: admin + # password: admin + metrics_path: /management/prometheus + static_configs: + - targets: + # On MacOS, replace localhost by host.docker.internal + - localhost:8080 diff --git a/src/main/docker/sonar.yml b/src/main/docker/sonar.yml new file mode 100644 index 0000000..9619d03 --- /dev/null +++ b/src/main/docker/sonar.yml @@ -0,0 +1,13 @@ +# This configuration is intended for development purpose, it's **your** responsibility to harden it for production +version: '3.8' +services: + datasurvey-sonar: + image: sonarqube:8.9.1-community + # Authentication is turned off for out of the box experience while trying out SonarQube + # For real use cases delete sonar.forceAuthentication variable or set sonar.forceAuthentication=true + environment: + - sonar.forceAuthentication=false + # If you want to expose these ports outside your dev PC, + # remove the "127.0.0.1:" prefix + ports: + - 127.0.0.1:9001:9000 diff --git a/src/main/java/org/datasurvey/ApplicationWebXml.java b/src/main/java/org/datasurvey/ApplicationWebXml.java new file mode 100644 index 0000000..ea53e85 --- /dev/null +++ b/src/main/java/org/datasurvey/ApplicationWebXml.java @@ -0,0 +1,19 @@ +package org.datasurvey; + +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; +import tech.jhipster.config.DefaultProfileUtil; + +/** + * This is a helper Java class that provides an alternative to creating a {@code web.xml}. + * This will be invoked only when the application is deployed to a Servlet container like Tomcat, JBoss etc. + */ +public class ApplicationWebXml extends SpringBootServletInitializer { + + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + // set a default to use when no profile is configured. + DefaultProfileUtil.addDefaultProfile(application.application()); + return application.sources(DataSurveyApp.class); + } +} diff --git a/src/main/java/org/datasurvey/DataSurveyApp.java b/src/main/java/org/datasurvey/DataSurveyApp.java new file mode 100644 index 0000000..266fc47 --- /dev/null +++ b/src/main/java/org/datasurvey/DataSurveyApp.java @@ -0,0 +1,103 @@ +package org.datasurvey; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.Arrays; +import java.util.Collection; +import java.util.Optional; +import javax.annotation.PostConstruct; +import org.apache.commons.lang3.StringUtils; +import org.datasurvey.config.ApplicationProperties; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.liquibase.LiquibaseProperties; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.core.env.Environment; +import tech.jhipster.config.DefaultProfileUtil; +import tech.jhipster.config.JHipsterConstants; + +@SpringBootApplication +@EnableConfigurationProperties({ LiquibaseProperties.class, ApplicationProperties.class }) +public class DataSurveyApp { + + private static final Logger log = LoggerFactory.getLogger(DataSurveyApp.class); + + private final Environment env; + + public DataSurveyApp(Environment env) { + this.env = env; + } + + /** + * Initializes DataSurvey. + *

+ * Spring profiles can be configured with a program argument --spring.profiles.active=your-active-profile + *

+ * You can find more information on how profiles work with JHipster on https://www.jhipster.tech/profiles/. + */ + @PostConstruct + public void initApplication() { + Collection activeProfiles = Arrays.asList(env.getActiveProfiles()); + if ( + activeProfiles.contains(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT) && + activeProfiles.contains(JHipsterConstants.SPRING_PROFILE_PRODUCTION) + ) { + log.error( + "You have misconfigured your application! It should not run " + "with both the 'dev' and 'prod' profiles at the same time." + ); + } + if ( + activeProfiles.contains(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT) && + activeProfiles.contains(JHipsterConstants.SPRING_PROFILE_CLOUD) + ) { + log.error( + "You have misconfigured your application! It should not " + "run with both the 'dev' and 'cloud' profiles at the same time." + ); + } + } + + /** + * Main method, used to run the application. + * + * @param args the command line arguments. + */ + public static void main(String[] args) { + SpringApplication app = new SpringApplication(DataSurveyApp.class); + DefaultProfileUtil.addDefaultProfile(app); + Environment env = app.run(args).getEnvironment(); + logApplicationStartup(env); + } + + private static void logApplicationStartup(Environment env) { + String protocol = Optional.ofNullable(env.getProperty("server.ssl.key-store")).map(key -> "https").orElse("http"); + String serverPort = env.getProperty("server.port"); + String contextPath = Optional + .ofNullable(env.getProperty("server.servlet.context-path")) + .filter(StringUtils::isNotBlank) + .orElse("/"); + String hostAddress = "localhost"; + try { + hostAddress = InetAddress.getLocalHost().getHostAddress(); + } catch (UnknownHostException e) { + log.warn("The host name could not be determined, using `localhost` as fallback"); + } + log.info( + "\n----------------------------------------------------------\n\t" + + "Application '{}' is running! Access URLs:\n\t" + + "Local: \t\t{}://localhost:{}{}\n\t" + + "External: \t{}://{}:{}{}\n\t" + + "Profile(s): \t{}\n----------------------------------------------------------", + env.getProperty("spring.application.name"), + protocol, + serverPort, + contextPath, + protocol, + hostAddress, + serverPort, + contextPath, + env.getActiveProfiles() + ); + } +} diff --git a/src/main/java/org/datasurvey/GeneratedByJHipster.java b/src/main/java/org/datasurvey/GeneratedByJHipster.java new file mode 100644 index 0000000..05b4ced --- /dev/null +++ b/src/main/java/org/datasurvey/GeneratedByJHipster.java @@ -0,0 +1,13 @@ +package org.datasurvey; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import javax.annotation.Generated; + +@Generated(value = "JHipster", comments = "Generated by JHipster 7.1.0") +@Retention(RetentionPolicy.SOURCE) +@Target({ ElementType.TYPE }) +public @interface GeneratedByJHipster { +} diff --git a/src/main/java/org/datasurvey/aop/logging/LoggingAspect.java b/src/main/java/org/datasurvey/aop/logging/LoggingAspect.java new file mode 100644 index 0000000..01d5f01 --- /dev/null +++ b/src/main/java/org/datasurvey/aop/logging/LoggingAspect.java @@ -0,0 +1,111 @@ +package org.datasurvey.aop.logging; + +import java.util.Arrays; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.AfterThrowing; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.env.Environment; +import org.springframework.core.env.Profiles; +import tech.jhipster.config.JHipsterConstants; + +/** + * Aspect for logging execution of service and repository Spring components. + * + * By default, it only runs with the "dev" profile. + */ +@Aspect +public class LoggingAspect { + + private final Environment env; + + public LoggingAspect(Environment env) { + this.env = env; + } + + /** + * Pointcut that matches all repositories, services and Web REST endpoints. + */ + @Pointcut( + "within(@org.springframework.stereotype.Repository *)" + + " || within(@org.springframework.stereotype.Service *)" + + " || within(@org.springframework.web.bind.annotation.RestController *)" + ) + public void springBeanPointcut() { + // Method is empty as this is just a Pointcut, the implementations are in the advices. + } + + /** + * Pointcut that matches all Spring beans in the application's main packages. + */ + @Pointcut("within(org.datasurvey.repository..*)" + " || within(org.datasurvey.service..*)" + " || within(org.datasurvey.web.rest..*)") + public void applicationPackagePointcut() { + // Method is empty as this is just a Pointcut, the implementations are in the advices. + } + + /** + * Retrieves the {@link Logger} associated to the given {@link JoinPoint}. + * + * @param joinPoint join point we want the logger for. + * @return {@link Logger} associated to the given {@link JoinPoint}. + */ + private Logger logger(JoinPoint joinPoint) { + return LoggerFactory.getLogger(joinPoint.getSignature().getDeclaringTypeName()); + } + + /** + * Advice that logs methods throwing exceptions. + * + * @param joinPoint join point for advice. + * @param e exception. + */ + @AfterThrowing(pointcut = "applicationPackagePointcut() && springBeanPointcut()", throwing = "e") + public void logAfterThrowing(JoinPoint joinPoint, Throwable e) { + if (env.acceptsProfiles(Profiles.of(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT))) { + logger(joinPoint) + .error( + "Exception in {}() with cause = \'{}\' and exception = \'{}\'", + joinPoint.getSignature().getName(), + e.getCause() != null ? e.getCause() : "NULL", + e.getMessage(), + e + ); + } else { + logger(joinPoint) + .error( + "Exception in {}() with cause = {}", + joinPoint.getSignature().getName(), + e.getCause() != null ? e.getCause() : "NULL" + ); + } + } + + /** + * Advice that logs when a method is entered and exited. + * + * @param joinPoint join point for advice. + * @return result. + * @throws Throwable throws {@link IllegalArgumentException}. + */ + @Around("applicationPackagePointcut() && springBeanPointcut()") + public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable { + Logger log = logger(joinPoint); + if (log.isDebugEnabled()) { + log.debug("Enter: {}() with argument[s] = {}", joinPoint.getSignature().getName(), Arrays.toString(joinPoint.getArgs())); + } + try { + Object result = joinPoint.proceed(); + if (log.isDebugEnabled()) { + log.debug("Exit: {}() with result = {}", joinPoint.getSignature().getName(), result); + } + return result; + } catch (IllegalArgumentException e) { + log.error("Illegal argument: {} in {}()", Arrays.toString(joinPoint.getArgs()), joinPoint.getSignature().getName()); + throw e; + } + } +} diff --git a/src/main/java/org/datasurvey/config/ApplicationProperties.java b/src/main/java/org/datasurvey/config/ApplicationProperties.java new file mode 100644 index 0000000..86c8468 --- /dev/null +++ b/src/main/java/org/datasurvey/config/ApplicationProperties.java @@ -0,0 +1,12 @@ +package org.datasurvey.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * Properties specific to Data Survey. + *

+ * Properties are configured in the {@code application.yml} file. + * See {@link tech.jhipster.config.JHipsterProperties} for a good example. + */ +@ConfigurationProperties(prefix = "application", ignoreUnknownFields = false) +public class ApplicationProperties {} diff --git a/src/main/java/org/datasurvey/config/AsyncConfiguration.java b/src/main/java/org/datasurvey/config/AsyncConfiguration.java new file mode 100644 index 0000000..c74a6e7 --- /dev/null +++ b/src/main/java/org/datasurvey/config/AsyncConfiguration.java @@ -0,0 +1,46 @@ +package org.datasurvey.config; + +import java.util.concurrent.Executor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler; +import org.springframework.aop.interceptor.SimpleAsyncUncaughtExceptionHandler; +import org.springframework.boot.autoconfigure.task.TaskExecutionProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.AsyncConfigurer; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import tech.jhipster.async.ExceptionHandlingAsyncTaskExecutor; + +@Configuration +@EnableAsync +@EnableScheduling +public class AsyncConfiguration implements AsyncConfigurer { + + private final Logger log = LoggerFactory.getLogger(AsyncConfiguration.class); + + private final TaskExecutionProperties taskExecutionProperties; + + public AsyncConfiguration(TaskExecutionProperties taskExecutionProperties) { + this.taskExecutionProperties = taskExecutionProperties; + } + + @Override + @Bean(name = "taskExecutor") + public Executor getAsyncExecutor() { + log.debug("Creating Async Task Executor"); + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(taskExecutionProperties.getPool().getCoreSize()); + executor.setMaxPoolSize(taskExecutionProperties.getPool().getMaxSize()); + executor.setQueueCapacity(taskExecutionProperties.getPool().getQueueCapacity()); + executor.setThreadNamePrefix(taskExecutionProperties.getThreadNamePrefix()); + return new ExceptionHandlingAsyncTaskExecutor(executor); + } + + @Override + public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { + return new SimpleAsyncUncaughtExceptionHandler(); + } +} diff --git a/src/main/java/org/datasurvey/config/CacheConfiguration.java b/src/main/java/org/datasurvey/config/CacheConfiguration.java new file mode 100644 index 0000000..0836c99 --- /dev/null +++ b/src/main/java/org/datasurvey/config/CacheConfiguration.java @@ -0,0 +1,106 @@ +package org.datasurvey.config; + +import java.time.Duration; +import org.ehcache.config.builders.*; +import org.ehcache.jsr107.Eh107Configuration; +import org.hibernate.cache.jcache.ConfigSettings; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.cache.JCacheManagerCustomizer; +import org.springframework.boot.autoconfigure.orm.jpa.HibernatePropertiesCustomizer; +import org.springframework.boot.info.BuildProperties; +import org.springframework.boot.info.GitProperties; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.cache.interceptor.KeyGenerator; +import org.springframework.context.annotation.*; +import tech.jhipster.config.JHipsterProperties; +import tech.jhipster.config.cache.PrefixedKeyGenerator; + +@Configuration +@EnableCaching +public class CacheConfiguration { + + private GitProperties gitProperties; + private BuildProperties buildProperties; + private final javax.cache.configuration.Configuration jcacheConfiguration; + + public CacheConfiguration(JHipsterProperties jHipsterProperties) { + JHipsterProperties.Cache.Ehcache ehcache = jHipsterProperties.getCache().getEhcache(); + + jcacheConfiguration = + Eh107Configuration.fromEhcacheCacheConfiguration( + CacheConfigurationBuilder + .newCacheConfigurationBuilder(Object.class, Object.class, ResourcePoolsBuilder.heap(ehcache.getMaxEntries())) + .withExpiry(ExpiryPolicyBuilder.timeToLiveExpiration(Duration.ofSeconds(ehcache.getTimeToLiveSeconds()))) + .build() + ); + } + + @Bean + public HibernatePropertiesCustomizer hibernatePropertiesCustomizer(javax.cache.CacheManager cacheManager) { + return hibernateProperties -> hibernateProperties.put(ConfigSettings.CACHE_MANAGER, cacheManager); + } + + @Bean + public JCacheManagerCustomizer cacheManagerCustomizer() { + return cm -> { + createCache(cm, org.datasurvey.repository.UserRepository.USERS_BY_LOGIN_CACHE); + createCache(cm, org.datasurvey.repository.UserRepository.USERS_BY_EMAIL_CACHE); + createCache(cm, org.datasurvey.domain.User.class.getName()); + createCache(cm, org.datasurvey.domain.Authority.class.getName()); + createCache(cm, org.datasurvey.domain.User.class.getName() + ".authorities"); + createCache(cm, org.datasurvey.domain.ParametroAplicacion.class.getName()); + createCache(cm, org.datasurvey.domain.UsuarioExtra.class.getName()); + createCache(cm, org.datasurvey.domain.UsuarioExtra.class.getName() + ".encuestas"); + createCache(cm, org.datasurvey.domain.UsuarioExtra.class.getName() + ".usuarioEncuestas"); + createCache(cm, org.datasurvey.domain.UsuarioExtra.class.getName() + ".plantillas"); + createCache(cm, org.datasurvey.domain.Encuesta.class.getName()); + createCache(cm, org.datasurvey.domain.Encuesta.class.getName() + ".usuarioEncuestas"); + createCache(cm, org.datasurvey.domain.Encuesta.class.getName() + ".ePreguntaAbiertas"); + createCache(cm, org.datasurvey.domain.Encuesta.class.getName() + ".ePreguntaCerradas"); + createCache(cm, org.datasurvey.domain.EPreguntaAbierta.class.getName()); + createCache(cm, org.datasurvey.domain.EPreguntaAbierta.class.getName() + ".ePreguntaAbiertaRespuestas"); + createCache(cm, org.datasurvey.domain.EPreguntaAbiertaRespuesta.class.getName()); + createCache(cm, org.datasurvey.domain.EPreguntaCerrada.class.getName()); + createCache(cm, org.datasurvey.domain.EPreguntaCerrada.class.getName() + ".ePreguntaCerradaOpcions"); + createCache(cm, org.datasurvey.domain.EPreguntaCerradaOpcion.class.getName()); + createCache(cm, org.datasurvey.domain.UsuarioEncuesta.class.getName()); + createCache(cm, org.datasurvey.domain.Categoria.class.getName()); + createCache(cm, org.datasurvey.domain.Categoria.class.getName() + ".encuestas"); + createCache(cm, org.datasurvey.domain.Categoria.class.getName() + ".plantillas"); + createCache(cm, org.datasurvey.domain.Factura.class.getName()); + createCache(cm, org.datasurvey.domain.Plantilla.class.getName()); + createCache(cm, org.datasurvey.domain.Plantilla.class.getName() + ".pPreguntaCerradas"); + createCache(cm, org.datasurvey.domain.Plantilla.class.getName() + ".pPreguntaAbiertas"); + createCache(cm, org.datasurvey.domain.Plantilla.class.getName() + ".usuarioExtras"); + createCache(cm, org.datasurvey.domain.PPreguntaAbierta.class.getName()); + createCache(cm, org.datasurvey.domain.PPreguntaCerrada.class.getName()); + createCache(cm, org.datasurvey.domain.PPreguntaCerrada.class.getName() + ".pPreguntaCerradaOpcions"); + createCache(cm, org.datasurvey.domain.PPreguntaCerradaOpcion.class.getName()); + // jhipster-needle-ehcache-add-entry + }; + } + + private void createCache(javax.cache.CacheManager cm, String cacheName) { + javax.cache.Cache cache = cm.getCache(cacheName); + if (cache != null) { + cache.clear(); + } else { + cm.createCache(cacheName, jcacheConfiguration); + } + } + + @Autowired(required = false) + public void setGitProperties(GitProperties gitProperties) { + this.gitProperties = gitProperties; + } + + @Autowired(required = false) + public void setBuildProperties(BuildProperties buildProperties) { + this.buildProperties = buildProperties; + } + + @Bean + public KeyGenerator keyGenerator() { + return new PrefixedKeyGenerator(this.gitProperties, this.buildProperties); + } +} diff --git a/src/main/java/org/datasurvey/config/Constants.java b/src/main/java/org/datasurvey/config/Constants.java new file mode 100644 index 0000000..224acca --- /dev/null +++ b/src/main/java/org/datasurvey/config/Constants.java @@ -0,0 +1,15 @@ +package org.datasurvey.config; + +/** + * Application constants. + */ +public final class Constants { + + // Regex for acceptable logins + public static final String LOGIN_REGEX = "^(?>[a-zA-Z0-9!$&*+=?^_`{|}~.-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*)|(?>[_.@A-Za-z0-9-]+)$"; + + public static final String SYSTEM = "system"; + public static final String DEFAULT_LANGUAGE = "es"; + + private Constants() {} +} diff --git a/src/main/java/org/datasurvey/config/DatabaseConfiguration.java b/src/main/java/org/datasurvey/config/DatabaseConfiguration.java new file mode 100644 index 0000000..1c4f070 --- /dev/null +++ b/src/main/java/org/datasurvey/config/DatabaseConfiguration.java @@ -0,0 +1,16 @@ +package org.datasurvey.config; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.transaction.annotation.EnableTransactionManagement; +import tech.jhipster.config.JHipsterConstants; + +@Configuration +@EnableJpaRepositories("org.datasurvey.repository") +@EnableJpaAuditing(auditorAwareRef = "springSecurityAuditorAware") +@EnableTransactionManagement +public class DatabaseConfiguration {} diff --git a/src/main/java/org/datasurvey/config/DateTimeFormatConfiguration.java b/src/main/java/org/datasurvey/config/DateTimeFormatConfiguration.java new file mode 100644 index 0000000..896c607 --- /dev/null +++ b/src/main/java/org/datasurvey/config/DateTimeFormatConfiguration.java @@ -0,0 +1,20 @@ +package org.datasurvey.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.format.FormatterRegistry; +import org.springframework.format.datetime.standard.DateTimeFormatterRegistrar; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +/** + * Configure the converters to use the ISO format for dates by default. + */ +@Configuration +public class DateTimeFormatConfiguration implements WebMvcConfigurer { + + @Override + public void addFormatters(FormatterRegistry registry) { + DateTimeFormatterRegistrar registrar = new DateTimeFormatterRegistrar(); + registrar.setUseIsoFormat(true); + registrar.registerFormatters(registry); + } +} diff --git a/src/main/java/org/datasurvey/config/JacksonConfiguration.java b/src/main/java/org/datasurvey/config/JacksonConfiguration.java new file mode 100644 index 0000000..db9e784 --- /dev/null +++ b/src/main/java/org/datasurvey/config/JacksonConfiguration.java @@ -0,0 +1,51 @@ +package org.datasurvey.config; + +import com.fasterxml.jackson.datatype.hibernate5.Hibernate5Module; +import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.zalando.problem.ProblemModule; +import org.zalando.problem.violations.ConstraintViolationProblemModule; + +@Configuration +public class JacksonConfiguration { + + /** + * Support for Java date and time API. + * @return the corresponding Jackson module. + */ + @Bean + public JavaTimeModule javaTimeModule() { + return new JavaTimeModule(); + } + + @Bean + public Jdk8Module jdk8TimeModule() { + return new Jdk8Module(); + } + + /* + * Support for Hibernate types in Jackson. + */ + @Bean + public Hibernate5Module hibernate5Module() { + return new Hibernate5Module(); + } + + /* + * Module for serialization/deserialization of RFC7807 Problem. + */ + @Bean + public ProblemModule problemModule() { + return new ProblemModule(); + } + + /* + * Module for serialization/deserialization of ConstraintViolationProblem. + */ + @Bean + public ConstraintViolationProblemModule constraintViolationProblemModule() { + return new ConstraintViolationProblemModule(); + } +} diff --git a/src/main/java/org/datasurvey/config/LiquibaseConfiguration.java b/src/main/java/org/datasurvey/config/LiquibaseConfiguration.java new file mode 100644 index 0000000..0f8d0dd --- /dev/null +++ b/src/main/java/org/datasurvey/config/LiquibaseConfiguration.java @@ -0,0 +1,69 @@ +package org.datasurvey.config; + +import java.util.concurrent.Executor; +import javax.sql.DataSource; +import liquibase.integration.spring.SpringLiquibase; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.ObjectProvider; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; +import org.springframework.boot.autoconfigure.liquibase.LiquibaseDataSource; +import org.springframework.boot.autoconfigure.liquibase.LiquibaseProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; +import org.springframework.core.env.Profiles; +import tech.jhipster.config.JHipsterConstants; +import tech.jhipster.config.liquibase.SpringLiquibaseUtil; + +@Configuration +public class LiquibaseConfiguration { + + private final Logger log = LoggerFactory.getLogger(LiquibaseConfiguration.class); + + private final Environment env; + + public LiquibaseConfiguration(Environment env) { + this.env = env; + } + + @Bean + public SpringLiquibase liquibase( + @Qualifier("taskExecutor") Executor executor, + @LiquibaseDataSource ObjectProvider liquibaseDataSource, + LiquibaseProperties liquibaseProperties, + ObjectProvider dataSource, + DataSourceProperties dataSourceProperties + ) { + // If you don't want Liquibase to start asynchronously, substitute by this: + // SpringLiquibase liquibase = SpringLiquibaseUtil.createSpringLiquibase(liquibaseDataSource.getIfAvailable(), liquibaseProperties, dataSource.getIfUnique(), dataSourceProperties); + SpringLiquibase liquibase = SpringLiquibaseUtil.createAsyncSpringLiquibase( + this.env, + executor, + liquibaseDataSource.getIfAvailable(), + liquibaseProperties, + dataSource.getIfUnique(), + dataSourceProperties + ); + liquibase.setChangeLog("classpath:config/liquibase/master.xml"); + liquibase.setContexts(liquibaseProperties.getContexts()); + liquibase.setDefaultSchema(liquibaseProperties.getDefaultSchema()); + liquibase.setLiquibaseSchema(liquibaseProperties.getLiquibaseSchema()); + liquibase.setLiquibaseTablespace(liquibaseProperties.getLiquibaseTablespace()); + liquibase.setDatabaseChangeLogLockTable(liquibaseProperties.getDatabaseChangeLogLockTable()); + liquibase.setDatabaseChangeLogTable(liquibaseProperties.getDatabaseChangeLogTable()); + liquibase.setDropFirst(liquibaseProperties.isDropFirst()); + liquibase.setLabels(liquibaseProperties.getLabels()); + liquibase.setChangeLogParameters(liquibaseProperties.getParameters()); + liquibase.setRollbackFile(liquibaseProperties.getRollbackFile()); + liquibase.setTestRollbackOnUpdate(liquibaseProperties.isTestRollbackOnUpdate()); + if (env.acceptsProfiles(Profiles.of(JHipsterConstants.SPRING_PROFILE_NO_LIQUIBASE))) { + liquibase.setShouldRun(false); + } else { + liquibase.setShouldRun(liquibaseProperties.isEnabled()); + log.debug("Configuring Liquibase"); + } + return liquibase; + } +} diff --git a/src/main/java/org/datasurvey/config/LocaleConfiguration.java b/src/main/java/org/datasurvey/config/LocaleConfiguration.java new file mode 100644 index 0000000..3150453 --- /dev/null +++ b/src/main/java/org/datasurvey/config/LocaleConfiguration.java @@ -0,0 +1,26 @@ +package org.datasurvey.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.LocaleResolver; +import org.springframework.web.servlet.config.annotation.*; +import org.springframework.web.servlet.i18n.LocaleChangeInterceptor; +import tech.jhipster.config.locale.AngularCookieLocaleResolver; + +@Configuration +public class LocaleConfiguration implements WebMvcConfigurer { + + @Bean + public LocaleResolver localeResolver() { + AngularCookieLocaleResolver cookieLocaleResolver = new AngularCookieLocaleResolver(); + cookieLocaleResolver.setCookieName("NG_TRANSLATE_LANG_KEY"); + return cookieLocaleResolver; + } + + @Override + public void addInterceptors(InterceptorRegistry registry) { + LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor(); + localeChangeInterceptor.setParamName("language"); + registry.addInterceptor(localeChangeInterceptor); + } +} diff --git a/src/main/java/org/datasurvey/config/LoggingAspectConfiguration.java b/src/main/java/org/datasurvey/config/LoggingAspectConfiguration.java new file mode 100644 index 0000000..631ee45 --- /dev/null +++ b/src/main/java/org/datasurvey/config/LoggingAspectConfiguration.java @@ -0,0 +1,17 @@ +package org.datasurvey.config; + +import org.datasurvey.aop.logging.LoggingAspect; +import org.springframework.context.annotation.*; +import org.springframework.core.env.Environment; +import tech.jhipster.config.JHipsterConstants; + +@Configuration +@EnableAspectJAutoProxy +public class LoggingAspectConfiguration { + + @Bean + @Profile(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT) + public LoggingAspect loggingAspect(Environment env) { + return new LoggingAspect(env); + } +} diff --git a/src/main/java/org/datasurvey/config/LoggingConfiguration.java b/src/main/java/org/datasurvey/config/LoggingConfiguration.java new file mode 100644 index 0000000..16b9f6e --- /dev/null +++ b/src/main/java/org/datasurvey/config/LoggingConfiguration.java @@ -0,0 +1,47 @@ +package org.datasurvey.config; + +import static tech.jhipster.config.logging.LoggingUtils.*; + +import ch.qos.logback.classic.LoggerContext; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import java.util.HashMap; +import java.util.Map; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; +import tech.jhipster.config.JHipsterProperties; + +/* + * Configures the console and Logstash log appenders from the app properties + */ +@Configuration +public class LoggingConfiguration { + + public LoggingConfiguration( + @Value("${spring.application.name}") String appName, + @Value("${server.port}") String serverPort, + JHipsterProperties jHipsterProperties, + ObjectMapper mapper + ) throws JsonProcessingException { + LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); + + Map map = new HashMap<>(); + map.put("app_name", appName); + map.put("app_port", serverPort); + String customFields = mapper.writeValueAsString(map); + + JHipsterProperties.Logging loggingProperties = jHipsterProperties.getLogging(); + JHipsterProperties.Logging.Logstash logstashProperties = loggingProperties.getLogstash(); + + if (loggingProperties.isUseJsonFormat()) { + addJsonConsoleAppender(context, customFields); + } + if (logstashProperties.isEnabled()) { + addLogstashTcpSocketAppender(context, customFields, logstashProperties); + } + if (loggingProperties.isUseJsonFormat() || logstashProperties.isEnabled()) { + addContextListener(context, customFields, loggingProperties); + } + } +} diff --git a/src/main/java/org/datasurvey/config/SecurityConfiguration.java b/src/main/java/org/datasurvey/config/SecurityConfiguration.java new file mode 100644 index 0000000..1661950 --- /dev/null +++ b/src/main/java/org/datasurvey/config/SecurityConfiguration.java @@ -0,0 +1,111 @@ +package org.datasurvey.config; + +import org.datasurvey.security.*; +import org.datasurvey.security.jwt.*; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Import; +import org.springframework.http.HttpMethod; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.builders.WebSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; +import org.springframework.security.web.header.writers.ReferrerPolicyHeaderWriter; +import org.springframework.web.filter.CorsFilter; +import org.zalando.problem.spring.web.advice.security.SecurityProblemSupport; +import tech.jhipster.config.JHipsterProperties; + +@EnableWebSecurity +@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) +@Import(SecurityProblemSupport.class) +public class SecurityConfiguration extends WebSecurityConfigurerAdapter { + + private final JHipsterProperties jHipsterProperties; + + private final TokenProvider tokenProvider; + + private final CorsFilter corsFilter; + private final SecurityProblemSupport problemSupport; + + public SecurityConfiguration( + TokenProvider tokenProvider, + CorsFilter corsFilter, + JHipsterProperties jHipsterProperties, + SecurityProblemSupport problemSupport + ) { + this.tokenProvider = tokenProvider; + this.corsFilter = corsFilter; + this.problemSupport = problemSupport; + this.jHipsterProperties = jHipsterProperties; + } + + @Bean + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } + + @Override + public void configure(WebSecurity web) { + web + .ignoring() + .antMatchers(HttpMethod.OPTIONS, "/**") + .antMatchers("/app/**/*.{js,html}") + .antMatchers("/i18n/**") + .antMatchers("/content/**") + .antMatchers("/swagger-ui/**") + .antMatchers("/test/**"); + } + + @Override + public void configure(HttpSecurity http) throws Exception { + // @formatter:off + http + .csrf() + .disable() + .addFilterBefore(corsFilter, UsernamePasswordAuthenticationFilter.class) + .exceptionHandling() + .authenticationEntryPoint(problemSupport) + .accessDeniedHandler(problemSupport) + .and() + .headers() + .contentSecurityPolicy(jHipsterProperties.getSecurity().getContentSecurityPolicy()) + .and() + .referrerPolicy(ReferrerPolicyHeaderWriter.ReferrerPolicy.STRICT_ORIGIN_WHEN_CROSS_ORIGIN) + .and() + .featurePolicy("geolocation 'none'; midi 'none'; sync-xhr 'none'; microphone 'none'; camera 'none'; magnetometer 'none'; gyroscope 'none'; fullscreen 'self'; payment 'none'") + .and() + .frameOptions() + .deny() + .and() + .sessionManagement() + .sessionCreationPolicy(SessionCreationPolicy.STATELESS) + .and() + .authorizeRequests() + .antMatchers("/api/authenticate").permitAll() + .antMatchers("/api/register").permitAll() + .antMatchers("/api/activate").permitAll() + .antMatchers("/api/account/reset-password/init").permitAll() + .antMatchers("/api/account/reset-password/finish").permitAll() + .antMatchers("/api/admin/**").hasAuthority(AuthoritiesConstants.ADMIN) + .antMatchers("/api/**").authenticated() + .antMatchers("/websocket/**").authenticated() + .antMatchers("/management/health").permitAll() + .antMatchers("/management/health/**").permitAll() + .antMatchers("/management/info").permitAll() + .antMatchers("/management/prometheus").permitAll() + .antMatchers("/management/**").hasAuthority(AuthoritiesConstants.ADMIN) + .and() + .httpBasic() + .and() + .apply(securityConfigurerAdapter()); + // @formatter:on + } + + private JWTConfigurer securityConfigurerAdapter() { + return new JWTConfigurer(tokenProvider); + } +} diff --git a/src/main/java/org/datasurvey/config/StaticResourcesWebConfiguration.java b/src/main/java/org/datasurvey/config/StaticResourcesWebConfiguration.java new file mode 100644 index 0000000..dbc3a30 --- /dev/null +++ b/src/main/java/org/datasurvey/config/StaticResourcesWebConfiguration.java @@ -0,0 +1,59 @@ +package org.datasurvey.config; + +import java.util.concurrent.TimeUnit; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; +import org.springframework.http.CacheControl; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistration; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import tech.jhipster.config.JHipsterConstants; +import tech.jhipster.config.JHipsterProperties; + +@Configuration +@Profile({ JHipsterConstants.SPRING_PROFILE_PRODUCTION }) +public class StaticResourcesWebConfiguration implements WebMvcConfigurer { + + protected static final String[] RESOURCE_LOCATIONS = new String[] { + "classpath:/static/", + "classpath:/static/content/", + "classpath:/static/i18n/", + }; + protected static final String[] RESOURCE_PATHS = new String[] { + "/*.js", + "/*.css", + "/*.svg", + "/*.png", + "*.ico", + "/content/**", + "/i18n/*", + }; + + private final JHipsterProperties jhipsterProperties; + + public StaticResourcesWebConfiguration(JHipsterProperties jHipsterProperties) { + this.jhipsterProperties = jHipsterProperties; + } + + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + ResourceHandlerRegistration resourceHandlerRegistration = appendResourceHandler(registry); + initializeResourceHandler(resourceHandlerRegistration); + } + + protected ResourceHandlerRegistration appendResourceHandler(ResourceHandlerRegistry registry) { + return registry.addResourceHandler(RESOURCE_PATHS); + } + + protected void initializeResourceHandler(ResourceHandlerRegistration resourceHandlerRegistration) { + resourceHandlerRegistration.addResourceLocations(RESOURCE_LOCATIONS).setCacheControl(getCacheControl()); + } + + protected CacheControl getCacheControl() { + return CacheControl.maxAge(getJHipsterHttpCacheProperty(), TimeUnit.DAYS).cachePublic(); + } + + private int getJHipsterHttpCacheProperty() { + return jhipsterProperties.getHttp().getCache().getTimeToLiveInDays(); + } +} diff --git a/src/main/java/org/datasurvey/config/WebConfigurer.java b/src/main/java/org/datasurvey/config/WebConfigurer.java new file mode 100644 index 0000000..76aefc7 --- /dev/null +++ b/src/main/java/org/datasurvey/config/WebConfigurer.java @@ -0,0 +1,109 @@ +package org.datasurvey.config; + +import static java.net.URLDecoder.decode; + +import java.io.File; +import java.io.UnsupportedEncodingException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Paths; +import java.util.*; +import javax.servlet.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.web.server.*; +import org.springframework.boot.web.servlet.ServletContextInitializer; +import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; +import org.springframework.core.env.Profiles; +import org.springframework.util.CollectionUtils; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; +import org.springframework.web.filter.CorsFilter; +import tech.jhipster.config.JHipsterConstants; +import tech.jhipster.config.JHipsterProperties; + +/** + * Configuration of web application with Servlet 3.0 APIs. + */ +@Configuration +public class WebConfigurer implements ServletContextInitializer, WebServerFactoryCustomizer { + + private final Logger log = LoggerFactory.getLogger(WebConfigurer.class); + + private final Environment env; + + private final JHipsterProperties jHipsterProperties; + + public WebConfigurer(Environment env, JHipsterProperties jHipsterProperties) { + this.env = env; + this.jHipsterProperties = jHipsterProperties; + } + + @Override + public void onStartup(ServletContext servletContext) throws ServletException { + if (env.getActiveProfiles().length != 0) { + log.info("Web application configuration, using profiles: {}", (Object[]) env.getActiveProfiles()); + } + + log.info("Web application fully configured"); + } + + /** + * Customize the Servlet engine: Mime types, the document root, the cache. + */ + @Override + public void customize(WebServerFactory server) { + // When running in an IDE or with ./mvnw spring-boot:run, set location of the static web assets. + setLocationForStaticAssets(server); + } + + private void setLocationForStaticAssets(WebServerFactory server) { + if (server instanceof ConfigurableServletWebServerFactory) { + ConfigurableServletWebServerFactory servletWebServer = (ConfigurableServletWebServerFactory) server; + File root; + String prefixPath = resolvePathPrefix(); + root = new File(prefixPath + "target/classes/static/"); + if (root.exists() && root.isDirectory()) { + servletWebServer.setDocumentRoot(root); + } + } + } + + /** + * Resolve path prefix to static resources. + */ + private String resolvePathPrefix() { + String fullExecutablePath; + try { + fullExecutablePath = decode(this.getClass().getResource("").getPath(), StandardCharsets.UTF_8.name()); + } catch (UnsupportedEncodingException e) { + /* try without decoding if this ever happens */ + fullExecutablePath = this.getClass().getResource("").getPath(); + } + String rootPath = Paths.get(".").toUri().normalize().getPath(); + String extractedPath = fullExecutablePath.replace(rootPath, ""); + int extractionEndIndex = extractedPath.indexOf("target/"); + if (extractionEndIndex <= 0) { + return ""; + } + return extractedPath.substring(0, extractionEndIndex); + } + + @Bean + public CorsFilter corsFilter() { + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + CorsConfiguration config = jHipsterProperties.getCors(); + if (!CollectionUtils.isEmpty(config.getAllowedOrigins()) || !CollectionUtils.isEmpty(config.getAllowedOriginPatterns())) { + log.debug("Registering CORS filter"); + source.registerCorsConfiguration("/api/**", config); + source.registerCorsConfiguration("/management/**", config); + source.registerCorsConfiguration("/v2/api-docs", config); + source.registerCorsConfiguration("/v3/api-docs", config); + source.registerCorsConfiguration("/swagger-resources", config); + source.registerCorsConfiguration("/swagger-ui/**", config); + } + return new CorsFilter(source); + } +} diff --git a/src/main/java/org/datasurvey/config/WebsocketConfiguration.java b/src/main/java/org/datasurvey/config/WebsocketConfiguration.java new file mode 100644 index 0000000..500d2bf --- /dev/null +++ b/src/main/java/org/datasurvey/config/WebsocketConfiguration.java @@ -0,0 +1,90 @@ +package org.datasurvey.config; + +import java.security.Principal; +import java.util.*; +import org.datasurvey.security.AuthoritiesConstants; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.server.*; +import org.springframework.messaging.simp.config.MessageBrokerRegistry; +import org.springframework.security.authentication.AnonymousAuthenticationToken; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.web.socket.WebSocketHandler; +import org.springframework.web.socket.config.annotation.*; +import org.springframework.web.socket.server.HandshakeInterceptor; +import org.springframework.web.socket.server.support.DefaultHandshakeHandler; +import tech.jhipster.config.JHipsterProperties; + +@Configuration +@EnableWebSocketMessageBroker +public class WebsocketConfiguration implements WebSocketMessageBrokerConfigurer { + + public static final String IP_ADDRESS = "IP_ADDRESS"; + + private final JHipsterProperties jHipsterProperties; + + public WebsocketConfiguration(JHipsterProperties jHipsterProperties) { + this.jHipsterProperties = jHipsterProperties; + } + + @Override + public void configureMessageBroker(MessageBrokerRegistry config) { + config.enableSimpleBroker("/topic"); + } + + @Override + public void registerStompEndpoints(StompEndpointRegistry registry) { + String[] allowedOrigins = Optional + .ofNullable(jHipsterProperties.getCors().getAllowedOrigins()) + .map(origins -> origins.toArray(new String[0])) + .orElse(new String[0]); + registry + .addEndpoint("/websocket/tracker") + .setHandshakeHandler(defaultHandshakeHandler()) + .setAllowedOrigins(allowedOrigins) + .withSockJS() + .setInterceptors(httpSessionHandshakeInterceptor()); + } + + @Bean + public HandshakeInterceptor httpSessionHandshakeInterceptor() { + return new HandshakeInterceptor() { + @Override + public boolean beforeHandshake( + ServerHttpRequest request, + ServerHttpResponse response, + WebSocketHandler wsHandler, + Map attributes + ) throws Exception { + if (request instanceof ServletServerHttpRequest) { + ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request; + attributes.put(IP_ADDRESS, servletRequest.getRemoteAddress()); + } + return true; + } + + @Override + public void afterHandshake( + ServerHttpRequest request, + ServerHttpResponse response, + WebSocketHandler wsHandler, + Exception exception + ) {} + }; + } + + private DefaultHandshakeHandler defaultHandshakeHandler() { + return new DefaultHandshakeHandler() { + @Override + protected Principal determineUser(ServerHttpRequest request, WebSocketHandler wsHandler, Map attributes) { + Principal principal = request.getPrincipal(); + if (principal == null) { + Collection authorities = new ArrayList<>(); + authorities.add(new SimpleGrantedAuthority(AuthoritiesConstants.ANONYMOUS)); + principal = new AnonymousAuthenticationToken("WebsocketConfiguration", "anonymous", authorities); + } + return principal; + } + }; + } +} diff --git a/src/main/java/org/datasurvey/config/WebsocketSecurityConfiguration.java b/src/main/java/org/datasurvey/config/WebsocketSecurityConfiguration.java new file mode 100644 index 0000000..b3d0ecc --- /dev/null +++ b/src/main/java/org/datasurvey/config/WebsocketSecurityConfiguration.java @@ -0,0 +1,40 @@ +package org.datasurvey.config; + +import org.datasurvey.security.AuthoritiesConstants; +import org.springframework.context.annotation.Configuration; +import org.springframework.messaging.simp.SimpMessageType; +import org.springframework.security.config.annotation.web.messaging.MessageSecurityMetadataSourceRegistry; +import org.springframework.security.config.annotation.web.socket.AbstractSecurityWebSocketMessageBrokerConfigurer; + +@Configuration +public class WebsocketSecurityConfiguration extends AbstractSecurityWebSocketMessageBrokerConfigurer { + + @Override + protected void configureInbound(MessageSecurityMetadataSourceRegistry messages) { + messages + .nullDestMatcher() + .authenticated() + .simpDestMatchers("/topic/tracker") + .hasAuthority(AuthoritiesConstants.ADMIN) + // matches any destination that starts with /topic/ + // (i.e. cannot send messages directly to /topic/) + // (i.e. cannot subscribe to /topic/messages/* to get messages sent to + // /topic/messages-user) + .simpDestMatchers("/topic/**") + .authenticated() + // message types other than MESSAGE and SUBSCRIBE + .simpTypeMatchers(SimpMessageType.MESSAGE, SimpMessageType.SUBSCRIBE) + .denyAll() + // catch all + .anyMessage() + .denyAll(); + } + + /** + * Disables CSRF for Websockets. + */ + @Override + protected boolean sameOriginDisabled() { + return true; + } +} diff --git a/src/main/java/org/datasurvey/config/package-info.java b/src/main/java/org/datasurvey/config/package-info.java new file mode 100644 index 0000000..a71fd8e --- /dev/null +++ b/src/main/java/org/datasurvey/config/package-info.java @@ -0,0 +1,4 @@ +/** + * Spring Framework configuration files. + */ +package org.datasurvey.config; diff --git a/src/main/java/org/datasurvey/domain/AbstractAuditingEntity.java b/src/main/java/org/datasurvey/domain/AbstractAuditingEntity.java new file mode 100644 index 0000000..ffc2131 --- /dev/null +++ b/src/main/java/org/datasurvey/domain/AbstractAuditingEntity.java @@ -0,0 +1,76 @@ +package org.datasurvey.domain; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import java.io.Serializable; +import java.time.Instant; +import javax.persistence.Column; +import javax.persistence.EntityListeners; +import javax.persistence.MappedSuperclass; +import org.springframework.data.annotation.CreatedBy; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedBy; +import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +/** + * Base abstract class for entities which will hold definitions for created, last modified, created by, + * last modified by attributes. + */ +@MappedSuperclass +@EntityListeners(AuditingEntityListener.class) +public abstract class AbstractAuditingEntity implements Serializable { + + private static final long serialVersionUID = 1L; + + @CreatedBy + @Column(name = "created_by", nullable = false, length = 50, updatable = false) + @JsonIgnore + private String createdBy; + + @CreatedDate + @Column(name = "created_date", updatable = false) + @JsonIgnore + private Instant createdDate = Instant.now(); + + @LastModifiedBy + @Column(name = "last_modified_by", length = 50) + @JsonIgnore + private String lastModifiedBy; + + @LastModifiedDate + @Column(name = "last_modified_date") + @JsonIgnore + private Instant lastModifiedDate = Instant.now(); + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Instant getCreatedDate() { + return createdDate; + } + + public void setCreatedDate(Instant createdDate) { + this.createdDate = createdDate; + } + + public String getLastModifiedBy() { + return lastModifiedBy; + } + + public void setLastModifiedBy(String lastModifiedBy) { + this.lastModifiedBy = lastModifiedBy; + } + + public Instant getLastModifiedDate() { + return lastModifiedDate; + } + + public void setLastModifiedDate(Instant lastModifiedDate) { + this.lastModifiedDate = lastModifiedDate; + } +} diff --git a/src/main/java/org/datasurvey/domain/Authority.java b/src/main/java/org/datasurvey/domain/Authority.java new file mode 100644 index 0000000..c63b10b --- /dev/null +++ b/src/main/java/org/datasurvey/domain/Authority.java @@ -0,0 +1,61 @@ +package org.datasurvey.domain; + +import java.io.Serializable; +import java.util.Objects; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import org.hibernate.annotations.Cache; +import org.hibernate.annotations.CacheConcurrencyStrategy; + +/** + * An authority (a security role) used by Spring Security. + */ +@Entity +@Table(name = "jhi_authority") +@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) +public class Authority implements Serializable { + + private static final long serialVersionUID = 1L; + + @NotNull + @Size(max = 50) + @Id + @Column(length = 50) + private String name; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof Authority)) { + return false; + } + return Objects.equals(name, ((Authority) o).name); + } + + @Override + public int hashCode() { + return Objects.hashCode(name); + } + + // prettier-ignore + @Override + public String toString() { + return "Authority{" + + "name='" + name + '\'' + + "}"; + } +} diff --git a/src/main/java/org/datasurvey/domain/Categoria.java b/src/main/java/org/datasurvey/domain/Categoria.java new file mode 100644 index 0000000..a2a2ff8 --- /dev/null +++ b/src/main/java/org/datasurvey/domain/Categoria.java @@ -0,0 +1,179 @@ +package org.datasurvey.domain; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import java.io.Serializable; +import java.util.HashSet; +import java.util.Set; +import javax.persistence.*; +import javax.validation.constraints.*; +import org.datasurvey.domain.enumeration.EstadoCategoria; +import org.hibernate.annotations.Cache; +import org.hibernate.annotations.CacheConcurrencyStrategy; + +/** + * A Categoria. + */ +@Entity +@Table(name = "categoria") +@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) +public class Categoria implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @NotNull + @Column(name = "nombre", nullable = false) + private String nombre; + + @NotNull + @Enumerated(EnumType.STRING) + @Column(name = "estado", nullable = false) + private EstadoCategoria estado; + + @OneToMany(mappedBy = "categoria") + @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) + @JsonIgnoreProperties( + value = { "usuarioEncuestas", "ePreguntaAbiertas", "ePreguntaCerradas", "categoria", "usuarioExtra" }, + allowSetters = true + ) + private Set encuestas = new HashSet<>(); + + @OneToMany(mappedBy = "categoria") + @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) + @JsonIgnoreProperties(value = { "pPreguntaCerradas", "pPreguntaAbiertas", "categoria", "usuarioExtras" }, allowSetters = true) + private Set plantillas = new HashSet<>(); + + // jhipster-needle-entity-add-field - JHipster will add fields here + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Categoria id(Long id) { + this.id = id; + return this; + } + + public String getNombre() { + return this.nombre; + } + + public Categoria nombre(String nombre) { + this.nombre = nombre; + return this; + } + + public void setNombre(String nombre) { + this.nombre = nombre; + } + + public EstadoCategoria getEstado() { + return this.estado; + } + + public Categoria estado(EstadoCategoria estado) { + this.estado = estado; + return this; + } + + public void setEstado(EstadoCategoria estado) { + this.estado = estado; + } + + public Set getEncuestas() { + return this.encuestas; + } + + public Categoria encuestas(Set encuestas) { + this.setEncuestas(encuestas); + return this; + } + + public Categoria addEncuesta(Encuesta encuesta) { + this.encuestas.add(encuesta); + encuesta.setCategoria(this); + return this; + } + + public Categoria removeEncuesta(Encuesta encuesta) { + this.encuestas.remove(encuesta); + encuesta.setCategoria(null); + return this; + } + + public void setEncuestas(Set encuestas) { + if (this.encuestas != null) { + this.encuestas.forEach(i -> i.setCategoria(null)); + } + if (encuestas != null) { + encuestas.forEach(i -> i.setCategoria(this)); + } + this.encuestas = encuestas; + } + + public Set getPlantillas() { + return this.plantillas; + } + + public Categoria plantillas(Set plantillas) { + this.setPlantillas(plantillas); + return this; + } + + public Categoria addPlantilla(Plantilla plantilla) { + this.plantillas.add(plantilla); + plantilla.setCategoria(this); + return this; + } + + public Categoria removePlantilla(Plantilla plantilla) { + this.plantillas.remove(plantilla); + plantilla.setCategoria(null); + return this; + } + + public void setPlantillas(Set plantillas) { + if (this.plantillas != null) { + this.plantillas.forEach(i -> i.setCategoria(null)); + } + if (plantillas != null) { + plantillas.forEach(i -> i.setCategoria(this)); + } + this.plantillas = plantillas; + } + + // jhipster-needle-entity-add-getters-setters - JHipster will add getters and setters here + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof Categoria)) { + return false; + } + return id != null && id.equals(((Categoria) o).id); + } + + @Override + public int hashCode() { + // see https://vladmihalcea.com/how-to-implement-equals-and-hashcode-using-the-jpa-entity-identifier/ + return getClass().hashCode(); + } + + // prettier-ignore + @Override + public String toString() { + return "Categoria{" + + "id=" + getId() + + ", nombre='" + getNombre() + "'" + + ", estado='" + getEstado() + "'" + + "}"; + } +} diff --git a/src/main/java/org/datasurvey/domain/EPreguntaAbierta.java b/src/main/java/org/datasurvey/domain/EPreguntaAbierta.java new file mode 100644 index 0000000..be07bcc --- /dev/null +++ b/src/main/java/org/datasurvey/domain/EPreguntaAbierta.java @@ -0,0 +1,177 @@ +package org.datasurvey.domain; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import java.io.Serializable; +import java.util.HashSet; +import java.util.Set; +import javax.persistence.*; +import javax.validation.constraints.*; +import org.hibernate.annotations.Cache; +import org.hibernate.annotations.CacheConcurrencyStrategy; + +/** + * A EPreguntaAbierta. + */ +@Entity +@Table(name = "e_pregunta_abierta") +@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) +public class EPreguntaAbierta implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @NotNull + @Size(min = 1, max = 500) + @Column(name = "nombre", length = 500, nullable = false) + private String nombre; + + @NotNull + @Column(name = "opcional", nullable = false) + private Boolean opcional; + + @NotNull + @Column(name = "orden", nullable = false) + private Integer orden; + + @OneToMany(mappedBy = "ePreguntaAbierta") + @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) + @JsonIgnoreProperties(value = { "ePreguntaAbierta" }, allowSetters = true) + private Set ePreguntaAbiertaRespuestas = new HashSet<>(); + + @ManyToOne + @JsonIgnoreProperties( + value = { "usuarioEncuestas", "ePreguntaAbiertas", "ePreguntaCerradas", "categoria", "usuarioExtra" }, + allowSetters = true + ) + private Encuesta encuesta; + + // jhipster-needle-entity-add-field - JHipster will add fields here + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public EPreguntaAbierta id(Long id) { + this.id = id; + return this; + } + + public String getNombre() { + return this.nombre; + } + + public EPreguntaAbierta nombre(String nombre) { + this.nombre = nombre; + return this; + } + + public void setNombre(String nombre) { + this.nombre = nombre; + } + + public Boolean getOpcional() { + return this.opcional; + } + + public EPreguntaAbierta opcional(Boolean opcional) { + this.opcional = opcional; + return this; + } + + public void setOpcional(Boolean opcional) { + this.opcional = opcional; + } + + public Integer getOrden() { + return this.orden; + } + + public EPreguntaAbierta orden(Integer orden) { + this.orden = orden; + return this; + } + + public void setOrden(Integer orden) { + this.orden = orden; + } + + public Set getEPreguntaAbiertaRespuestas() { + return this.ePreguntaAbiertaRespuestas; + } + + public EPreguntaAbierta ePreguntaAbiertaRespuestas(Set ePreguntaAbiertaRespuestas) { + this.setEPreguntaAbiertaRespuestas(ePreguntaAbiertaRespuestas); + return this; + } + + public EPreguntaAbierta addEPreguntaAbiertaRespuesta(EPreguntaAbiertaRespuesta ePreguntaAbiertaRespuesta) { + this.ePreguntaAbiertaRespuestas.add(ePreguntaAbiertaRespuesta); + ePreguntaAbiertaRespuesta.setEPreguntaAbierta(this); + return this; + } + + public EPreguntaAbierta removeEPreguntaAbiertaRespuesta(EPreguntaAbiertaRespuesta ePreguntaAbiertaRespuesta) { + this.ePreguntaAbiertaRespuestas.remove(ePreguntaAbiertaRespuesta); + ePreguntaAbiertaRespuesta.setEPreguntaAbierta(null); + return this; + } + + public void setEPreguntaAbiertaRespuestas(Set ePreguntaAbiertaRespuestas) { + if (this.ePreguntaAbiertaRespuestas != null) { + this.ePreguntaAbiertaRespuestas.forEach(i -> i.setEPreguntaAbierta(null)); + } + if (ePreguntaAbiertaRespuestas != null) { + ePreguntaAbiertaRespuestas.forEach(i -> i.setEPreguntaAbierta(this)); + } + this.ePreguntaAbiertaRespuestas = ePreguntaAbiertaRespuestas; + } + + public Encuesta getEncuesta() { + return this.encuesta; + } + + public EPreguntaAbierta encuesta(Encuesta encuesta) { + this.setEncuesta(encuesta); + return this; + } + + public void setEncuesta(Encuesta encuesta) { + this.encuesta = encuesta; + } + + // jhipster-needle-entity-add-getters-setters - JHipster will add getters and setters here + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof EPreguntaAbierta)) { + return false; + } + return id != null && id.equals(((EPreguntaAbierta) o).id); + } + + @Override + public int hashCode() { + // see https://vladmihalcea.com/how-to-implement-equals-and-hashcode-using-the-jpa-entity-identifier/ + return getClass().hashCode(); + } + + // prettier-ignore + @Override + public String toString() { + return "EPreguntaAbierta{" + + "id=" + getId() + + ", nombre='" + getNombre() + "'" + + ", opcional='" + getOpcional() + "'" + + ", orden=" + getOrden() + + "}"; + } +} diff --git a/src/main/java/org/datasurvey/domain/EPreguntaAbiertaRespuesta.java b/src/main/java/org/datasurvey/domain/EPreguntaAbiertaRespuesta.java new file mode 100644 index 0000000..4fe4b57 --- /dev/null +++ b/src/main/java/org/datasurvey/domain/EPreguntaAbiertaRespuesta.java @@ -0,0 +1,99 @@ +package org.datasurvey.domain; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import java.io.Serializable; +import javax.persistence.*; +import javax.validation.constraints.*; +import org.hibernate.annotations.Cache; +import org.hibernate.annotations.CacheConcurrencyStrategy; + +/** + * A EPreguntaAbiertaRespuesta. + */ +@Entity +@Table(name = "e_pregunta_abierta_respuesta") +@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) +public class EPreguntaAbiertaRespuesta implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @NotNull + @Column(name = "respuesta", nullable = false) + private String respuesta; + + @ManyToOne + @JsonIgnoreProperties(value = { "ePreguntaAbiertaRespuestas", "encuesta" }, allowSetters = true) + private EPreguntaAbierta ePreguntaAbierta; + + // jhipster-needle-entity-add-field - JHipster will add fields here + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public EPreguntaAbiertaRespuesta id(Long id) { + this.id = id; + return this; + } + + public String getRespuesta() { + return this.respuesta; + } + + public EPreguntaAbiertaRespuesta respuesta(String respuesta) { + this.respuesta = respuesta; + return this; + } + + public void setRespuesta(String respuesta) { + this.respuesta = respuesta; + } + + public EPreguntaAbierta getEPreguntaAbierta() { + return this.ePreguntaAbierta; + } + + public EPreguntaAbiertaRespuesta ePreguntaAbierta(EPreguntaAbierta ePreguntaAbierta) { + this.setEPreguntaAbierta(ePreguntaAbierta); + return this; + } + + public void setEPreguntaAbierta(EPreguntaAbierta ePreguntaAbierta) { + this.ePreguntaAbierta = ePreguntaAbierta; + } + + // jhipster-needle-entity-add-getters-setters - JHipster will add getters and setters here + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof EPreguntaAbiertaRespuesta)) { + return false; + } + return id != null && id.equals(((EPreguntaAbiertaRespuesta) o).id); + } + + @Override + public int hashCode() { + // see https://vladmihalcea.com/how-to-implement-equals-and-hashcode-using-the-jpa-entity-identifier/ + return getClass().hashCode(); + } + + // prettier-ignore + @Override + public String toString() { + return "EPreguntaAbiertaRespuesta{" + + "id=" + getId() + + ", respuesta='" + getRespuesta() + "'" + + "}"; + } +} diff --git a/src/main/java/org/datasurvey/domain/EPreguntaCerrada.java b/src/main/java/org/datasurvey/domain/EPreguntaCerrada.java new file mode 100644 index 0000000..d0c49d9 --- /dev/null +++ b/src/main/java/org/datasurvey/domain/EPreguntaCerrada.java @@ -0,0 +1,197 @@ +package org.datasurvey.domain; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import java.io.Serializable; +import java.util.HashSet; +import java.util.Set; +import javax.persistence.*; +import javax.validation.constraints.*; +import org.datasurvey.domain.enumeration.PreguntaCerradaTipo; +import org.hibernate.annotations.Cache; +import org.hibernate.annotations.CacheConcurrencyStrategy; + +/** + * A EPreguntaCerrada. + */ +@Entity +@Table(name = "e_pregunta_cerrada") +@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) +public class EPreguntaCerrada implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @NotNull + @Size(min = 1, max = 500) + @Column(name = "nombre", length = 500, nullable = false) + private String nombre; + + @NotNull + @Enumerated(EnumType.STRING) + @Column(name = "tipo", nullable = false) + private PreguntaCerradaTipo tipo; + + @NotNull + @Column(name = "opcional", nullable = false) + private Boolean opcional; + + @NotNull + @Column(name = "orden", nullable = false) + private Integer orden; + + @OneToMany(mappedBy = "ePreguntaCerrada") + @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) + @JsonIgnoreProperties(value = { "ePreguntaCerrada" }, allowSetters = true) + private Set ePreguntaCerradaOpcions = new HashSet<>(); + + @ManyToOne + @JsonIgnoreProperties( + value = { "usuarioEncuestas", "ePreguntaAbiertas", "ePreguntaCerradas", "categoria", "usuarioExtra" }, + allowSetters = true + ) + private Encuesta encuesta; + + // jhipster-needle-entity-add-field - JHipster will add fields here + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public EPreguntaCerrada id(Long id) { + this.id = id; + return this; + } + + public String getNombre() { + return this.nombre; + } + + public EPreguntaCerrada nombre(String nombre) { + this.nombre = nombre; + return this; + } + + public void setNombre(String nombre) { + this.nombre = nombre; + } + + public PreguntaCerradaTipo getTipo() { + return this.tipo; + } + + public EPreguntaCerrada tipo(PreguntaCerradaTipo tipo) { + this.tipo = tipo; + return this; + } + + public void setTipo(PreguntaCerradaTipo tipo) { + this.tipo = tipo; + } + + public Boolean getOpcional() { + return this.opcional; + } + + public EPreguntaCerrada opcional(Boolean opcional) { + this.opcional = opcional; + return this; + } + + public void setOpcional(Boolean opcional) { + this.opcional = opcional; + } + + public Integer getOrden() { + return this.orden; + } + + public EPreguntaCerrada orden(Integer orden) { + this.orden = orden; + return this; + } + + public void setOrden(Integer orden) { + this.orden = orden; + } + + public Set getEPreguntaCerradaOpcions() { + return this.ePreguntaCerradaOpcions; + } + + public EPreguntaCerrada ePreguntaCerradaOpcions(Set ePreguntaCerradaOpcions) { + this.setEPreguntaCerradaOpcions(ePreguntaCerradaOpcions); + return this; + } + + public EPreguntaCerrada addEPreguntaCerradaOpcion(EPreguntaCerradaOpcion ePreguntaCerradaOpcion) { + this.ePreguntaCerradaOpcions.add(ePreguntaCerradaOpcion); + ePreguntaCerradaOpcion.setEPreguntaCerrada(this); + return this; + } + + public EPreguntaCerrada removeEPreguntaCerradaOpcion(EPreguntaCerradaOpcion ePreguntaCerradaOpcion) { + this.ePreguntaCerradaOpcions.remove(ePreguntaCerradaOpcion); + ePreguntaCerradaOpcion.setEPreguntaCerrada(null); + return this; + } + + public void setEPreguntaCerradaOpcions(Set ePreguntaCerradaOpcions) { + if (this.ePreguntaCerradaOpcions != null) { + this.ePreguntaCerradaOpcions.forEach(i -> i.setEPreguntaCerrada(null)); + } + if (ePreguntaCerradaOpcions != null) { + ePreguntaCerradaOpcions.forEach(i -> i.setEPreguntaCerrada(this)); + } + this.ePreguntaCerradaOpcions = ePreguntaCerradaOpcions; + } + + public Encuesta getEncuesta() { + return this.encuesta; + } + + public EPreguntaCerrada encuesta(Encuesta encuesta) { + this.setEncuesta(encuesta); + return this; + } + + public void setEncuesta(Encuesta encuesta) { + this.encuesta = encuesta; + } + + // jhipster-needle-entity-add-getters-setters - JHipster will add getters and setters here + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof EPreguntaCerrada)) { + return false; + } + return id != null && id.equals(((EPreguntaCerrada) o).id); + } + + @Override + public int hashCode() { + // see https://vladmihalcea.com/how-to-implement-equals-and-hashcode-using-the-jpa-entity-identifier/ + return getClass().hashCode(); + } + + // prettier-ignore + @Override + public String toString() { + return "EPreguntaCerrada{" + + "id=" + getId() + + ", nombre='" + getNombre() + "'" + + ", tipo='" + getTipo() + "'" + + ", opcional='" + getOpcional() + "'" + + ", orden=" + getOrden() + + "}"; + } +} diff --git a/src/main/java/org/datasurvey/domain/EPreguntaCerradaOpcion.java b/src/main/java/org/datasurvey/domain/EPreguntaCerradaOpcion.java new file mode 100644 index 0000000..3cccb95 --- /dev/null +++ b/src/main/java/org/datasurvey/domain/EPreguntaCerradaOpcion.java @@ -0,0 +1,136 @@ +package org.datasurvey.domain; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import java.io.Serializable; +import javax.persistence.*; +import javax.validation.constraints.*; +import org.hibernate.annotations.Cache; +import org.hibernate.annotations.CacheConcurrencyStrategy; + +/** + * A EPreguntaCerradaOpcion. + */ +@Entity +@Table(name = "e_pregunta_cerrada_opcion") +@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) +public class EPreguntaCerradaOpcion implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @NotNull + @Size(min = 1, max = 500) + @Column(name = "nombre", length = 500, nullable = false) + private String nombre; + + @NotNull + @Column(name = "orden", nullable = false) + private Integer orden; + + @NotNull + @Column(name = "cantidad", nullable = false) + private Integer cantidad; + + @ManyToOne + @JsonIgnoreProperties(value = { "ePreguntaCerradaOpcions", "encuesta" }, allowSetters = true) + private EPreguntaCerrada ePreguntaCerrada; + + // jhipster-needle-entity-add-field - JHipster will add fields here + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public EPreguntaCerradaOpcion id(Long id) { + this.id = id; + return this; + } + + public String getNombre() { + return this.nombre; + } + + public EPreguntaCerradaOpcion nombre(String nombre) { + this.nombre = nombre; + return this; + } + + public void setNombre(String nombre) { + this.nombre = nombre; + } + + public Integer getOrden() { + return this.orden; + } + + public EPreguntaCerradaOpcion orden(Integer orden) { + this.orden = orden; + return this; + } + + public void setOrden(Integer orden) { + this.orden = orden; + } + + public Integer getCantidad() { + return this.cantidad; + } + + public EPreguntaCerradaOpcion cantidad(Integer cantidad) { + this.cantidad = cantidad; + return this; + } + + public void setCantidad(Integer cantidad) { + this.cantidad = cantidad; + } + + public EPreguntaCerrada getEPreguntaCerrada() { + return this.ePreguntaCerrada; + } + + public EPreguntaCerradaOpcion ePreguntaCerrada(EPreguntaCerrada ePreguntaCerrada) { + this.setEPreguntaCerrada(ePreguntaCerrada); + return this; + } + + public void setEPreguntaCerrada(EPreguntaCerrada ePreguntaCerrada) { + this.ePreguntaCerrada = ePreguntaCerrada; + } + + // jhipster-needle-entity-add-getters-setters - JHipster will add getters and setters here + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof EPreguntaCerradaOpcion)) { + return false; + } + return id != null && id.equals(((EPreguntaCerradaOpcion) o).id); + } + + @Override + public int hashCode() { + // see https://vladmihalcea.com/how-to-implement-equals-and-hashcode-using-the-jpa-entity-identifier/ + return getClass().hashCode(); + } + + // prettier-ignore + @Override + public String toString() { + return "EPreguntaCerradaOpcion{" + + "id=" + getId() + + ", nombre='" + getNombre() + "'" + + ", orden=" + getOrden() + + ", cantidad=" + getCantidad() + + "}"; + } +} diff --git a/src/main/java/org/datasurvey/domain/Encuesta.java b/src/main/java/org/datasurvey/domain/Encuesta.java new file mode 100644 index 0000000..b2532c6 --- /dev/null +++ b/src/main/java/org/datasurvey/domain/Encuesta.java @@ -0,0 +1,389 @@ +package org.datasurvey.domain; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import java.io.Serializable; +import java.time.ZonedDateTime; +import java.util.HashSet; +import java.util.Set; +import javax.persistence.*; +import javax.validation.constraints.*; +import org.datasurvey.domain.enumeration.AccesoEncuesta; +import org.datasurvey.domain.enumeration.EstadoEncuesta; +import org.hibernate.annotations.Cache; +import org.hibernate.annotations.CacheConcurrencyStrategy; + +/** + * A Encuesta. + */ +@Entity +@Table(name = "encuesta") +@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) +public class Encuesta implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @NotNull + @Size(min = 1, max = 50) + @Column(name = "nombre", length = 50, nullable = false) + private String nombre; + + @Column(name = "descripcion") + private String descripcion; + + @NotNull + @Column(name = "fecha_creacion", nullable = false) + private ZonedDateTime fechaCreacion; + + @Column(name = "fecha_publicacion") + private ZonedDateTime fechaPublicacion; + + @Column(name = "fecha_finalizar") + private ZonedDateTime fechaFinalizar; + + @Column(name = "fecha_finalizada") + private ZonedDateTime fechaFinalizada; + + @NotNull + @Column(name = "calificacion", nullable = false) + private Double calificacion; + + @NotNull + @Enumerated(EnumType.STRING) + @Column(name = "acceso", nullable = false) + private AccesoEncuesta acceso; + + @Column(name = "contrasenna") + private String contrasenna; + + @NotNull + @Enumerated(EnumType.STRING) + @Column(name = "estado", nullable = false) + private EstadoEncuesta estado; + + @OneToMany(mappedBy = "encuesta") + @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) + @JsonIgnoreProperties(value = { "usuarioExtra", "encuesta" }, allowSetters = true) + private Set usuarioEncuestas = new HashSet<>(); + + @OneToMany(mappedBy = "encuesta") + @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) + @JsonIgnoreProperties(value = { "ePreguntaAbiertaRespuestas", "encuesta" }, allowSetters = true) + private Set ePreguntaAbiertas = new HashSet<>(); + + @OneToMany(mappedBy = "encuesta") + @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) + @JsonIgnoreProperties(value = { "ePreguntaCerradaOpcions", "encuesta" }, allowSetters = true) + private Set ePreguntaCerradas = new HashSet<>(); + + @ManyToOne + @JsonIgnoreProperties(value = { "encuestas", "plantillas" }, allowSetters = true) + private Categoria categoria; + + @ManyToOne + @JsonIgnoreProperties(value = { "user", "encuestas", "usuarioEncuestas", "plantillas" }, allowSetters = true) + private UsuarioExtra usuarioExtra; + + // jhipster-needle-entity-add-field - JHipster will add fields here + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Encuesta id(Long id) { + this.id = id; + return this; + } + + public String getNombre() { + return this.nombre; + } + + public Encuesta nombre(String nombre) { + this.nombre = nombre; + return this; + } + + public void setNombre(String nombre) { + this.nombre = nombre; + } + + public String getDescripcion() { + return this.descripcion; + } + + public Encuesta descripcion(String descripcion) { + this.descripcion = descripcion; + return this; + } + + public void setDescripcion(String descripcion) { + this.descripcion = descripcion; + } + + public ZonedDateTime getFechaCreacion() { + return this.fechaCreacion; + } + + public Encuesta fechaCreacion(ZonedDateTime fechaCreacion) { + this.fechaCreacion = fechaCreacion; + return this; + } + + public void setFechaCreacion(ZonedDateTime fechaCreacion) { + this.fechaCreacion = fechaCreacion; + } + + public ZonedDateTime getFechaPublicacion() { + return this.fechaPublicacion; + } + + public Encuesta fechaPublicacion(ZonedDateTime fechaPublicacion) { + this.fechaPublicacion = fechaPublicacion; + return this; + } + + public void setFechaPublicacion(ZonedDateTime fechaPublicacion) { + this.fechaPublicacion = fechaPublicacion; + } + + public ZonedDateTime getFechaFinalizar() { + return this.fechaFinalizar; + } + + public Encuesta fechaFinalizar(ZonedDateTime fechaFinalizar) { + this.fechaFinalizar = fechaFinalizar; + return this; + } + + public void setFechaFinalizar(ZonedDateTime fechaFinalizar) { + this.fechaFinalizar = fechaFinalizar; + } + + public ZonedDateTime getFechaFinalizada() { + return this.fechaFinalizada; + } + + public Encuesta fechaFinalizada(ZonedDateTime fechaFinalizada) { + this.fechaFinalizada = fechaFinalizada; + return this; + } + + public void setFechaFinalizada(ZonedDateTime fechaFinalizada) { + this.fechaFinalizada = fechaFinalizada; + } + + public Double getCalificacion() { + return this.calificacion; + } + + public Encuesta calificacion(Double calificacion) { + this.calificacion = calificacion; + return this; + } + + public void setCalificacion(Double calificacion) { + this.calificacion = calificacion; + } + + public AccesoEncuesta getAcceso() { + return this.acceso; + } + + public Encuesta acceso(AccesoEncuesta acceso) { + this.acceso = acceso; + return this; + } + + public void setAcceso(AccesoEncuesta acceso) { + this.acceso = acceso; + } + + public String getContrasenna() { + return this.contrasenna; + } + + public Encuesta contrasenna(String contrasenna) { + this.contrasenna = contrasenna; + return this; + } + + public void setContrasenna(String contrasenna) { + this.contrasenna = contrasenna; + } + + public EstadoEncuesta getEstado() { + return this.estado; + } + + public Encuesta estado(EstadoEncuesta estado) { + this.estado = estado; + return this; + } + + public void setEstado(EstadoEncuesta estado) { + this.estado = estado; + } + + public Set getUsuarioEncuestas() { + return this.usuarioEncuestas; + } + + public Encuesta usuarioEncuestas(Set usuarioEncuestas) { + this.setUsuarioEncuestas(usuarioEncuestas); + return this; + } + + public Encuesta addUsuarioEncuesta(UsuarioEncuesta usuarioEncuesta) { + this.usuarioEncuestas.add(usuarioEncuesta); + usuarioEncuesta.setEncuesta(this); + return this; + } + + public Encuesta removeUsuarioEncuesta(UsuarioEncuesta usuarioEncuesta) { + this.usuarioEncuestas.remove(usuarioEncuesta); + usuarioEncuesta.setEncuesta(null); + return this; + } + + public void setUsuarioEncuestas(Set usuarioEncuestas) { + if (this.usuarioEncuestas != null) { + this.usuarioEncuestas.forEach(i -> i.setEncuesta(null)); + } + if (usuarioEncuestas != null) { + usuarioEncuestas.forEach(i -> i.setEncuesta(this)); + } + this.usuarioEncuestas = usuarioEncuestas; + } + + public Set getEPreguntaAbiertas() { + return this.ePreguntaAbiertas; + } + + public Encuesta ePreguntaAbiertas(Set ePreguntaAbiertas) { + this.setEPreguntaAbiertas(ePreguntaAbiertas); + return this; + } + + public Encuesta addEPreguntaAbierta(EPreguntaAbierta ePreguntaAbierta) { + this.ePreguntaAbiertas.add(ePreguntaAbierta); + ePreguntaAbierta.setEncuesta(this); + return this; + } + + public Encuesta removeEPreguntaAbierta(EPreguntaAbierta ePreguntaAbierta) { + this.ePreguntaAbiertas.remove(ePreguntaAbierta); + ePreguntaAbierta.setEncuesta(null); + return this; + } + + public void setEPreguntaAbiertas(Set ePreguntaAbiertas) { + if (this.ePreguntaAbiertas != null) { + this.ePreguntaAbiertas.forEach(i -> i.setEncuesta(null)); + } + if (ePreguntaAbiertas != null) { + ePreguntaAbiertas.forEach(i -> i.setEncuesta(this)); + } + this.ePreguntaAbiertas = ePreguntaAbiertas; + } + + public Set getEPreguntaCerradas() { + return this.ePreguntaCerradas; + } + + public Encuesta ePreguntaCerradas(Set ePreguntaCerradas) { + this.setEPreguntaCerradas(ePreguntaCerradas); + return this; + } + + public Encuesta addEPreguntaCerrada(EPreguntaCerrada ePreguntaCerrada) { + this.ePreguntaCerradas.add(ePreguntaCerrada); + ePreguntaCerrada.setEncuesta(this); + return this; + } + + public Encuesta removeEPreguntaCerrada(EPreguntaCerrada ePreguntaCerrada) { + this.ePreguntaCerradas.remove(ePreguntaCerrada); + ePreguntaCerrada.setEncuesta(null); + return this; + } + + public void setEPreguntaCerradas(Set ePreguntaCerradas) { + if (this.ePreguntaCerradas != null) { + this.ePreguntaCerradas.forEach(i -> i.setEncuesta(null)); + } + if (ePreguntaCerradas != null) { + ePreguntaCerradas.forEach(i -> i.setEncuesta(this)); + } + this.ePreguntaCerradas = ePreguntaCerradas; + } + + public Categoria getCategoria() { + return this.categoria; + } + + public Encuesta categoria(Categoria categoria) { + this.setCategoria(categoria); + return this; + } + + public void setCategoria(Categoria categoria) { + this.categoria = categoria; + } + + public UsuarioExtra getUsuarioExtra() { + return this.usuarioExtra; + } + + public Encuesta usuarioExtra(UsuarioExtra usuarioExtra) { + this.setUsuarioExtra(usuarioExtra); + return this; + } + + public void setUsuarioExtra(UsuarioExtra usuarioExtra) { + this.usuarioExtra = usuarioExtra; + } + + // jhipster-needle-entity-add-getters-setters - JHipster will add getters and setters here + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof Encuesta)) { + return false; + } + return id != null && id.equals(((Encuesta) o).id); + } + + @Override + public int hashCode() { + // see https://vladmihalcea.com/how-to-implement-equals-and-hashcode-using-the-jpa-entity-identifier/ + return getClass().hashCode(); + } + + // prettier-ignore + @Override + public String toString() { + return "Encuesta{" + + "id=" + getId() + + ", nombre='" + getNombre() + "'" + + ", descripcion='" + getDescripcion() + "'" + + ", fechaCreacion='" + getFechaCreacion() + "'" + + ", fechaPublicacion='" + getFechaPublicacion() + "'" + + ", fechaFinalizar='" + getFechaFinalizar() + "'" + + ", fechaFinalizada='" + getFechaFinalizada() + "'" + + ", calificacion=" + getCalificacion() + + ", acceso='" + getAcceso() + "'" + + ", contrasenna='" + getContrasenna() + "'" + + ", estado='" + getEstado() + "'" + + "}"; + } +} diff --git a/src/main/java/org/datasurvey/domain/Factura.java b/src/main/java/org/datasurvey/domain/Factura.java new file mode 100644 index 0000000..43df411 --- /dev/null +++ b/src/main/java/org/datasurvey/domain/Factura.java @@ -0,0 +1,136 @@ +package org.datasurvey.domain; + +import java.io.Serializable; +import java.time.ZonedDateTime; +import javax.persistence.*; +import javax.validation.constraints.*; +import org.hibernate.annotations.Cache; +import org.hibernate.annotations.CacheConcurrencyStrategy; + +/** + * A Factura. + */ +@Entity +@Table(name = "factura") +@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) +public class Factura implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @NotNull + @Column(name = "nombre_usuario", nullable = false) + private String nombreUsuario; + + @NotNull + @Column(name = "nombre_plantilla", nullable = false) + private String nombrePlantilla; + + @NotNull + @Column(name = "costo", nullable = false) + private Double costo; + + @NotNull + @Column(name = "fecha", nullable = false) + private ZonedDateTime fecha; + + // jhipster-needle-entity-add-field - JHipster will add fields here + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Factura id(Long id) { + this.id = id; + return this; + } + + public String getNombreUsuario() { + return this.nombreUsuario; + } + + public Factura nombreUsuario(String nombreUsuario) { + this.nombreUsuario = nombreUsuario; + return this; + } + + public void setNombreUsuario(String nombreUsuario) { + this.nombreUsuario = nombreUsuario; + } + + public String getNombrePlantilla() { + return this.nombrePlantilla; + } + + public Factura nombrePlantilla(String nombrePlantilla) { + this.nombrePlantilla = nombrePlantilla; + return this; + } + + public void setNombrePlantilla(String nombrePlantilla) { + this.nombrePlantilla = nombrePlantilla; + } + + public Double getCosto() { + return this.costo; + } + + public Factura costo(Double costo) { + this.costo = costo; + return this; + } + + public void setCosto(Double costo) { + this.costo = costo; + } + + public ZonedDateTime getFecha() { + return this.fecha; + } + + public Factura fecha(ZonedDateTime fecha) { + this.fecha = fecha; + return this; + } + + public void setFecha(ZonedDateTime fecha) { + this.fecha = fecha; + } + + // jhipster-needle-entity-add-getters-setters - JHipster will add getters and setters here + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof Factura)) { + return false; + } + return id != null && id.equals(((Factura) o).id); + } + + @Override + public int hashCode() { + // see https://vladmihalcea.com/how-to-implement-equals-and-hashcode-using-the-jpa-entity-identifier/ + return getClass().hashCode(); + } + + // prettier-ignore + @Override + public String toString() { + return "Factura{" + + "id=" + getId() + + ", nombreUsuario='" + getNombreUsuario() + "'" + + ", nombrePlantilla='" + getNombrePlantilla() + "'" + + ", costo=" + getCosto() + + ", fecha='" + getFecha() + "'" + + "}"; + } +} diff --git a/src/main/java/org/datasurvey/domain/PPreguntaAbierta.java b/src/main/java/org/datasurvey/domain/PPreguntaAbierta.java new file mode 100644 index 0000000..926b934 --- /dev/null +++ b/src/main/java/org/datasurvey/domain/PPreguntaAbierta.java @@ -0,0 +1,136 @@ +package org.datasurvey.domain; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import java.io.Serializable; +import javax.persistence.*; +import javax.validation.constraints.*; +import org.hibernate.annotations.Cache; +import org.hibernate.annotations.CacheConcurrencyStrategy; + +/** + * A PPreguntaAbierta. + */ +@Entity +@Table(name = "p_pregunta_abierta") +@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) +public class PPreguntaAbierta implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @NotNull + @Size(min = 1, max = 500) + @Column(name = "nombre", length = 500, nullable = false) + private String nombre; + + @NotNull + @Column(name = "opcional", nullable = false) + private Boolean opcional; + + @NotNull + @Column(name = "orden", nullable = false) + private Integer orden; + + @ManyToOne + @JsonIgnoreProperties(value = { "pPreguntaCerradas", "pPreguntaAbiertas", "categoria", "usuarioExtras" }, allowSetters = true) + private Plantilla plantilla; + + // jhipster-needle-entity-add-field - JHipster will add fields here + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public PPreguntaAbierta id(Long id) { + this.id = id; + return this; + } + + public String getNombre() { + return this.nombre; + } + + public PPreguntaAbierta nombre(String nombre) { + this.nombre = nombre; + return this; + } + + public void setNombre(String nombre) { + this.nombre = nombre; + } + + public Boolean getOpcional() { + return this.opcional; + } + + public PPreguntaAbierta opcional(Boolean opcional) { + this.opcional = opcional; + return this; + } + + public void setOpcional(Boolean opcional) { + this.opcional = opcional; + } + + public Integer getOrden() { + return this.orden; + } + + public PPreguntaAbierta orden(Integer orden) { + this.orden = orden; + return this; + } + + public void setOrden(Integer orden) { + this.orden = orden; + } + + public Plantilla getPlantilla() { + return this.plantilla; + } + + public PPreguntaAbierta plantilla(Plantilla plantilla) { + this.setPlantilla(plantilla); + return this; + } + + public void setPlantilla(Plantilla plantilla) { + this.plantilla = plantilla; + } + + // jhipster-needle-entity-add-getters-setters - JHipster will add getters and setters here + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof PPreguntaAbierta)) { + return false; + } + return id != null && id.equals(((PPreguntaAbierta) o).id); + } + + @Override + public int hashCode() { + // see https://vladmihalcea.com/how-to-implement-equals-and-hashcode-using-the-jpa-entity-identifier/ + return getClass().hashCode(); + } + + // prettier-ignore + @Override + public String toString() { + return "PPreguntaAbierta{" + + "id=" + getId() + + ", nombre='" + getNombre() + "'" + + ", opcional='" + getOpcional() + "'" + + ", orden=" + getOrden() + + "}"; + } +} diff --git a/src/main/java/org/datasurvey/domain/PPreguntaCerrada.java b/src/main/java/org/datasurvey/domain/PPreguntaCerrada.java new file mode 100644 index 0000000..21f4b8a --- /dev/null +++ b/src/main/java/org/datasurvey/domain/PPreguntaCerrada.java @@ -0,0 +1,194 @@ +package org.datasurvey.domain; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import java.io.Serializable; +import java.util.HashSet; +import java.util.Set; +import javax.persistence.*; +import javax.validation.constraints.*; +import org.datasurvey.domain.enumeration.PreguntaCerradaTipo; +import org.hibernate.annotations.Cache; +import org.hibernate.annotations.CacheConcurrencyStrategy; + +/** + * A PPreguntaCerrada. + */ +@Entity +@Table(name = "p_pregunta_cerrada") +@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) +public class PPreguntaCerrada implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @NotNull + @Size(min = 1, max = 500) + @Column(name = "nombre", length = 500, nullable = false) + private String nombre; + + @NotNull + @Enumerated(EnumType.STRING) + @Column(name = "tipo", nullable = false) + private PreguntaCerradaTipo tipo; + + @NotNull + @Column(name = "opcional", nullable = false) + private Boolean opcional; + + @NotNull + @Column(name = "orden", nullable = false) + private Integer orden; + + @OneToMany(mappedBy = "pPreguntaCerrada") + @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) + @JsonIgnoreProperties(value = { "pPreguntaCerrada" }, allowSetters = true) + private Set pPreguntaCerradaOpcions = new HashSet<>(); + + @ManyToOne + @JsonIgnoreProperties(value = { "pPreguntaCerradas", "pPreguntaAbiertas", "categoria", "usuarioExtras" }, allowSetters = true) + private Plantilla plantilla; + + // jhipster-needle-entity-add-field - JHipster will add fields here + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public PPreguntaCerrada id(Long id) { + this.id = id; + return this; + } + + public String getNombre() { + return this.nombre; + } + + public PPreguntaCerrada nombre(String nombre) { + this.nombre = nombre; + return this; + } + + public void setNombre(String nombre) { + this.nombre = nombre; + } + + public PreguntaCerradaTipo getTipo() { + return this.tipo; + } + + public PPreguntaCerrada tipo(PreguntaCerradaTipo tipo) { + this.tipo = tipo; + return this; + } + + public void setTipo(PreguntaCerradaTipo tipo) { + this.tipo = tipo; + } + + public Boolean getOpcional() { + return this.opcional; + } + + public PPreguntaCerrada opcional(Boolean opcional) { + this.opcional = opcional; + return this; + } + + public void setOpcional(Boolean opcional) { + this.opcional = opcional; + } + + public Integer getOrden() { + return this.orden; + } + + public PPreguntaCerrada orden(Integer orden) { + this.orden = orden; + return this; + } + + public void setOrden(Integer orden) { + this.orden = orden; + } + + public Set getPPreguntaCerradaOpcions() { + return this.pPreguntaCerradaOpcions; + } + + public PPreguntaCerrada pPreguntaCerradaOpcions(Set pPreguntaCerradaOpcions) { + this.setPPreguntaCerradaOpcions(pPreguntaCerradaOpcions); + return this; + } + + public PPreguntaCerrada addPPreguntaCerradaOpcion(PPreguntaCerradaOpcion pPreguntaCerradaOpcion) { + this.pPreguntaCerradaOpcions.add(pPreguntaCerradaOpcion); + pPreguntaCerradaOpcion.setPPreguntaCerrada(this); + return this; + } + + public PPreguntaCerrada removePPreguntaCerradaOpcion(PPreguntaCerradaOpcion pPreguntaCerradaOpcion) { + this.pPreguntaCerradaOpcions.remove(pPreguntaCerradaOpcion); + pPreguntaCerradaOpcion.setPPreguntaCerrada(null); + return this; + } + + public void setPPreguntaCerradaOpcions(Set pPreguntaCerradaOpcions) { + if (this.pPreguntaCerradaOpcions != null) { + this.pPreguntaCerradaOpcions.forEach(i -> i.setPPreguntaCerrada(null)); + } + if (pPreguntaCerradaOpcions != null) { + pPreguntaCerradaOpcions.forEach(i -> i.setPPreguntaCerrada(this)); + } + this.pPreguntaCerradaOpcions = pPreguntaCerradaOpcions; + } + + public Plantilla getPlantilla() { + return this.plantilla; + } + + public PPreguntaCerrada plantilla(Plantilla plantilla) { + this.setPlantilla(plantilla); + return this; + } + + public void setPlantilla(Plantilla plantilla) { + this.plantilla = plantilla; + } + + // jhipster-needle-entity-add-getters-setters - JHipster will add getters and setters here + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof PPreguntaCerrada)) { + return false; + } + return id != null && id.equals(((PPreguntaCerrada) o).id); + } + + @Override + public int hashCode() { + // see https://vladmihalcea.com/how-to-implement-equals-and-hashcode-using-the-jpa-entity-identifier/ + return getClass().hashCode(); + } + + // prettier-ignore + @Override + public String toString() { + return "PPreguntaCerrada{" + + "id=" + getId() + + ", nombre='" + getNombre() + "'" + + ", tipo='" + getTipo() + "'" + + ", opcional='" + getOpcional() + "'" + + ", orden=" + getOrden() + + "}"; + } +} diff --git a/src/main/java/org/datasurvey/domain/PPreguntaCerradaOpcion.java b/src/main/java/org/datasurvey/domain/PPreguntaCerradaOpcion.java new file mode 100644 index 0000000..162eaa7 --- /dev/null +++ b/src/main/java/org/datasurvey/domain/PPreguntaCerradaOpcion.java @@ -0,0 +1,118 @@ +package org.datasurvey.domain; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import java.io.Serializable; +import javax.persistence.*; +import javax.validation.constraints.*; +import org.hibernate.annotations.Cache; +import org.hibernate.annotations.CacheConcurrencyStrategy; + +/** + * A PPreguntaCerradaOpcion. + */ +@Entity +@Table(name = "p_pregunta_cerrada_opcion") +@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) +public class PPreguntaCerradaOpcion implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @NotNull + @Size(min = 1, max = 500) + @Column(name = "nombre", length = 500, nullable = false) + private String nombre; + + @NotNull + @Column(name = "orden", nullable = false) + private Integer orden; + + @ManyToOne + @JsonIgnoreProperties(value = { "pPreguntaCerradaOpcions", "plantilla" }, allowSetters = true) + private PPreguntaCerrada pPreguntaCerrada; + + // jhipster-needle-entity-add-field - JHipster will add fields here + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public PPreguntaCerradaOpcion id(Long id) { + this.id = id; + return this; + } + + public String getNombre() { + return this.nombre; + } + + public PPreguntaCerradaOpcion nombre(String nombre) { + this.nombre = nombre; + return this; + } + + public void setNombre(String nombre) { + this.nombre = nombre; + } + + public Integer getOrden() { + return this.orden; + } + + public PPreguntaCerradaOpcion orden(Integer orden) { + this.orden = orden; + return this; + } + + public void setOrden(Integer orden) { + this.orden = orden; + } + + public PPreguntaCerrada getPPreguntaCerrada() { + return this.pPreguntaCerrada; + } + + public PPreguntaCerradaOpcion pPreguntaCerrada(PPreguntaCerrada pPreguntaCerrada) { + this.setPPreguntaCerrada(pPreguntaCerrada); + return this; + } + + public void setPPreguntaCerrada(PPreguntaCerrada pPreguntaCerrada) { + this.pPreguntaCerrada = pPreguntaCerrada; + } + + // jhipster-needle-entity-add-getters-setters - JHipster will add getters and setters here + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof PPreguntaCerradaOpcion)) { + return false; + } + return id != null && id.equals(((PPreguntaCerradaOpcion) o).id); + } + + @Override + public int hashCode() { + // see https://vladmihalcea.com/how-to-implement-equals-and-hashcode-using-the-jpa-entity-identifier/ + return getClass().hashCode(); + } + + // prettier-ignore + @Override + public String toString() { + return "PPreguntaCerradaOpcion{" + + "id=" + getId() + + ", nombre='" + getNombre() + "'" + + ", orden=" + getOrden() + + "}"; + } +} diff --git a/src/main/java/org/datasurvey/domain/ParametroAplicacion.java b/src/main/java/org/datasurvey/domain/ParametroAplicacion.java new file mode 100644 index 0000000..ceb3ccb --- /dev/null +++ b/src/main/java/org/datasurvey/domain/ParametroAplicacion.java @@ -0,0 +1,135 @@ +package org.datasurvey.domain; + +import java.io.Serializable; +import javax.persistence.*; +import javax.validation.constraints.*; +import org.hibernate.annotations.Cache; +import org.hibernate.annotations.CacheConcurrencyStrategy; + +/** + * A ParametroAplicacion. + */ +@Entity +@Table(name = "parametro_aplicacion") +@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) +public class ParametroAplicacion implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @NotNull + @Column(name = "max_dias_encuesta", nullable = false) + private Integer maxDiasEncuesta; + + @NotNull + @Column(name = "min_dias_encuesta", nullable = false) + private Integer minDiasEncuesta; + + @NotNull + @Column(name = "max_cantidad_preguntas", nullable = false) + private Integer maxCantidadPreguntas; + + @NotNull + @Column(name = "min_cantidad_preguntas", nullable = false) + private Integer minCantidadPreguntas; + + // jhipster-needle-entity-add-field - JHipster will add fields here + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public ParametroAplicacion id(Long id) { + this.id = id; + return this; + } + + public Integer getMaxDiasEncuesta() { + return this.maxDiasEncuesta; + } + + public ParametroAplicacion maxDiasEncuesta(Integer maxDiasEncuesta) { + this.maxDiasEncuesta = maxDiasEncuesta; + return this; + } + + public void setMaxDiasEncuesta(Integer maxDiasEncuesta) { + this.maxDiasEncuesta = maxDiasEncuesta; + } + + public Integer getMinDiasEncuesta() { + return this.minDiasEncuesta; + } + + public ParametroAplicacion minDiasEncuesta(Integer minDiasEncuesta) { + this.minDiasEncuesta = minDiasEncuesta; + return this; + } + + public void setMinDiasEncuesta(Integer minDiasEncuesta) { + this.minDiasEncuesta = minDiasEncuesta; + } + + public Integer getMaxCantidadPreguntas() { + return this.maxCantidadPreguntas; + } + + public ParametroAplicacion maxCantidadPreguntas(Integer maxCantidadPreguntas) { + this.maxCantidadPreguntas = maxCantidadPreguntas; + return this; + } + + public void setMaxCantidadPreguntas(Integer maxCantidadPreguntas) { + this.maxCantidadPreguntas = maxCantidadPreguntas; + } + + public Integer getMinCantidadPreguntas() { + return this.minCantidadPreguntas; + } + + public ParametroAplicacion minCantidadPreguntas(Integer minCantidadPreguntas) { + this.minCantidadPreguntas = minCantidadPreguntas; + return this; + } + + public void setMinCantidadPreguntas(Integer minCantidadPreguntas) { + this.minCantidadPreguntas = minCantidadPreguntas; + } + + // jhipster-needle-entity-add-getters-setters - JHipster will add getters and setters here + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof ParametroAplicacion)) { + return false; + } + return id != null && id.equals(((ParametroAplicacion) o).id); + } + + @Override + public int hashCode() { + // see https://vladmihalcea.com/how-to-implement-equals-and-hashcode-using-the-jpa-entity-identifier/ + return getClass().hashCode(); + } + + // prettier-ignore + @Override + public String toString() { + return "ParametroAplicacion{" + + "id=" + getId() + + ", maxDiasEncuesta=" + getMaxDiasEncuesta() + + ", minDiasEncuesta=" + getMinDiasEncuesta() + + ", maxCantidadPreguntas=" + getMaxCantidadPreguntas() + + ", minCantidadPreguntas=" + getMinCantidadPreguntas() + + "}"; + } +} diff --git a/src/main/java/org/datasurvey/domain/Plantilla.java b/src/main/java/org/datasurvey/domain/Plantilla.java new file mode 100644 index 0000000..4f6df9c --- /dev/null +++ b/src/main/java/org/datasurvey/domain/Plantilla.java @@ -0,0 +1,300 @@ +package org.datasurvey.domain; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import java.io.Serializable; +import java.time.ZonedDateTime; +import java.util.HashSet; +import java.util.Set; +import javax.persistence.*; +import javax.validation.constraints.*; +import org.datasurvey.domain.enumeration.EstadoPlantilla; +import org.hibernate.annotations.Cache; +import org.hibernate.annotations.CacheConcurrencyStrategy; + +/** + * A Plantilla. + */ +@Entity +@Table(name = "plantilla") +@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) +public class Plantilla implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Size(min = 1, max = 50) + @Column(name = "nombre", length = 50) + private String nombre; + + @Column(name = "descripcion") + private String descripcion; + + @NotNull + @Column(name = "fecha_creacion", nullable = false) + private ZonedDateTime fechaCreacion; + + @Column(name = "fecha_publicacion_tienda") + private ZonedDateTime fechaPublicacionTienda; + + @NotNull + @Enumerated(EnumType.STRING) + @Column(name = "estado", nullable = false) + private EstadoPlantilla estado; + + @NotNull + @Column(name = "precio", nullable = false) + private Double precio; + + @OneToMany(mappedBy = "plantilla") + @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) + @JsonIgnoreProperties(value = { "pPreguntaCerradaOpcions", "plantilla" }, allowSetters = true) + private Set pPreguntaCerradas = new HashSet<>(); + + @OneToMany(mappedBy = "plantilla") + @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) + @JsonIgnoreProperties(value = { "plantilla" }, allowSetters = true) + private Set pPreguntaAbiertas = new HashSet<>(); + + @ManyToOne + @JsonIgnoreProperties(value = { "encuestas", "plantillas" }, allowSetters = true) + private Categoria categoria; + + @ManyToMany(mappedBy = "plantillas") + @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) + @JsonIgnoreProperties(value = { "user", "encuestas", "usuarioEncuestas", "plantillas" }, allowSetters = true) + private Set usuarioExtras = new HashSet<>(); + + // jhipster-needle-entity-add-field - JHipster will add fields here + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Plantilla id(Long id) { + this.id = id; + return this; + } + + public String getNombre() { + return this.nombre; + } + + public Plantilla nombre(String nombre) { + this.nombre = nombre; + return this; + } + + public void setNombre(String nombre) { + this.nombre = nombre; + } + + public String getDescripcion() { + return this.descripcion; + } + + public Plantilla descripcion(String descripcion) { + this.descripcion = descripcion; + return this; + } + + public void setDescripcion(String descripcion) { + this.descripcion = descripcion; + } + + public ZonedDateTime getFechaCreacion() { + return this.fechaCreacion; + } + + public Plantilla fechaCreacion(ZonedDateTime fechaCreacion) { + this.fechaCreacion = fechaCreacion; + return this; + } + + public void setFechaCreacion(ZonedDateTime fechaCreacion) { + this.fechaCreacion = fechaCreacion; + } + + public ZonedDateTime getFechaPublicacionTienda() { + return this.fechaPublicacionTienda; + } + + public Plantilla fechaPublicacionTienda(ZonedDateTime fechaPublicacionTienda) { + this.fechaPublicacionTienda = fechaPublicacionTienda; + return this; + } + + public void setFechaPublicacionTienda(ZonedDateTime fechaPublicacionTienda) { + this.fechaPublicacionTienda = fechaPublicacionTienda; + } + + public EstadoPlantilla getEstado() { + return this.estado; + } + + public Plantilla estado(EstadoPlantilla estado) { + this.estado = estado; + return this; + } + + public void setEstado(EstadoPlantilla estado) { + this.estado = estado; + } + + public Double getPrecio() { + return this.precio; + } + + public Plantilla precio(Double precio) { + this.precio = precio; + return this; + } + + public void setPrecio(Double precio) { + this.precio = precio; + } + + public Set getPPreguntaCerradas() { + return this.pPreguntaCerradas; + } + + public Plantilla pPreguntaCerradas(Set pPreguntaCerradas) { + this.setPPreguntaCerradas(pPreguntaCerradas); + return this; + } + + public Plantilla addPPreguntaCerrada(PPreguntaCerrada pPreguntaCerrada) { + this.pPreguntaCerradas.add(pPreguntaCerrada); + pPreguntaCerrada.setPlantilla(this); + return this; + } + + public Plantilla removePPreguntaCerrada(PPreguntaCerrada pPreguntaCerrada) { + this.pPreguntaCerradas.remove(pPreguntaCerrada); + pPreguntaCerrada.setPlantilla(null); + return this; + } + + public void setPPreguntaCerradas(Set pPreguntaCerradas) { + if (this.pPreguntaCerradas != null) { + this.pPreguntaCerradas.forEach(i -> i.setPlantilla(null)); + } + if (pPreguntaCerradas != null) { + pPreguntaCerradas.forEach(i -> i.setPlantilla(this)); + } + this.pPreguntaCerradas = pPreguntaCerradas; + } + + public Set getPPreguntaAbiertas() { + return this.pPreguntaAbiertas; + } + + public Plantilla pPreguntaAbiertas(Set pPreguntaAbiertas) { + this.setPPreguntaAbiertas(pPreguntaAbiertas); + return this; + } + + public Plantilla addPPreguntaAbierta(PPreguntaAbierta pPreguntaAbierta) { + this.pPreguntaAbiertas.add(pPreguntaAbierta); + pPreguntaAbierta.setPlantilla(this); + return this; + } + + public Plantilla removePPreguntaAbierta(PPreguntaAbierta pPreguntaAbierta) { + this.pPreguntaAbiertas.remove(pPreguntaAbierta); + pPreguntaAbierta.setPlantilla(null); + return this; + } + + public void setPPreguntaAbiertas(Set pPreguntaAbiertas) { + if (this.pPreguntaAbiertas != null) { + this.pPreguntaAbiertas.forEach(i -> i.setPlantilla(null)); + } + if (pPreguntaAbiertas != null) { + pPreguntaAbiertas.forEach(i -> i.setPlantilla(this)); + } + this.pPreguntaAbiertas = pPreguntaAbiertas; + } + + public Categoria getCategoria() { + return this.categoria; + } + + public Plantilla categoria(Categoria categoria) { + this.setCategoria(categoria); + return this; + } + + public void setCategoria(Categoria categoria) { + this.categoria = categoria; + } + + public Set getUsuarioExtras() { + return this.usuarioExtras; + } + + public Plantilla usuarioExtras(Set usuarioExtras) { + this.setUsuarioExtras(usuarioExtras); + return this; + } + + public Plantilla addUsuarioExtra(UsuarioExtra usuarioExtra) { + this.usuarioExtras.add(usuarioExtra); + usuarioExtra.getPlantillas().add(this); + return this; + } + + public Plantilla removeUsuarioExtra(UsuarioExtra usuarioExtra) { + this.usuarioExtras.remove(usuarioExtra); + usuarioExtra.getPlantillas().remove(this); + return this; + } + + public void setUsuarioExtras(Set usuarioExtras) { + if (this.usuarioExtras != null) { + this.usuarioExtras.forEach(i -> i.removePlantilla(this)); + } + if (usuarioExtras != null) { + usuarioExtras.forEach(i -> i.addPlantilla(this)); + } + this.usuarioExtras = usuarioExtras; + } + + // jhipster-needle-entity-add-getters-setters - JHipster will add getters and setters here + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof Plantilla)) { + return false; + } + return id != null && id.equals(((Plantilla) o).id); + } + + @Override + public int hashCode() { + // see https://vladmihalcea.com/how-to-implement-equals-and-hashcode-using-the-jpa-entity-identifier/ + return getClass().hashCode(); + } + + // prettier-ignore + @Override + public String toString() { + return "Plantilla{" + + "id=" + getId() + + ", nombre='" + getNombre() + "'" + + ", descripcion='" + getDescripcion() + "'" + + ", fechaCreacion='" + getFechaCreacion() + "'" + + ", fechaPublicacionTienda='" + getFechaPublicacionTienda() + "'" + + ", estado='" + getEstado() + "'" + + ", precio=" + getPrecio() + + "}"; + } +} diff --git a/src/main/java/org/datasurvey/domain/User.java b/src/main/java/org/datasurvey/domain/User.java new file mode 100644 index 0000000..52ee1a3 --- /dev/null +++ b/src/main/java/org/datasurvey/domain/User.java @@ -0,0 +1,231 @@ +package org.datasurvey.domain; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import java.io.Serializable; +import java.time.Instant; +import java.util.HashSet; +import java.util.Locale; +import java.util.Set; +import javax.persistence.*; +import javax.validation.constraints.Email; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; +import javax.validation.constraints.Size; +import org.apache.commons.lang3.StringUtils; +import org.datasurvey.config.Constants; +import org.hibernate.annotations.BatchSize; +import org.hibernate.annotations.Cache; +import org.hibernate.annotations.CacheConcurrencyStrategy; + +/** + * A user. + */ +@Entity +@Table(name = "jhi_user") +@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) +public class User extends AbstractAuditingEntity implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @NotNull + @Pattern(regexp = Constants.LOGIN_REGEX) + @Size(min = 1, max = 50) + @Column(length = 50, unique = true, nullable = false) + private String login; + + @JsonIgnore + @NotNull + @Size(min = 60, max = 60) + @Column(name = "password_hash", length = 60, nullable = false) + private String password; + + @Size(max = 50) + @Column(name = "first_name", length = 50) + private String firstName; + + @Size(max = 50) + @Column(name = "last_name", length = 50) + private String lastName; + + @Email + @Size(min = 5, max = 254) + @Column(length = 254, unique = true) + private String email; + + @NotNull + @Column(nullable = false) + private boolean activated = false; + + @Size(min = 2, max = 10) + @Column(name = "lang_key", length = 10) + private String langKey; + + @Size(max = 256) + @Column(name = "image_url", length = 256) + private String imageUrl; + + @Size(max = 20) + @Column(name = "activation_key", length = 20) + @JsonIgnore + private String activationKey; + + @Size(max = 20) + @Column(name = "reset_key", length = 20) + @JsonIgnore + private String resetKey; + + @Column(name = "reset_date") + private Instant resetDate = null; + + @JsonIgnore + @ManyToMany + @JoinTable( + name = "jhi_user_authority", + joinColumns = { @JoinColumn(name = "user_id", referencedColumnName = "id") }, + inverseJoinColumns = { @JoinColumn(name = "authority_name", referencedColumnName = "name") } + ) + @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) + @BatchSize(size = 20) + private Set authorities = new HashSet<>(); + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getLogin() { + return login; + } + + // Lowercase the login before saving it in database + public void setLogin(String login) { + this.login = StringUtils.lowerCase(login, Locale.ENGLISH); + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getImageUrl() { + return imageUrl; + } + + public void setImageUrl(String imageUrl) { + this.imageUrl = imageUrl; + } + + public boolean isActivated() { + return activated; + } + + public void setActivated(boolean activated) { + this.activated = activated; + } + + public String getActivationKey() { + return activationKey; + } + + public void setActivationKey(String activationKey) { + this.activationKey = activationKey; + } + + public String getResetKey() { + return resetKey; + } + + public void setResetKey(String resetKey) { + this.resetKey = resetKey; + } + + public Instant getResetDate() { + return resetDate; + } + + public void setResetDate(Instant resetDate) { + this.resetDate = resetDate; + } + + public String getLangKey() { + return langKey; + } + + public void setLangKey(String langKey) { + this.langKey = langKey; + } + + public Set getAuthorities() { + return authorities; + } + + public void setAuthorities(Set authorities) { + this.authorities = authorities; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof User)) { + return false; + } + return id != null && id.equals(((User) o).id); + } + + @Override + public int hashCode() { + // see https://vladmihalcea.com/how-to-implement-equals-and-hashcode-using-the-jpa-entity-identifier/ + return getClass().hashCode(); + } + + // prettier-ignore + @Override + public String toString() { + return "User{" + + "login='" + login + '\'' + + ", firstName='" + firstName + '\'' + + ", lastName='" + lastName + '\'' + + ", email='" + email + '\'' + + ", imageUrl='" + imageUrl + '\'' + + ", activated='" + activated + '\'' + + ", langKey='" + langKey + '\'' + + ", activationKey='" + activationKey + '\'' + + "}"; + } +} diff --git a/src/main/java/org/datasurvey/domain/UsuarioEncuesta.java b/src/main/java/org/datasurvey/domain/UsuarioEncuesta.java new file mode 100644 index 0000000..d1522eb --- /dev/null +++ b/src/main/java/org/datasurvey/domain/UsuarioEncuesta.java @@ -0,0 +1,160 @@ +package org.datasurvey.domain; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import java.io.Serializable; +import java.time.ZonedDateTime; +import javax.persistence.*; +import javax.validation.constraints.*; +import org.datasurvey.domain.enumeration.EstadoColaborador; +import org.datasurvey.domain.enumeration.RolColaborador; +import org.hibernate.annotations.Cache; +import org.hibernate.annotations.CacheConcurrencyStrategy; + +/** + * A UsuarioEncuesta. + */ +@Entity +@Table(name = "usuario_encuesta") +@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) +public class UsuarioEncuesta implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @NotNull + @Enumerated(EnumType.STRING) + @Column(name = "rol", nullable = false) + private RolColaborador rol; + + @NotNull + @Enumerated(EnumType.STRING) + @Column(name = "estado", nullable = false) + private EstadoColaborador estado; + + @NotNull + @Column(name = "fecha_agregado", nullable = false) + private ZonedDateTime fechaAgregado; + + @ManyToOne + @JsonIgnoreProperties(value = { "user", "encuestas", "usuarioEncuestas", "plantillas" }, allowSetters = true) + private UsuarioExtra usuarioExtra; + + @ManyToOne + @JsonIgnoreProperties( + value = { "usuarioEncuestas", "ePreguntaAbiertas", "ePreguntaCerradas", "categoria", "usuarioExtra" }, + allowSetters = true + ) + private Encuesta encuesta; + + // jhipster-needle-entity-add-field - JHipster will add fields here + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public UsuarioEncuesta id(Long id) { + this.id = id; + return this; + } + + public RolColaborador getRol() { + return this.rol; + } + + public UsuarioEncuesta rol(RolColaborador rol) { + this.rol = rol; + return this; + } + + public void setRol(RolColaborador rol) { + this.rol = rol; + } + + public EstadoColaborador getEstado() { + return this.estado; + } + + public UsuarioEncuesta estado(EstadoColaborador estado) { + this.estado = estado; + return this; + } + + public void setEstado(EstadoColaborador estado) { + this.estado = estado; + } + + public ZonedDateTime getFechaAgregado() { + return this.fechaAgregado; + } + + public UsuarioEncuesta fechaAgregado(ZonedDateTime fechaAgregado) { + this.fechaAgregado = fechaAgregado; + return this; + } + + public void setFechaAgregado(ZonedDateTime fechaAgregado) { + this.fechaAgregado = fechaAgregado; + } + + public UsuarioExtra getUsuarioExtra() { + return this.usuarioExtra; + } + + public UsuarioEncuesta usuarioExtra(UsuarioExtra usuarioExtra) { + this.setUsuarioExtra(usuarioExtra); + return this; + } + + public void setUsuarioExtra(UsuarioExtra usuarioExtra) { + this.usuarioExtra = usuarioExtra; + } + + public Encuesta getEncuesta() { + return this.encuesta; + } + + public UsuarioEncuesta encuesta(Encuesta encuesta) { + this.setEncuesta(encuesta); + return this; + } + + public void setEncuesta(Encuesta encuesta) { + this.encuesta = encuesta; + } + + // jhipster-needle-entity-add-getters-setters - JHipster will add getters and setters here + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof UsuarioEncuesta)) { + return false; + } + return id != null && id.equals(((UsuarioEncuesta) o).id); + } + + @Override + public int hashCode() { + // see https://vladmihalcea.com/how-to-implement-equals-and-hashcode-using-the-jpa-entity-identifier/ + return getClass().hashCode(); + } + + // prettier-ignore + @Override + public String toString() { + return "UsuarioEncuesta{" + + "id=" + getId() + + ", rol='" + getRol() + "'" + + ", estado='" + getEstado() + "'" + + ", fechaAgregado='" + getFechaAgregado() + "'" + + "}"; + } +} diff --git a/src/main/java/org/datasurvey/domain/UsuarioExtra.java b/src/main/java/org/datasurvey/domain/UsuarioExtra.java new file mode 100644 index 0000000..95597cc --- /dev/null +++ b/src/main/java/org/datasurvey/domain/UsuarioExtra.java @@ -0,0 +1,266 @@ +package org.datasurvey.domain; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import java.io.Serializable; +import java.time.ZonedDateTime; +import java.util.HashSet; +import java.util.Set; +import javax.persistence.*; +import javax.validation.constraints.*; +import org.datasurvey.domain.enumeration.EstadoUsuario; +import org.hibernate.annotations.Cache; +import org.hibernate.annotations.CacheConcurrencyStrategy; + +/** + * A UsuarioExtra. + */ +@Entity +@Table(name = "usuario_extra") +@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) +public class UsuarioExtra implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @NotNull + @Column(name = "nombre", nullable = false) + private String nombre; + + @Column(name = "icono_perfil") + private String iconoPerfil; + + @Column(name = "fecha_nacimiento") + private ZonedDateTime fechaNacimiento; + + @NotNull + @Enumerated(EnumType.STRING) + @Column(name = "estado", nullable = false) + private EstadoUsuario estado; + + @OneToOne + @JoinColumn(unique = true) + private User user; + + @OneToMany(mappedBy = "usuarioExtra") + @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) + @JsonIgnoreProperties( + value = { "usuarioEncuestas", "ePreguntaAbiertas", "ePreguntaCerradas", "categoria", "usuarioExtra" }, + allowSetters = true + ) + private Set encuestas = new HashSet<>(); + + @OneToMany(mappedBy = "usuarioExtra") + @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) + @JsonIgnoreProperties(value = { "usuarioExtra", "encuesta" }, allowSetters = true) + private Set usuarioEncuestas = new HashSet<>(); + + @ManyToMany + @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) + @JoinTable( + name = "rel_usuario_extra__plantilla", + joinColumns = @JoinColumn(name = "usuario_extra_id"), + inverseJoinColumns = @JoinColumn(name = "plantilla_id") + ) + @JsonIgnoreProperties(value = { "pPreguntaCerradas", "pPreguntaAbiertas", "categoria", "usuarioExtras" }, allowSetters = true) + private Set plantillas = new HashSet<>(); + + // jhipster-needle-entity-add-field - JHipster will add fields here + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public UsuarioExtra id(Long id) { + this.id = id; + return this; + } + + public String getNombre() { + return this.nombre; + } + + public UsuarioExtra nombre(String nombre) { + this.nombre = nombre; + return this; + } + + public void setNombre(String nombre) { + this.nombre = nombre; + } + + public String getIconoPerfil() { + return this.iconoPerfil; + } + + public UsuarioExtra iconoPerfil(String iconoPerfil) { + this.iconoPerfil = iconoPerfil; + return this; + } + + public void setIconoPerfil(String iconoPerfil) { + this.iconoPerfil = iconoPerfil; + } + + public ZonedDateTime getFechaNacimiento() { + return this.fechaNacimiento; + } + + public UsuarioExtra fechaNacimiento(ZonedDateTime fechaNacimiento) { + this.fechaNacimiento = fechaNacimiento; + return this; + } + + public void setFechaNacimiento(ZonedDateTime fechaNacimiento) { + this.fechaNacimiento = fechaNacimiento; + } + + public EstadoUsuario getEstado() { + return this.estado; + } + + public UsuarioExtra estado(EstadoUsuario estado) { + this.estado = estado; + return this; + } + + public void setEstado(EstadoUsuario estado) { + this.estado = estado; + } + + public User getUser() { + return this.user; + } + + public UsuarioExtra user(User user) { + this.setUser(user); + return this; + } + + public void setUser(User user) { + this.user = user; + } + + public Set getEncuestas() { + return this.encuestas; + } + + public UsuarioExtra encuestas(Set encuestas) { + this.setEncuestas(encuestas); + return this; + } + + public UsuarioExtra addEncuesta(Encuesta encuesta) { + this.encuestas.add(encuesta); + encuesta.setUsuarioExtra(this); + return this; + } + + public UsuarioExtra removeEncuesta(Encuesta encuesta) { + this.encuestas.remove(encuesta); + encuesta.setUsuarioExtra(null); + return this; + } + + public void setEncuestas(Set encuestas) { + if (this.encuestas != null) { + this.encuestas.forEach(i -> i.setUsuarioExtra(null)); + } + if (encuestas != null) { + encuestas.forEach(i -> i.setUsuarioExtra(this)); + } + this.encuestas = encuestas; + } + + public Set getUsuarioEncuestas() { + return this.usuarioEncuestas; + } + + public UsuarioExtra usuarioEncuestas(Set usuarioEncuestas) { + this.setUsuarioEncuestas(usuarioEncuestas); + return this; + } + + public UsuarioExtra addUsuarioEncuesta(UsuarioEncuesta usuarioEncuesta) { + this.usuarioEncuestas.add(usuarioEncuesta); + usuarioEncuesta.setUsuarioExtra(this); + return this; + } + + public UsuarioExtra removeUsuarioEncuesta(UsuarioEncuesta usuarioEncuesta) { + this.usuarioEncuestas.remove(usuarioEncuesta); + usuarioEncuesta.setUsuarioExtra(null); + return this; + } + + public void setUsuarioEncuestas(Set usuarioEncuestas) { + if (this.usuarioEncuestas != null) { + this.usuarioEncuestas.forEach(i -> i.setUsuarioExtra(null)); + } + if (usuarioEncuestas != null) { + usuarioEncuestas.forEach(i -> i.setUsuarioExtra(this)); + } + this.usuarioEncuestas = usuarioEncuestas; + } + + public Set getPlantillas() { + return this.plantillas; + } + + public UsuarioExtra plantillas(Set plantillas) { + this.setPlantillas(plantillas); + return this; + } + + public UsuarioExtra addPlantilla(Plantilla plantilla) { + this.plantillas.add(plantilla); + plantilla.getUsuarioExtras().add(this); + return this; + } + + public UsuarioExtra removePlantilla(Plantilla plantilla) { + this.plantillas.remove(plantilla); + plantilla.getUsuarioExtras().remove(this); + return this; + } + + public void setPlantillas(Set plantillas) { + this.plantillas = plantillas; + } + + // jhipster-needle-entity-add-getters-setters - JHipster will add getters and setters here + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof UsuarioExtra)) { + return false; + } + return id != null && id.equals(((UsuarioExtra) o).id); + } + + @Override + public int hashCode() { + // see https://vladmihalcea.com/how-to-implement-equals-and-hashcode-using-the-jpa-entity-identifier/ + return getClass().hashCode(); + } + + // prettier-ignore + @Override + public String toString() { + return "UsuarioExtra{" + + "id=" + getId() + + ", nombre='" + getNombre() + "'" + + ", iconoPerfil='" + getIconoPerfil() + "'" + + ", fechaNacimiento='" + getFechaNacimiento() + "'" + + ", estado='" + getEstado() + "'" + + "}"; + } +} diff --git a/src/main/java/org/datasurvey/domain/enumeration/AccesoEncuesta.java b/src/main/java/org/datasurvey/domain/enumeration/AccesoEncuesta.java new file mode 100644 index 0000000..e26470a --- /dev/null +++ b/src/main/java/org/datasurvey/domain/enumeration/AccesoEncuesta.java @@ -0,0 +1,9 @@ +package org.datasurvey.domain.enumeration; + +/** + * The AccesoEncuesta enumeration. + */ +public enum AccesoEncuesta { + PUBLIC, + PRIVATE, +} diff --git a/src/main/java/org/datasurvey/domain/enumeration/EstadoCategoria.java b/src/main/java/org/datasurvey/domain/enumeration/EstadoCategoria.java new file mode 100644 index 0000000..3482d43 --- /dev/null +++ b/src/main/java/org/datasurvey/domain/enumeration/EstadoCategoria.java @@ -0,0 +1,9 @@ +package org.datasurvey.domain.enumeration; + +/** + * The EstadoCategoria enumeration. + */ +public enum EstadoCategoria { + ACTIVE, + INACTIVE, +} diff --git a/src/main/java/org/datasurvey/domain/enumeration/EstadoColaborador.java b/src/main/java/org/datasurvey/domain/enumeration/EstadoColaborador.java new file mode 100644 index 0000000..bfd4c5c --- /dev/null +++ b/src/main/java/org/datasurvey/domain/enumeration/EstadoColaborador.java @@ -0,0 +1,9 @@ +package org.datasurvey.domain.enumeration; + +/** + * The EstadoColaborador enumeration. + */ +public enum EstadoColaborador { + PENDING, + ACTIVE, +} diff --git a/src/main/java/org/datasurvey/domain/enumeration/EstadoEncuesta.java b/src/main/java/org/datasurvey/domain/enumeration/EstadoEncuesta.java new file mode 100644 index 0000000..aec71ab --- /dev/null +++ b/src/main/java/org/datasurvey/domain/enumeration/EstadoEncuesta.java @@ -0,0 +1,11 @@ +package org.datasurvey.domain.enumeration; + +/** + * The EstadoEncuesta enumeration. + */ +public enum EstadoEncuesta { + DRAFT, + ACTIVE, + FINISHED, + DELETED, +} diff --git a/src/main/java/org/datasurvey/domain/enumeration/EstadoPlantilla.java b/src/main/java/org/datasurvey/domain/enumeration/EstadoPlantilla.java new file mode 100644 index 0000000..e070807 --- /dev/null +++ b/src/main/java/org/datasurvey/domain/enumeration/EstadoPlantilla.java @@ -0,0 +1,11 @@ +package org.datasurvey.domain.enumeration; + +/** + * The EstadoPlantilla enumeration. + */ +public enum EstadoPlantilla { + DRAFT, + ACTIVE, + DELETED, + DISABLED, +} diff --git a/src/main/java/org/datasurvey/domain/enumeration/EstadoUsuario.java b/src/main/java/org/datasurvey/domain/enumeration/EstadoUsuario.java new file mode 100644 index 0000000..78bbf12 --- /dev/null +++ b/src/main/java/org/datasurvey/domain/enumeration/EstadoUsuario.java @@ -0,0 +1,9 @@ +package org.datasurvey.domain.enumeration; + +/** + * The EstadoUsuario enumeration. + */ +public enum EstadoUsuario { + ACTIVE, + SUSPENDED, +} diff --git a/src/main/java/org/datasurvey/domain/enumeration/PreguntaCerradaTipo.java b/src/main/java/org/datasurvey/domain/enumeration/PreguntaCerradaTipo.java new file mode 100644 index 0000000..9780d06 --- /dev/null +++ b/src/main/java/org/datasurvey/domain/enumeration/PreguntaCerradaTipo.java @@ -0,0 +1,9 @@ +package org.datasurvey.domain.enumeration; + +/** + * The PreguntaCerradaTipo enumeration. + */ +public enum PreguntaCerradaTipo { + SINGLE, + MULTIPLE, +} diff --git a/src/main/java/org/datasurvey/domain/enumeration/RolColaborador.java b/src/main/java/org/datasurvey/domain/enumeration/RolColaborador.java new file mode 100644 index 0000000..9fef157 --- /dev/null +++ b/src/main/java/org/datasurvey/domain/enumeration/RolColaborador.java @@ -0,0 +1,9 @@ +package org.datasurvey.domain.enumeration; + +/** + * The RolColaborador enumeration. + */ +public enum RolColaborador { + READ, + WRITE, +} diff --git a/src/main/java/org/datasurvey/domain/package-info.java b/src/main/java/org/datasurvey/domain/package-info.java new file mode 100644 index 0000000..41498c6 --- /dev/null +++ b/src/main/java/org/datasurvey/domain/package-info.java @@ -0,0 +1,4 @@ +/** + * JPA domain objects. + */ +package org.datasurvey.domain; diff --git a/src/main/java/org/datasurvey/repository/AuthorityRepository.java b/src/main/java/org/datasurvey/repository/AuthorityRepository.java new file mode 100644 index 0000000..941da55 --- /dev/null +++ b/src/main/java/org/datasurvey/repository/AuthorityRepository.java @@ -0,0 +1,9 @@ +package org.datasurvey.repository; + +import org.datasurvey.domain.Authority; +import org.springframework.data.jpa.repository.JpaRepository; + +/** + * Spring Data JPA repository for the {@link Authority} entity. + */ +public interface AuthorityRepository extends JpaRepository {} diff --git a/src/main/java/org/datasurvey/repository/CategoriaRepository.java b/src/main/java/org/datasurvey/repository/CategoriaRepository.java new file mode 100644 index 0000000..66368c1 --- /dev/null +++ b/src/main/java/org/datasurvey/repository/CategoriaRepository.java @@ -0,0 +1,12 @@ +package org.datasurvey.repository; + +import org.datasurvey.domain.Categoria; +import org.springframework.data.jpa.repository.*; +import org.springframework.stereotype.Repository; + +/** + * Spring Data SQL repository for the Categoria entity. + */ +@SuppressWarnings("unused") +@Repository +public interface CategoriaRepository extends JpaRepository, JpaSpecificationExecutor {} diff --git a/src/main/java/org/datasurvey/repository/EPreguntaAbiertaRepository.java b/src/main/java/org/datasurvey/repository/EPreguntaAbiertaRepository.java new file mode 100644 index 0000000..82cd91d --- /dev/null +++ b/src/main/java/org/datasurvey/repository/EPreguntaAbiertaRepository.java @@ -0,0 +1,12 @@ +package org.datasurvey.repository; + +import org.datasurvey.domain.EPreguntaAbierta; +import org.springframework.data.jpa.repository.*; +import org.springframework.stereotype.Repository; + +/** + * Spring Data SQL repository for the EPreguntaAbierta entity. + */ +@SuppressWarnings("unused") +@Repository +public interface EPreguntaAbiertaRepository extends JpaRepository, JpaSpecificationExecutor {} diff --git a/src/main/java/org/datasurvey/repository/EPreguntaAbiertaRespuestaRepository.java b/src/main/java/org/datasurvey/repository/EPreguntaAbiertaRespuestaRepository.java new file mode 100644 index 0000000..ba3c92b --- /dev/null +++ b/src/main/java/org/datasurvey/repository/EPreguntaAbiertaRespuestaRepository.java @@ -0,0 +1,13 @@ +package org.datasurvey.repository; + +import org.datasurvey.domain.EPreguntaAbiertaRespuesta; +import org.springframework.data.jpa.repository.*; +import org.springframework.stereotype.Repository; + +/** + * Spring Data SQL repository for the EPreguntaAbiertaRespuesta entity. + */ +@SuppressWarnings("unused") +@Repository +public interface EPreguntaAbiertaRespuestaRepository + extends JpaRepository, JpaSpecificationExecutor {} diff --git a/src/main/java/org/datasurvey/repository/EPreguntaCerradaOpcionRepository.java b/src/main/java/org/datasurvey/repository/EPreguntaCerradaOpcionRepository.java new file mode 100644 index 0000000..5878bd9 --- /dev/null +++ b/src/main/java/org/datasurvey/repository/EPreguntaCerradaOpcionRepository.java @@ -0,0 +1,13 @@ +package org.datasurvey.repository; + +import org.datasurvey.domain.EPreguntaCerradaOpcion; +import org.springframework.data.jpa.repository.*; +import org.springframework.stereotype.Repository; + +/** + * Spring Data SQL repository for the EPreguntaCerradaOpcion entity. + */ +@SuppressWarnings("unused") +@Repository +public interface EPreguntaCerradaOpcionRepository + extends JpaRepository, JpaSpecificationExecutor {} diff --git a/src/main/java/org/datasurvey/repository/EPreguntaCerradaRepository.java b/src/main/java/org/datasurvey/repository/EPreguntaCerradaRepository.java new file mode 100644 index 0000000..a793b4f --- /dev/null +++ b/src/main/java/org/datasurvey/repository/EPreguntaCerradaRepository.java @@ -0,0 +1,12 @@ +package org.datasurvey.repository; + +import org.datasurvey.domain.EPreguntaCerrada; +import org.springframework.data.jpa.repository.*; +import org.springframework.stereotype.Repository; + +/** + * Spring Data SQL repository for the EPreguntaCerrada entity. + */ +@SuppressWarnings("unused") +@Repository +public interface EPreguntaCerradaRepository extends JpaRepository, JpaSpecificationExecutor {} diff --git a/src/main/java/org/datasurvey/repository/EncuestaRepository.java b/src/main/java/org/datasurvey/repository/EncuestaRepository.java new file mode 100644 index 0000000..7e89fcc --- /dev/null +++ b/src/main/java/org/datasurvey/repository/EncuestaRepository.java @@ -0,0 +1,12 @@ +package org.datasurvey.repository; + +import org.datasurvey.domain.Encuesta; +import org.springframework.data.jpa.repository.*; +import org.springframework.stereotype.Repository; + +/** + * Spring Data SQL repository for the Encuesta entity. + */ +@SuppressWarnings("unused") +@Repository +public interface EncuestaRepository extends JpaRepository, JpaSpecificationExecutor {} diff --git a/src/main/java/org/datasurvey/repository/FacturaRepository.java b/src/main/java/org/datasurvey/repository/FacturaRepository.java new file mode 100644 index 0000000..7f3601d --- /dev/null +++ b/src/main/java/org/datasurvey/repository/FacturaRepository.java @@ -0,0 +1,12 @@ +package org.datasurvey.repository; + +import org.datasurvey.domain.Factura; +import org.springframework.data.jpa.repository.*; +import org.springframework.stereotype.Repository; + +/** + * Spring Data SQL repository for the Factura entity. + */ +@SuppressWarnings("unused") +@Repository +public interface FacturaRepository extends JpaRepository, JpaSpecificationExecutor {} diff --git a/src/main/java/org/datasurvey/repository/PPreguntaAbiertaRepository.java b/src/main/java/org/datasurvey/repository/PPreguntaAbiertaRepository.java new file mode 100644 index 0000000..d53eb76 --- /dev/null +++ b/src/main/java/org/datasurvey/repository/PPreguntaAbiertaRepository.java @@ -0,0 +1,12 @@ +package org.datasurvey.repository; + +import org.datasurvey.domain.PPreguntaAbierta; +import org.springframework.data.jpa.repository.*; +import org.springframework.stereotype.Repository; + +/** + * Spring Data SQL repository for the PPreguntaAbierta entity. + */ +@SuppressWarnings("unused") +@Repository +public interface PPreguntaAbiertaRepository extends JpaRepository, JpaSpecificationExecutor {} diff --git a/src/main/java/org/datasurvey/repository/PPreguntaCerradaOpcionRepository.java b/src/main/java/org/datasurvey/repository/PPreguntaCerradaOpcionRepository.java new file mode 100644 index 0000000..cf2054c --- /dev/null +++ b/src/main/java/org/datasurvey/repository/PPreguntaCerradaOpcionRepository.java @@ -0,0 +1,13 @@ +package org.datasurvey.repository; + +import org.datasurvey.domain.PPreguntaCerradaOpcion; +import org.springframework.data.jpa.repository.*; +import org.springframework.stereotype.Repository; + +/** + * Spring Data SQL repository for the PPreguntaCerradaOpcion entity. + */ +@SuppressWarnings("unused") +@Repository +public interface PPreguntaCerradaOpcionRepository + extends JpaRepository, JpaSpecificationExecutor {} diff --git a/src/main/java/org/datasurvey/repository/PPreguntaCerradaRepository.java b/src/main/java/org/datasurvey/repository/PPreguntaCerradaRepository.java new file mode 100644 index 0000000..59d2d06 --- /dev/null +++ b/src/main/java/org/datasurvey/repository/PPreguntaCerradaRepository.java @@ -0,0 +1,12 @@ +package org.datasurvey.repository; + +import org.datasurvey.domain.PPreguntaCerrada; +import org.springframework.data.jpa.repository.*; +import org.springframework.stereotype.Repository; + +/** + * Spring Data SQL repository for the PPreguntaCerrada entity. + */ +@SuppressWarnings("unused") +@Repository +public interface PPreguntaCerradaRepository extends JpaRepository, JpaSpecificationExecutor {} diff --git a/src/main/java/org/datasurvey/repository/ParametroAplicacionRepository.java b/src/main/java/org/datasurvey/repository/ParametroAplicacionRepository.java new file mode 100644 index 0000000..e083048 --- /dev/null +++ b/src/main/java/org/datasurvey/repository/ParametroAplicacionRepository.java @@ -0,0 +1,13 @@ +package org.datasurvey.repository; + +import org.datasurvey.domain.ParametroAplicacion; +import org.springframework.data.jpa.repository.*; +import org.springframework.stereotype.Repository; + +/** + * Spring Data SQL repository for the ParametroAplicacion entity. + */ +@SuppressWarnings("unused") +@Repository +public interface ParametroAplicacionRepository + extends JpaRepository, JpaSpecificationExecutor {} diff --git a/src/main/java/org/datasurvey/repository/PlantillaRepository.java b/src/main/java/org/datasurvey/repository/PlantillaRepository.java new file mode 100644 index 0000000..7339aa7 --- /dev/null +++ b/src/main/java/org/datasurvey/repository/PlantillaRepository.java @@ -0,0 +1,12 @@ +package org.datasurvey.repository; + +import org.datasurvey.domain.Plantilla; +import org.springframework.data.jpa.repository.*; +import org.springframework.stereotype.Repository; + +/** + * Spring Data SQL repository for the Plantilla entity. + */ +@SuppressWarnings("unused") +@Repository +public interface PlantillaRepository extends JpaRepository, JpaSpecificationExecutor {} diff --git a/src/main/java/org/datasurvey/repository/UserRepository.java b/src/main/java/org/datasurvey/repository/UserRepository.java new file mode 100644 index 0000000..3f929fb --- /dev/null +++ b/src/main/java/org/datasurvey/repository/UserRepository.java @@ -0,0 +1,42 @@ +package org.datasurvey.repository; + +import java.time.Instant; +import java.util.List; +import java.util.Optional; +import org.datasurvey.domain.User; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.EntityGraph; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +/** + * Spring Data JPA repository for the {@link User} entity. + */ +@Repository +public interface UserRepository extends JpaRepository { + String USERS_BY_LOGIN_CACHE = "usersByLogin"; + + String USERS_BY_EMAIL_CACHE = "usersByEmail"; + + Optional findOneByActivationKey(String activationKey); + + List findAllByActivatedIsFalseAndActivationKeyIsNotNullAndCreatedDateBefore(Instant dateTime); + + Optional findOneByResetKey(String resetKey); + + Optional findOneByEmailIgnoreCase(String email); + + Optional findOneByLogin(String login); + + @EntityGraph(attributePaths = "authorities") + @Cacheable(cacheNames = USERS_BY_LOGIN_CACHE) + Optional findOneWithAuthoritiesByLogin(String login); + + @EntityGraph(attributePaths = "authorities") + @Cacheable(cacheNames = USERS_BY_EMAIL_CACHE) + Optional findOneWithAuthoritiesByEmailIgnoreCase(String email); + + Page findAllByIdNotNullAndActivatedIsTrue(Pageable pageable); +} diff --git a/src/main/java/org/datasurvey/repository/UsuarioEncuestaRepository.java b/src/main/java/org/datasurvey/repository/UsuarioEncuestaRepository.java new file mode 100644 index 0000000..4a05507 --- /dev/null +++ b/src/main/java/org/datasurvey/repository/UsuarioEncuestaRepository.java @@ -0,0 +1,12 @@ +package org.datasurvey.repository; + +import org.datasurvey.domain.UsuarioEncuesta; +import org.springframework.data.jpa.repository.*; +import org.springframework.stereotype.Repository; + +/** + * Spring Data SQL repository for the UsuarioEncuesta entity. + */ +@SuppressWarnings("unused") +@Repository +public interface UsuarioEncuestaRepository extends JpaRepository, JpaSpecificationExecutor {} diff --git a/src/main/java/org/datasurvey/repository/UsuarioExtraRepository.java b/src/main/java/org/datasurvey/repository/UsuarioExtraRepository.java new file mode 100644 index 0000000..2497fe5 --- /dev/null +++ b/src/main/java/org/datasurvey/repository/UsuarioExtraRepository.java @@ -0,0 +1,28 @@ +package org.datasurvey.repository; + +import java.util.List; +import java.util.Optional; +import org.datasurvey.domain.UsuarioExtra; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.*; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +/** + * Spring Data SQL repository for the UsuarioExtra entity. + */ +@Repository +public interface UsuarioExtraRepository extends JpaRepository, JpaSpecificationExecutor { + @Query( + value = "select distinct usuarioExtra from UsuarioExtra usuarioExtra left join fetch usuarioExtra.plantillas", + countQuery = "select count(distinct usuarioExtra) from UsuarioExtra usuarioExtra" + ) + Page findAllWithEagerRelationships(Pageable pageable); + + @Query("select distinct usuarioExtra from UsuarioExtra usuarioExtra left join fetch usuarioExtra.plantillas") + List findAllWithEagerRelationships(); + + @Query("select usuarioExtra from UsuarioExtra usuarioExtra left join fetch usuarioExtra.plantillas where usuarioExtra.id =:id") + Optional findOneWithEagerRelationships(@Param("id") Long id); +} diff --git a/src/main/java/org/datasurvey/repository/package-info.java b/src/main/java/org/datasurvey/repository/package-info.java new file mode 100644 index 0000000..f427885 --- /dev/null +++ b/src/main/java/org/datasurvey/repository/package-info.java @@ -0,0 +1,4 @@ +/** + * Spring Data JPA repositories. + */ +package org.datasurvey.repository; diff --git a/src/main/java/org/datasurvey/security/AuthoritiesConstants.java b/src/main/java/org/datasurvey/security/AuthoritiesConstants.java new file mode 100644 index 0000000..b781cbe --- /dev/null +++ b/src/main/java/org/datasurvey/security/AuthoritiesConstants.java @@ -0,0 +1,15 @@ +package org.datasurvey.security; + +/** + * Constants for Spring Security authorities. + */ +public final class AuthoritiesConstants { + + public static final String ADMIN = "ROLE_ADMIN"; + + public static final String USER = "ROLE_USER"; + + public static final String ANONYMOUS = "ROLE_ANONYMOUS"; + + private AuthoritiesConstants() {} +} diff --git a/src/main/java/org/datasurvey/security/DomainUserDetailsService.java b/src/main/java/org/datasurvey/security/DomainUserDetailsService.java new file mode 100644 index 0000000..4e8511d --- /dev/null +++ b/src/main/java/org/datasurvey/security/DomainUserDetailsService.java @@ -0,0 +1,62 @@ +package org.datasurvey.security; + +import java.util.*; +import java.util.stream.Collectors; +import org.datasurvey.domain.User; +import org.datasurvey.repository.UserRepository; +import org.hibernate.validator.internal.constraintvalidators.hv.EmailValidator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +/** + * Authenticate a user from the database. + */ +@Component("userDetailsService") +public class DomainUserDetailsService implements UserDetailsService { + + private final Logger log = LoggerFactory.getLogger(DomainUserDetailsService.class); + + private final UserRepository userRepository; + + public DomainUserDetailsService(UserRepository userRepository) { + this.userRepository = userRepository; + } + + @Override + @Transactional + public UserDetails loadUserByUsername(final String login) { + log.debug("Authenticating {}", login); + + if (new EmailValidator().isValid(login, null)) { + return userRepository + .findOneWithAuthoritiesByEmailIgnoreCase(login) + .map(user -> createSpringSecurityUser(login, user)) + .orElseThrow(() -> new UsernameNotFoundException("User with email " + login + " was not found in the database")); + } + + String lowercaseLogin = login.toLowerCase(Locale.ENGLISH); + return userRepository + .findOneWithAuthoritiesByLogin(lowercaseLogin) + .map(user -> createSpringSecurityUser(lowercaseLogin, user)) + .orElseThrow(() -> new UsernameNotFoundException("User " + lowercaseLogin + " was not found in the database")); + } + + private org.springframework.security.core.userdetails.User createSpringSecurityUser(String lowercaseLogin, User user) { + if (!user.isActivated()) { + throw new UserNotActivatedException("User " + lowercaseLogin + " was not activated"); + } + List grantedAuthorities = user + .getAuthorities() + .stream() + .map(authority -> new SimpleGrantedAuthority(authority.getName())) + .collect(Collectors.toList()); + return new org.springframework.security.core.userdetails.User(user.getLogin(), user.getPassword(), grantedAuthorities); + } +} diff --git a/src/main/java/org/datasurvey/security/SecurityUtils.java b/src/main/java/org/datasurvey/security/SecurityUtils.java new file mode 100644 index 0000000..fd5f050 --- /dev/null +++ b/src/main/java/org/datasurvey/security/SecurityUtils.java @@ -0,0 +1,77 @@ +package org.datasurvey.security; + +import java.util.Optional; +import java.util.stream.Stream; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.UserDetails; + +/** + * Utility class for Spring Security. + */ +public final class SecurityUtils { + + private SecurityUtils() {} + + /** + * Get the login of the current user. + * + * @return the login of the current user. + */ + public static Optional getCurrentUserLogin() { + SecurityContext securityContext = SecurityContextHolder.getContext(); + return Optional.ofNullable(extractPrincipal(securityContext.getAuthentication())); + } + + private static String extractPrincipal(Authentication authentication) { + if (authentication == null) { + return null; + } else if (authentication.getPrincipal() instanceof UserDetails) { + UserDetails springSecurityUser = (UserDetails) authentication.getPrincipal(); + return springSecurityUser.getUsername(); + } else if (authentication.getPrincipal() instanceof String) { + return (String) authentication.getPrincipal(); + } + return null; + } + + /** + * Get the JWT of the current user. + * + * @return the JWT of the current user. + */ + public static Optional getCurrentUserJWT() { + SecurityContext securityContext = SecurityContextHolder.getContext(); + return Optional + .ofNullable(securityContext.getAuthentication()) + .filter(authentication -> authentication.getCredentials() instanceof String) + .map(authentication -> (String) authentication.getCredentials()); + } + + /** + * Check if a user is authenticated. + * + * @return true if the user is authenticated, false otherwise. + */ + public static boolean isAuthenticated() { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + return authentication != null && getAuthorities(authentication).noneMatch(AuthoritiesConstants.ANONYMOUS::equals); + } + + /** + * Checks if the current user has a specific authority. + * + * @param authority the authority to check. + * @return true if the current user has the authority, false otherwise. + */ + public static boolean hasCurrentUserThisAuthority(String authority) { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + return authentication != null && getAuthorities(authentication).anyMatch(authority::equals); + } + + private static Stream getAuthorities(Authentication authentication) { + return authentication.getAuthorities().stream().map(GrantedAuthority::getAuthority); + } +} diff --git a/src/main/java/org/datasurvey/security/SpringSecurityAuditorAware.java b/src/main/java/org/datasurvey/security/SpringSecurityAuditorAware.java new file mode 100644 index 0000000..6bc970f --- /dev/null +++ b/src/main/java/org/datasurvey/security/SpringSecurityAuditorAware.java @@ -0,0 +1,18 @@ +package org.datasurvey.security; + +import java.util.Optional; +import org.datasurvey.config.Constants; +import org.springframework.data.domain.AuditorAware; +import org.springframework.stereotype.Component; + +/** + * Implementation of {@link AuditorAware} based on Spring Security. + */ +@Component +public class SpringSecurityAuditorAware implements AuditorAware { + + @Override + public Optional getCurrentAuditor() { + return Optional.of(SecurityUtils.getCurrentUserLogin().orElse(Constants.SYSTEM)); + } +} diff --git a/src/main/java/org/datasurvey/security/UserNotActivatedException.java b/src/main/java/org/datasurvey/security/UserNotActivatedException.java new file mode 100644 index 0000000..b8738e1 --- /dev/null +++ b/src/main/java/org/datasurvey/security/UserNotActivatedException.java @@ -0,0 +1,19 @@ +package org.datasurvey.security; + +import org.springframework.security.core.AuthenticationException; + +/** + * This exception is thrown in case of a not activated user trying to authenticate. + */ +public class UserNotActivatedException extends AuthenticationException { + + private static final long serialVersionUID = 1L; + + public UserNotActivatedException(String message) { + super(message); + } + + public UserNotActivatedException(String message, Throwable t) { + super(message, t); + } +} diff --git a/src/main/java/org/datasurvey/security/jwt/JWTConfigurer.java b/src/main/java/org/datasurvey/security/jwt/JWTConfigurer.java new file mode 100644 index 0000000..24f2279 --- /dev/null +++ b/src/main/java/org/datasurvey/security/jwt/JWTConfigurer.java @@ -0,0 +1,21 @@ +package org.datasurvey.security.jwt; + +import org.springframework.security.config.annotation.SecurityConfigurerAdapter; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.web.DefaultSecurityFilterChain; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; + +public class JWTConfigurer extends SecurityConfigurerAdapter { + + private final TokenProvider tokenProvider; + + public JWTConfigurer(TokenProvider tokenProvider) { + this.tokenProvider = tokenProvider; + } + + @Override + public void configure(HttpSecurity http) { + JWTFilter customFilter = new JWTFilter(tokenProvider); + http.addFilterBefore(customFilter, UsernamePasswordAuthenticationFilter.class); + } +} diff --git a/src/main/java/org/datasurvey/security/jwt/JWTFilter.java b/src/main/java/org/datasurvey/security/jwt/JWTFilter.java new file mode 100644 index 0000000..8941b96 --- /dev/null +++ b/src/main/java/org/datasurvey/security/jwt/JWTFilter.java @@ -0,0 +1,53 @@ +package org.datasurvey.security.jwt; + +import java.io.IOException; +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.util.StringUtils; +import org.springframework.web.filter.GenericFilterBean; + +/** + * Filters incoming requests and installs a Spring Security principal if a header corresponding to a valid user is + * found. + */ +public class JWTFilter extends GenericFilterBean { + + public static final String AUTHORIZATION_HEADER = "Authorization"; + + public static final String AUTHORIZATION_TOKEN = "access_token"; + + private final TokenProvider tokenProvider; + + public JWTFilter(TokenProvider tokenProvider) { + this.tokenProvider = tokenProvider; + } + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) + throws IOException, ServletException { + HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; + String jwt = resolveToken(httpServletRequest); + if (StringUtils.hasText(jwt) && this.tokenProvider.validateToken(jwt)) { + Authentication authentication = this.tokenProvider.getAuthentication(jwt); + SecurityContextHolder.getContext().setAuthentication(authentication); + } + filterChain.doFilter(servletRequest, servletResponse); + } + + private String resolveToken(HttpServletRequest request) { + String bearerToken = request.getHeader(AUTHORIZATION_HEADER); + if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")) { + return bearerToken.substring(7); + } + String jwt = request.getParameter(AUTHORIZATION_TOKEN); + if (StringUtils.hasText(jwt)) { + return jwt; + } + return null; + } +} diff --git a/src/main/java/org/datasurvey/security/jwt/TokenProvider.java b/src/main/java/org/datasurvey/security/jwt/TokenProvider.java new file mode 100644 index 0000000..85d3d9c --- /dev/null +++ b/src/main/java/org/datasurvey/security/jwt/TokenProvider.java @@ -0,0 +1,101 @@ +package org.datasurvey.security.jwt; + +import io.jsonwebtoken.*; +import io.jsonwebtoken.io.Decoders; +import io.jsonwebtoken.security.Keys; +import java.nio.charset.StandardCharsets; +import java.security.Key; +import java.util.*; +import java.util.stream.Collectors; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.User; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; +import tech.jhipster.config.JHipsterProperties; + +@Component +public class TokenProvider { + + private final Logger log = LoggerFactory.getLogger(TokenProvider.class); + + private static final String AUTHORITIES_KEY = "auth"; + + private final Key key; + + private final JwtParser jwtParser; + + private final long tokenValidityInMilliseconds; + + private final long tokenValidityInMillisecondsForRememberMe; + + public TokenProvider(JHipsterProperties jHipsterProperties) { + byte[] keyBytes; + String secret = jHipsterProperties.getSecurity().getAuthentication().getJwt().getBase64Secret(); + if (!ObjectUtils.isEmpty(secret)) { + log.debug("Using a Base64-encoded JWT secret key"); + keyBytes = Decoders.BASE64.decode(secret); + } else { + log.warn( + "Warning: the JWT key used is not Base64-encoded. " + + "We recommend using the `jhipster.security.authentication.jwt.base64-secret` key for optimum security." + ); + secret = jHipsterProperties.getSecurity().getAuthentication().getJwt().getSecret(); + keyBytes = secret.getBytes(StandardCharsets.UTF_8); + } + key = Keys.hmacShaKeyFor(keyBytes); + jwtParser = Jwts.parserBuilder().setSigningKey(key).build(); + this.tokenValidityInMilliseconds = 1000 * jHipsterProperties.getSecurity().getAuthentication().getJwt().getTokenValidityInSeconds(); + this.tokenValidityInMillisecondsForRememberMe = + 1000 * jHipsterProperties.getSecurity().getAuthentication().getJwt().getTokenValidityInSecondsForRememberMe(); + } + + public String createToken(Authentication authentication, boolean rememberMe) { + String authorities = authentication.getAuthorities().stream().map(GrantedAuthority::getAuthority).collect(Collectors.joining(",")); + + long now = (new Date()).getTime(); + Date validity; + if (rememberMe) { + validity = new Date(now + this.tokenValidityInMillisecondsForRememberMe); + } else { + validity = new Date(now + this.tokenValidityInMilliseconds); + } + + return Jwts + .builder() + .setSubject(authentication.getName()) + .claim(AUTHORITIES_KEY, authorities) + .signWith(key, SignatureAlgorithm.HS512) + .setExpiration(validity) + .compact(); + } + + public Authentication getAuthentication(String token) { + Claims claims = jwtParser.parseClaimsJws(token).getBody(); + + Collection authorities = Arrays + .stream(claims.get(AUTHORITIES_KEY).toString().split(",")) + .filter(auth -> !auth.trim().isEmpty()) + .map(SimpleGrantedAuthority::new) + .collect(Collectors.toList()); + + User principal = new User(claims.getSubject(), "", authorities); + + return new UsernamePasswordAuthenticationToken(principal, token, authorities); + } + + public boolean validateToken(String authToken) { + try { + jwtParser.parseClaimsJws(authToken); + return true; + } catch (JwtException | IllegalArgumentException e) { + log.info("Invalid JWT token."); + log.trace("Invalid JWT token trace.", e); + } + return false; + } +} diff --git a/src/main/java/org/datasurvey/security/package-info.java b/src/main/java/org/datasurvey/security/package-info.java new file mode 100644 index 0000000..8a8f4c1 --- /dev/null +++ b/src/main/java/org/datasurvey/security/package-info.java @@ -0,0 +1,4 @@ +/** + * Spring Security configuration. + */ +package org.datasurvey.security; diff --git a/src/main/java/org/datasurvey/service/CategoriaQueryService.java b/src/main/java/org/datasurvey/service/CategoriaQueryService.java new file mode 100644 index 0000000..4d865cb --- /dev/null +++ b/src/main/java/org/datasurvey/service/CategoriaQueryService.java @@ -0,0 +1,111 @@ +package org.datasurvey.service; + +import java.util.List; +import javax.persistence.criteria.JoinType; +import org.datasurvey.domain.*; // for static metamodels +import org.datasurvey.domain.Categoria; +import org.datasurvey.repository.CategoriaRepository; +import org.datasurvey.service.criteria.CategoriaCriteria; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import tech.jhipster.service.QueryService; + +/** + * Service for executing complex queries for {@link Categoria} entities in the database. + * The main input is a {@link CategoriaCriteria} which gets converted to {@link Specification}, + * in a way that all the filters must apply. + * It returns a {@link List} of {@link Categoria} or a {@link Page} of {@link Categoria} which fulfills the criteria. + */ +@Service +@Transactional(readOnly = true) +public class CategoriaQueryService extends QueryService { + + private final Logger log = LoggerFactory.getLogger(CategoriaQueryService.class); + + private final CategoriaRepository categoriaRepository; + + public CategoriaQueryService(CategoriaRepository categoriaRepository) { + this.categoriaRepository = categoriaRepository; + } + + /** + * Return a {@link List} of {@link Categoria} which matches the criteria from the database. + * @param criteria The object which holds all the filters, which the entities should match. + * @return the matching entities. + */ + @Transactional(readOnly = true) + public List findByCriteria(CategoriaCriteria criteria) { + log.debug("find by criteria : {}", criteria); + final Specification specification = createSpecification(criteria); + return categoriaRepository.findAll(specification); + } + + /** + * Return a {@link Page} of {@link Categoria} which matches the criteria from the database. + * @param criteria The object which holds all the filters, which the entities should match. + * @param page The page, which should be returned. + * @return the matching entities. + */ + @Transactional(readOnly = true) + public Page findByCriteria(CategoriaCriteria criteria, Pageable page) { + log.debug("find by criteria : {}, page: {}", criteria, page); + final Specification specification = createSpecification(criteria); + return categoriaRepository.findAll(specification, page); + } + + /** + * Return the number of matching entities in the database. + * @param criteria The object which holds all the filters, which the entities should match. + * @return the number of matching entities. + */ + @Transactional(readOnly = true) + public long countByCriteria(CategoriaCriteria criteria) { + log.debug("count by criteria : {}", criteria); + final Specification specification = createSpecification(criteria); + return categoriaRepository.count(specification); + } + + /** + * Function to convert {@link CategoriaCriteria} to a {@link Specification} + * @param criteria The object which holds all the filters, which the entities should match. + * @return the matching {@link Specification} of the entity. + */ + protected Specification createSpecification(CategoriaCriteria criteria) { + Specification specification = Specification.where(null); + if (criteria != null) { + if (criteria.getId() != null) { + specification = specification.and(buildRangeSpecification(criteria.getId(), Categoria_.id)); + } + if (criteria.getNombre() != null) { + specification = specification.and(buildStringSpecification(criteria.getNombre(), Categoria_.nombre)); + } + if (criteria.getEstado() != null) { + specification = specification.and(buildSpecification(criteria.getEstado(), Categoria_.estado)); + } + if (criteria.getEncuestaId() != null) { + specification = + specification.and( + buildSpecification( + criteria.getEncuestaId(), + root -> root.join(Categoria_.encuestas, JoinType.LEFT).get(Encuesta_.id) + ) + ); + } + if (criteria.getPlantillaId() != null) { + specification = + specification.and( + buildSpecification( + criteria.getPlantillaId(), + root -> root.join(Categoria_.plantillas, JoinType.LEFT).get(Plantilla_.id) + ) + ); + } + } + return specification; + } +} diff --git a/src/main/java/org/datasurvey/service/CategoriaService.java b/src/main/java/org/datasurvey/service/CategoriaService.java new file mode 100644 index 0000000..03adb4e --- /dev/null +++ b/src/main/java/org/datasurvey/service/CategoriaService.java @@ -0,0 +1,96 @@ +package org.datasurvey.service; + +import java.util.List; +import java.util.Optional; +import org.datasurvey.domain.Categoria; +import org.datasurvey.repository.CategoriaRepository; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * Service Implementation for managing {@link Categoria}. + */ +@Service +@Transactional +public class CategoriaService { + + private final Logger log = LoggerFactory.getLogger(CategoriaService.class); + + private final CategoriaRepository categoriaRepository; + + public CategoriaService(CategoriaRepository categoriaRepository) { + this.categoriaRepository = categoriaRepository; + } + + /** + * Save a categoria. + * + * @param categoria the entity to save. + * @return the persisted entity. + */ + public Categoria save(Categoria categoria) { + log.debug("Request to save Categoria : {}", categoria); + return categoriaRepository.save(categoria); + } + + /** + * Partially update a categoria. + * + * @param categoria the entity to update partially. + * @return the persisted entity. + */ + public Optional partialUpdate(Categoria categoria) { + log.debug("Request to partially update Categoria : {}", categoria); + + return categoriaRepository + .findById(categoria.getId()) + .map( + existingCategoria -> { + if (categoria.getNombre() != null) { + existingCategoria.setNombre(categoria.getNombre()); + } + if (categoria.getEstado() != null) { + existingCategoria.setEstado(categoria.getEstado()); + } + + return existingCategoria; + } + ) + .map(categoriaRepository::save); + } + + /** + * Get all the categorias. + * + * @return the list of entities. + */ + @Transactional(readOnly = true) + public List findAll() { + log.debug("Request to get all Categorias"); + return categoriaRepository.findAll(); + } + + /** + * Get one categoria by id. + * + * @param id the id of the entity. + * @return the entity. + */ + @Transactional(readOnly = true) + public Optional findOne(Long id) { + log.debug("Request to get Categoria : {}", id); + return categoriaRepository.findById(id); + } + + /** + * Delete the categoria by id. + * + * @param id the id of the entity. + */ + public void delete(Long id) { + log.debug("Request to delete Categoria : {}", id); + categoriaRepository.deleteById(id); + } +} diff --git a/src/main/java/org/datasurvey/service/EPreguntaAbiertaQueryService.java b/src/main/java/org/datasurvey/service/EPreguntaAbiertaQueryService.java new file mode 100644 index 0000000..1fa8ced --- /dev/null +++ b/src/main/java/org/datasurvey/service/EPreguntaAbiertaQueryService.java @@ -0,0 +1,115 @@ +package org.datasurvey.service; + +import java.util.List; +import javax.persistence.criteria.JoinType; +import org.datasurvey.domain.*; // for static metamodels +import org.datasurvey.domain.EPreguntaAbierta; +import org.datasurvey.repository.EPreguntaAbiertaRepository; +import org.datasurvey.service.criteria.EPreguntaAbiertaCriteria; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import tech.jhipster.service.QueryService; + +/** + * Service for executing complex queries for {@link EPreguntaAbierta} entities in the database. + * The main input is a {@link EPreguntaAbiertaCriteria} which gets converted to {@link Specification}, + * in a way that all the filters must apply. + * It returns a {@link List} of {@link EPreguntaAbierta} or a {@link Page} of {@link EPreguntaAbierta} which fulfills the criteria. + */ +@Service +@Transactional(readOnly = true) +public class EPreguntaAbiertaQueryService extends QueryService { + + private final Logger log = LoggerFactory.getLogger(EPreguntaAbiertaQueryService.class); + + private final EPreguntaAbiertaRepository ePreguntaAbiertaRepository; + + public EPreguntaAbiertaQueryService(EPreguntaAbiertaRepository ePreguntaAbiertaRepository) { + this.ePreguntaAbiertaRepository = ePreguntaAbiertaRepository; + } + + /** + * Return a {@link List} of {@link EPreguntaAbierta} which matches the criteria from the database. + * @param criteria The object which holds all the filters, which the entities should match. + * @return the matching entities. + */ + @Transactional(readOnly = true) + public List findByCriteria(EPreguntaAbiertaCriteria criteria) { + log.debug("find by criteria : {}", criteria); + final Specification specification = createSpecification(criteria); + return ePreguntaAbiertaRepository.findAll(specification); + } + + /** + * Return a {@link Page} of {@link EPreguntaAbierta} which matches the criteria from the database. + * @param criteria The object which holds all the filters, which the entities should match. + * @param page The page, which should be returned. + * @return the matching entities. + */ + @Transactional(readOnly = true) + public Page findByCriteria(EPreguntaAbiertaCriteria criteria, Pageable page) { + log.debug("find by criteria : {}, page: {}", criteria, page); + final Specification specification = createSpecification(criteria); + return ePreguntaAbiertaRepository.findAll(specification, page); + } + + /** + * Return the number of matching entities in the database. + * @param criteria The object which holds all the filters, which the entities should match. + * @return the number of matching entities. + */ + @Transactional(readOnly = true) + public long countByCriteria(EPreguntaAbiertaCriteria criteria) { + log.debug("count by criteria : {}", criteria); + final Specification specification = createSpecification(criteria); + return ePreguntaAbiertaRepository.count(specification); + } + + /** + * Function to convert {@link EPreguntaAbiertaCriteria} to a {@link Specification} + * @param criteria The object which holds all the filters, which the entities should match. + * @return the matching {@link Specification} of the entity. + */ + protected Specification createSpecification(EPreguntaAbiertaCriteria criteria) { + Specification specification = Specification.where(null); + if (criteria != null) { + if (criteria.getId() != null) { + specification = specification.and(buildRangeSpecification(criteria.getId(), EPreguntaAbierta_.id)); + } + if (criteria.getNombre() != null) { + specification = specification.and(buildStringSpecification(criteria.getNombre(), EPreguntaAbierta_.nombre)); + } + if (criteria.getOpcional() != null) { + specification = specification.and(buildSpecification(criteria.getOpcional(), EPreguntaAbierta_.opcional)); + } + if (criteria.getOrden() != null) { + specification = specification.and(buildRangeSpecification(criteria.getOrden(), EPreguntaAbierta_.orden)); + } + if (criteria.getEPreguntaAbiertaRespuestaId() != null) { + specification = + specification.and( + buildSpecification( + criteria.getEPreguntaAbiertaRespuestaId(), + root -> + root.join(EPreguntaAbierta_.ePreguntaAbiertaRespuestas, JoinType.LEFT).get(EPreguntaAbiertaRespuesta_.id) + ) + ); + } + if (criteria.getEncuestaId() != null) { + specification = + specification.and( + buildSpecification( + criteria.getEncuestaId(), + root -> root.join(EPreguntaAbierta_.encuesta, JoinType.LEFT).get(Encuesta_.id) + ) + ); + } + } + return specification; + } +} diff --git a/src/main/java/org/datasurvey/service/EPreguntaAbiertaRespuestaQueryService.java b/src/main/java/org/datasurvey/service/EPreguntaAbiertaRespuestaQueryService.java new file mode 100644 index 0000000..08a69c4 --- /dev/null +++ b/src/main/java/org/datasurvey/service/EPreguntaAbiertaRespuestaQueryService.java @@ -0,0 +1,99 @@ +package org.datasurvey.service; + +import java.util.List; +import javax.persistence.criteria.JoinType; +import org.datasurvey.domain.*; // for static metamodels +import org.datasurvey.domain.EPreguntaAbiertaRespuesta; +import org.datasurvey.repository.EPreguntaAbiertaRespuestaRepository; +import org.datasurvey.service.criteria.EPreguntaAbiertaRespuestaCriteria; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import tech.jhipster.service.QueryService; + +/** + * Service for executing complex queries for {@link EPreguntaAbiertaRespuesta} entities in the database. + * The main input is a {@link EPreguntaAbiertaRespuestaCriteria} which gets converted to {@link Specification}, + * in a way that all the filters must apply. + * It returns a {@link List} of {@link EPreguntaAbiertaRespuesta} or a {@link Page} of {@link EPreguntaAbiertaRespuesta} which fulfills the criteria. + */ +@Service +@Transactional(readOnly = true) +public class EPreguntaAbiertaRespuestaQueryService extends QueryService { + + private final Logger log = LoggerFactory.getLogger(EPreguntaAbiertaRespuestaQueryService.class); + + private final EPreguntaAbiertaRespuestaRepository ePreguntaAbiertaRespuestaRepository; + + public EPreguntaAbiertaRespuestaQueryService(EPreguntaAbiertaRespuestaRepository ePreguntaAbiertaRespuestaRepository) { + this.ePreguntaAbiertaRespuestaRepository = ePreguntaAbiertaRespuestaRepository; + } + + /** + * Return a {@link List} of {@link EPreguntaAbiertaRespuesta} which matches the criteria from the database. + * @param criteria The object which holds all the filters, which the entities should match. + * @return the matching entities. + */ + @Transactional(readOnly = true) + public List findByCriteria(EPreguntaAbiertaRespuestaCriteria criteria) { + log.debug("find by criteria : {}", criteria); + final Specification specification = createSpecification(criteria); + return ePreguntaAbiertaRespuestaRepository.findAll(specification); + } + + /** + * Return a {@link Page} of {@link EPreguntaAbiertaRespuesta} which matches the criteria from the database. + * @param criteria The object which holds all the filters, which the entities should match. + * @param page The page, which should be returned. + * @return the matching entities. + */ + @Transactional(readOnly = true) + public Page findByCriteria(EPreguntaAbiertaRespuestaCriteria criteria, Pageable page) { + log.debug("find by criteria : {}, page: {}", criteria, page); + final Specification specification = createSpecification(criteria); + return ePreguntaAbiertaRespuestaRepository.findAll(specification, page); + } + + /** + * Return the number of matching entities in the database. + * @param criteria The object which holds all the filters, which the entities should match. + * @return the number of matching entities. + */ + @Transactional(readOnly = true) + public long countByCriteria(EPreguntaAbiertaRespuestaCriteria criteria) { + log.debug("count by criteria : {}", criteria); + final Specification specification = createSpecification(criteria); + return ePreguntaAbiertaRespuestaRepository.count(specification); + } + + /** + * Function to convert {@link EPreguntaAbiertaRespuestaCriteria} to a {@link Specification} + * @param criteria The object which holds all the filters, which the entities should match. + * @return the matching {@link Specification} of the entity. + */ + protected Specification createSpecification(EPreguntaAbiertaRespuestaCriteria criteria) { + Specification specification = Specification.where(null); + if (criteria != null) { + if (criteria.getId() != null) { + specification = specification.and(buildRangeSpecification(criteria.getId(), EPreguntaAbiertaRespuesta_.id)); + } + if (criteria.getRespuesta() != null) { + specification = specification.and(buildStringSpecification(criteria.getRespuesta(), EPreguntaAbiertaRespuesta_.respuesta)); + } + if (criteria.getEPreguntaAbiertaId() != null) { + specification = + specification.and( + buildSpecification( + criteria.getEPreguntaAbiertaId(), + root -> root.join(EPreguntaAbiertaRespuesta_.ePreguntaAbierta, JoinType.LEFT).get(EPreguntaAbierta_.id) + ) + ); + } + } + return specification; + } +} diff --git a/src/main/java/org/datasurvey/service/EPreguntaAbiertaRespuestaService.java b/src/main/java/org/datasurvey/service/EPreguntaAbiertaRespuestaService.java new file mode 100644 index 0000000..323fd79 --- /dev/null +++ b/src/main/java/org/datasurvey/service/EPreguntaAbiertaRespuestaService.java @@ -0,0 +1,93 @@ +package org.datasurvey.service; + +import java.util.List; +import java.util.Optional; +import org.datasurvey.domain.EPreguntaAbiertaRespuesta; +import org.datasurvey.repository.EPreguntaAbiertaRespuestaRepository; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * Service Implementation for managing {@link EPreguntaAbiertaRespuesta}. + */ +@Service +@Transactional +public class EPreguntaAbiertaRespuestaService { + + private final Logger log = LoggerFactory.getLogger(EPreguntaAbiertaRespuestaService.class); + + private final EPreguntaAbiertaRespuestaRepository ePreguntaAbiertaRespuestaRepository; + + public EPreguntaAbiertaRespuestaService(EPreguntaAbiertaRespuestaRepository ePreguntaAbiertaRespuestaRepository) { + this.ePreguntaAbiertaRespuestaRepository = ePreguntaAbiertaRespuestaRepository; + } + + /** + * Save a ePreguntaAbiertaRespuesta. + * + * @param ePreguntaAbiertaRespuesta the entity to save. + * @return the persisted entity. + */ + public EPreguntaAbiertaRespuesta save(EPreguntaAbiertaRespuesta ePreguntaAbiertaRespuesta) { + log.debug("Request to save EPreguntaAbiertaRespuesta : {}", ePreguntaAbiertaRespuesta); + return ePreguntaAbiertaRespuestaRepository.save(ePreguntaAbiertaRespuesta); + } + + /** + * Partially update a ePreguntaAbiertaRespuesta. + * + * @param ePreguntaAbiertaRespuesta the entity to update partially. + * @return the persisted entity. + */ + public Optional partialUpdate(EPreguntaAbiertaRespuesta ePreguntaAbiertaRespuesta) { + log.debug("Request to partially update EPreguntaAbiertaRespuesta : {}", ePreguntaAbiertaRespuesta); + + return ePreguntaAbiertaRespuestaRepository + .findById(ePreguntaAbiertaRespuesta.getId()) + .map( + existingEPreguntaAbiertaRespuesta -> { + if (ePreguntaAbiertaRespuesta.getRespuesta() != null) { + existingEPreguntaAbiertaRespuesta.setRespuesta(ePreguntaAbiertaRespuesta.getRespuesta()); + } + + return existingEPreguntaAbiertaRespuesta; + } + ) + .map(ePreguntaAbiertaRespuestaRepository::save); + } + + /** + * Get all the ePreguntaAbiertaRespuestas. + * + * @return the list of entities. + */ + @Transactional(readOnly = true) + public List findAll() { + log.debug("Request to get all EPreguntaAbiertaRespuestas"); + return ePreguntaAbiertaRespuestaRepository.findAll(); + } + + /** + * Get one ePreguntaAbiertaRespuesta by id. + * + * @param id the id of the entity. + * @return the entity. + */ + @Transactional(readOnly = true) + public Optional findOne(Long id) { + log.debug("Request to get EPreguntaAbiertaRespuesta : {}", id); + return ePreguntaAbiertaRespuestaRepository.findById(id); + } + + /** + * Delete the ePreguntaAbiertaRespuesta by id. + * + * @param id the id of the entity. + */ + public void delete(Long id) { + log.debug("Request to delete EPreguntaAbiertaRespuesta : {}", id); + ePreguntaAbiertaRespuestaRepository.deleteById(id); + } +} diff --git a/src/main/java/org/datasurvey/service/EPreguntaAbiertaService.java b/src/main/java/org/datasurvey/service/EPreguntaAbiertaService.java new file mode 100644 index 0000000..f90fa0c --- /dev/null +++ b/src/main/java/org/datasurvey/service/EPreguntaAbiertaService.java @@ -0,0 +1,99 @@ +package org.datasurvey.service; + +import java.util.List; +import java.util.Optional; +import org.datasurvey.domain.EPreguntaAbierta; +import org.datasurvey.repository.EPreguntaAbiertaRepository; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * Service Implementation for managing {@link EPreguntaAbierta}. + */ +@Service +@Transactional +public class EPreguntaAbiertaService { + + private final Logger log = LoggerFactory.getLogger(EPreguntaAbiertaService.class); + + private final EPreguntaAbiertaRepository ePreguntaAbiertaRepository; + + public EPreguntaAbiertaService(EPreguntaAbiertaRepository ePreguntaAbiertaRepository) { + this.ePreguntaAbiertaRepository = ePreguntaAbiertaRepository; + } + + /** + * Save a ePreguntaAbierta. + * + * @param ePreguntaAbierta the entity to save. + * @return the persisted entity. + */ + public EPreguntaAbierta save(EPreguntaAbierta ePreguntaAbierta) { + log.debug("Request to save EPreguntaAbierta : {}", ePreguntaAbierta); + return ePreguntaAbiertaRepository.save(ePreguntaAbierta); + } + + /** + * Partially update a ePreguntaAbierta. + * + * @param ePreguntaAbierta the entity to update partially. + * @return the persisted entity. + */ + public Optional partialUpdate(EPreguntaAbierta ePreguntaAbierta) { + log.debug("Request to partially update EPreguntaAbierta : {}", ePreguntaAbierta); + + return ePreguntaAbiertaRepository + .findById(ePreguntaAbierta.getId()) + .map( + existingEPreguntaAbierta -> { + if (ePreguntaAbierta.getNombre() != null) { + existingEPreguntaAbierta.setNombre(ePreguntaAbierta.getNombre()); + } + if (ePreguntaAbierta.getOpcional() != null) { + existingEPreguntaAbierta.setOpcional(ePreguntaAbierta.getOpcional()); + } + if (ePreguntaAbierta.getOrden() != null) { + existingEPreguntaAbierta.setOrden(ePreguntaAbierta.getOrden()); + } + + return existingEPreguntaAbierta; + } + ) + .map(ePreguntaAbiertaRepository::save); + } + + /** + * Get all the ePreguntaAbiertas. + * + * @return the list of entities. + */ + @Transactional(readOnly = true) + public List findAll() { + log.debug("Request to get all EPreguntaAbiertas"); + return ePreguntaAbiertaRepository.findAll(); + } + + /** + * Get one ePreguntaAbierta by id. + * + * @param id the id of the entity. + * @return the entity. + */ + @Transactional(readOnly = true) + public Optional findOne(Long id) { + log.debug("Request to get EPreguntaAbierta : {}", id); + return ePreguntaAbiertaRepository.findById(id); + } + + /** + * Delete the ePreguntaAbierta by id. + * + * @param id the id of the entity. + */ + public void delete(Long id) { + log.debug("Request to delete EPreguntaAbierta : {}", id); + ePreguntaAbiertaRepository.deleteById(id); + } +} diff --git a/src/main/java/org/datasurvey/service/EPreguntaCerradaOpcionQueryService.java b/src/main/java/org/datasurvey/service/EPreguntaCerradaOpcionQueryService.java new file mode 100644 index 0000000..7af3d17 --- /dev/null +++ b/src/main/java/org/datasurvey/service/EPreguntaCerradaOpcionQueryService.java @@ -0,0 +1,105 @@ +package org.datasurvey.service; + +import java.util.List; +import javax.persistence.criteria.JoinType; +import org.datasurvey.domain.*; // for static metamodels +import org.datasurvey.domain.EPreguntaCerradaOpcion; +import org.datasurvey.repository.EPreguntaCerradaOpcionRepository; +import org.datasurvey.service.criteria.EPreguntaCerradaOpcionCriteria; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import tech.jhipster.service.QueryService; + +/** + * Service for executing complex queries for {@link EPreguntaCerradaOpcion} entities in the database. + * The main input is a {@link EPreguntaCerradaOpcionCriteria} which gets converted to {@link Specification}, + * in a way that all the filters must apply. + * It returns a {@link List} of {@link EPreguntaCerradaOpcion} or a {@link Page} of {@link EPreguntaCerradaOpcion} which fulfills the criteria. + */ +@Service +@Transactional(readOnly = true) +public class EPreguntaCerradaOpcionQueryService extends QueryService { + + private final Logger log = LoggerFactory.getLogger(EPreguntaCerradaOpcionQueryService.class); + + private final EPreguntaCerradaOpcionRepository ePreguntaCerradaOpcionRepository; + + public EPreguntaCerradaOpcionQueryService(EPreguntaCerradaOpcionRepository ePreguntaCerradaOpcionRepository) { + this.ePreguntaCerradaOpcionRepository = ePreguntaCerradaOpcionRepository; + } + + /** + * Return a {@link List} of {@link EPreguntaCerradaOpcion} which matches the criteria from the database. + * @param criteria The object which holds all the filters, which the entities should match. + * @return the matching entities. + */ + @Transactional(readOnly = true) + public List findByCriteria(EPreguntaCerradaOpcionCriteria criteria) { + log.debug("find by criteria : {}", criteria); + final Specification specification = createSpecification(criteria); + return ePreguntaCerradaOpcionRepository.findAll(specification); + } + + /** + * Return a {@link Page} of {@link EPreguntaCerradaOpcion} which matches the criteria from the database. + * @param criteria The object which holds all the filters, which the entities should match. + * @param page The page, which should be returned. + * @return the matching entities. + */ + @Transactional(readOnly = true) + public Page findByCriteria(EPreguntaCerradaOpcionCriteria criteria, Pageable page) { + log.debug("find by criteria : {}, page: {}", criteria, page); + final Specification specification = createSpecification(criteria); + return ePreguntaCerradaOpcionRepository.findAll(specification, page); + } + + /** + * Return the number of matching entities in the database. + * @param criteria The object which holds all the filters, which the entities should match. + * @return the number of matching entities. + */ + @Transactional(readOnly = true) + public long countByCriteria(EPreguntaCerradaOpcionCriteria criteria) { + log.debug("count by criteria : {}", criteria); + final Specification specification = createSpecification(criteria); + return ePreguntaCerradaOpcionRepository.count(specification); + } + + /** + * Function to convert {@link EPreguntaCerradaOpcionCriteria} to a {@link Specification} + * @param criteria The object which holds all the filters, which the entities should match. + * @return the matching {@link Specification} of the entity. + */ + protected Specification createSpecification(EPreguntaCerradaOpcionCriteria criteria) { + Specification specification = Specification.where(null); + if (criteria != null) { + if (criteria.getId() != null) { + specification = specification.and(buildRangeSpecification(criteria.getId(), EPreguntaCerradaOpcion_.id)); + } + if (criteria.getNombre() != null) { + specification = specification.and(buildStringSpecification(criteria.getNombre(), EPreguntaCerradaOpcion_.nombre)); + } + if (criteria.getOrden() != null) { + specification = specification.and(buildRangeSpecification(criteria.getOrden(), EPreguntaCerradaOpcion_.orden)); + } + if (criteria.getCantidad() != null) { + specification = specification.and(buildRangeSpecification(criteria.getCantidad(), EPreguntaCerradaOpcion_.cantidad)); + } + if (criteria.getEPreguntaCerradaId() != null) { + specification = + specification.and( + buildSpecification( + criteria.getEPreguntaCerradaId(), + root -> root.join(EPreguntaCerradaOpcion_.ePreguntaCerrada, JoinType.LEFT).get(EPreguntaCerrada_.id) + ) + ); + } + } + return specification; + } +} diff --git a/src/main/java/org/datasurvey/service/EPreguntaCerradaOpcionService.java b/src/main/java/org/datasurvey/service/EPreguntaCerradaOpcionService.java new file mode 100644 index 0000000..bba3ae7 --- /dev/null +++ b/src/main/java/org/datasurvey/service/EPreguntaCerradaOpcionService.java @@ -0,0 +1,99 @@ +package org.datasurvey.service; + +import java.util.List; +import java.util.Optional; +import org.datasurvey.domain.EPreguntaCerradaOpcion; +import org.datasurvey.repository.EPreguntaCerradaOpcionRepository; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * Service Implementation for managing {@link EPreguntaCerradaOpcion}. + */ +@Service +@Transactional +public class EPreguntaCerradaOpcionService { + + private final Logger log = LoggerFactory.getLogger(EPreguntaCerradaOpcionService.class); + + private final EPreguntaCerradaOpcionRepository ePreguntaCerradaOpcionRepository; + + public EPreguntaCerradaOpcionService(EPreguntaCerradaOpcionRepository ePreguntaCerradaOpcionRepository) { + this.ePreguntaCerradaOpcionRepository = ePreguntaCerradaOpcionRepository; + } + + /** + * Save a ePreguntaCerradaOpcion. + * + * @param ePreguntaCerradaOpcion the entity to save. + * @return the persisted entity. + */ + public EPreguntaCerradaOpcion save(EPreguntaCerradaOpcion ePreguntaCerradaOpcion) { + log.debug("Request to save EPreguntaCerradaOpcion : {}", ePreguntaCerradaOpcion); + return ePreguntaCerradaOpcionRepository.save(ePreguntaCerradaOpcion); + } + + /** + * Partially update a ePreguntaCerradaOpcion. + * + * @param ePreguntaCerradaOpcion the entity to update partially. + * @return the persisted entity. + */ + public Optional partialUpdate(EPreguntaCerradaOpcion ePreguntaCerradaOpcion) { + log.debug("Request to partially update EPreguntaCerradaOpcion : {}", ePreguntaCerradaOpcion); + + return ePreguntaCerradaOpcionRepository + .findById(ePreguntaCerradaOpcion.getId()) + .map( + existingEPreguntaCerradaOpcion -> { + if (ePreguntaCerradaOpcion.getNombre() != null) { + existingEPreguntaCerradaOpcion.setNombre(ePreguntaCerradaOpcion.getNombre()); + } + if (ePreguntaCerradaOpcion.getOrden() != null) { + existingEPreguntaCerradaOpcion.setOrden(ePreguntaCerradaOpcion.getOrden()); + } + if (ePreguntaCerradaOpcion.getCantidad() != null) { + existingEPreguntaCerradaOpcion.setCantidad(ePreguntaCerradaOpcion.getCantidad()); + } + + return existingEPreguntaCerradaOpcion; + } + ) + .map(ePreguntaCerradaOpcionRepository::save); + } + + /** + * Get all the ePreguntaCerradaOpcions. + * + * @return the list of entities. + */ + @Transactional(readOnly = true) + public List findAll() { + log.debug("Request to get all EPreguntaCerradaOpcions"); + return ePreguntaCerradaOpcionRepository.findAll(); + } + + /** + * Get one ePreguntaCerradaOpcion by id. + * + * @param id the id of the entity. + * @return the entity. + */ + @Transactional(readOnly = true) + public Optional findOne(Long id) { + log.debug("Request to get EPreguntaCerradaOpcion : {}", id); + return ePreguntaCerradaOpcionRepository.findById(id); + } + + /** + * Delete the ePreguntaCerradaOpcion by id. + * + * @param id the id of the entity. + */ + public void delete(Long id) { + log.debug("Request to delete EPreguntaCerradaOpcion : {}", id); + ePreguntaCerradaOpcionRepository.deleteById(id); + } +} diff --git a/src/main/java/org/datasurvey/service/EPreguntaCerradaQueryService.java b/src/main/java/org/datasurvey/service/EPreguntaCerradaQueryService.java new file mode 100644 index 0000000..a5075b1 --- /dev/null +++ b/src/main/java/org/datasurvey/service/EPreguntaCerradaQueryService.java @@ -0,0 +1,117 @@ +package org.datasurvey.service; + +import java.util.List; +import javax.persistence.criteria.JoinType; +import org.datasurvey.domain.*; // for static metamodels +import org.datasurvey.domain.EPreguntaCerrada; +import org.datasurvey.repository.EPreguntaCerradaRepository; +import org.datasurvey.service.criteria.EPreguntaCerradaCriteria; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import tech.jhipster.service.QueryService; + +/** + * Service for executing complex queries for {@link EPreguntaCerrada} entities in the database. + * The main input is a {@link EPreguntaCerradaCriteria} which gets converted to {@link Specification}, + * in a way that all the filters must apply. + * It returns a {@link List} of {@link EPreguntaCerrada} or a {@link Page} of {@link EPreguntaCerrada} which fulfills the criteria. + */ +@Service +@Transactional(readOnly = true) +public class EPreguntaCerradaQueryService extends QueryService { + + private final Logger log = LoggerFactory.getLogger(EPreguntaCerradaQueryService.class); + + private final EPreguntaCerradaRepository ePreguntaCerradaRepository; + + public EPreguntaCerradaQueryService(EPreguntaCerradaRepository ePreguntaCerradaRepository) { + this.ePreguntaCerradaRepository = ePreguntaCerradaRepository; + } + + /** + * Return a {@link List} of {@link EPreguntaCerrada} which matches the criteria from the database. + * @param criteria The object which holds all the filters, which the entities should match. + * @return the matching entities. + */ + @Transactional(readOnly = true) + public List findByCriteria(EPreguntaCerradaCriteria criteria) { + log.debug("find by criteria : {}", criteria); + final Specification specification = createSpecification(criteria); + return ePreguntaCerradaRepository.findAll(specification); + } + + /** + * Return a {@link Page} of {@link EPreguntaCerrada} which matches the criteria from the database. + * @param criteria The object which holds all the filters, which the entities should match. + * @param page The page, which should be returned. + * @return the matching entities. + */ + @Transactional(readOnly = true) + public Page findByCriteria(EPreguntaCerradaCriteria criteria, Pageable page) { + log.debug("find by criteria : {}, page: {}", criteria, page); + final Specification specification = createSpecification(criteria); + return ePreguntaCerradaRepository.findAll(specification, page); + } + + /** + * Return the number of matching entities in the database. + * @param criteria The object which holds all the filters, which the entities should match. + * @return the number of matching entities. + */ + @Transactional(readOnly = true) + public long countByCriteria(EPreguntaCerradaCriteria criteria) { + log.debug("count by criteria : {}", criteria); + final Specification specification = createSpecification(criteria); + return ePreguntaCerradaRepository.count(specification); + } + + /** + * Function to convert {@link EPreguntaCerradaCriteria} to a {@link Specification} + * @param criteria The object which holds all the filters, which the entities should match. + * @return the matching {@link Specification} of the entity. + */ + protected Specification createSpecification(EPreguntaCerradaCriteria criteria) { + Specification specification = Specification.where(null); + if (criteria != null) { + if (criteria.getId() != null) { + specification = specification.and(buildRangeSpecification(criteria.getId(), EPreguntaCerrada_.id)); + } + if (criteria.getNombre() != null) { + specification = specification.and(buildStringSpecification(criteria.getNombre(), EPreguntaCerrada_.nombre)); + } + if (criteria.getTipo() != null) { + specification = specification.and(buildSpecification(criteria.getTipo(), EPreguntaCerrada_.tipo)); + } + if (criteria.getOpcional() != null) { + specification = specification.and(buildSpecification(criteria.getOpcional(), EPreguntaCerrada_.opcional)); + } + if (criteria.getOrden() != null) { + specification = specification.and(buildRangeSpecification(criteria.getOrden(), EPreguntaCerrada_.orden)); + } + if (criteria.getEPreguntaCerradaOpcionId() != null) { + specification = + specification.and( + buildSpecification( + criteria.getEPreguntaCerradaOpcionId(), + root -> root.join(EPreguntaCerrada_.ePreguntaCerradaOpcions, JoinType.LEFT).get(EPreguntaCerradaOpcion_.id) + ) + ); + } + if (criteria.getEncuestaId() != null) { + specification = + specification.and( + buildSpecification( + criteria.getEncuestaId(), + root -> root.join(EPreguntaCerrada_.encuesta, JoinType.LEFT).get(Encuesta_.id) + ) + ); + } + } + return specification; + } +} diff --git a/src/main/java/org/datasurvey/service/EPreguntaCerradaService.java b/src/main/java/org/datasurvey/service/EPreguntaCerradaService.java new file mode 100644 index 0000000..fb39398 --- /dev/null +++ b/src/main/java/org/datasurvey/service/EPreguntaCerradaService.java @@ -0,0 +1,102 @@ +package org.datasurvey.service; + +import java.util.List; +import java.util.Optional; +import org.datasurvey.domain.EPreguntaCerrada; +import org.datasurvey.repository.EPreguntaCerradaRepository; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * Service Implementation for managing {@link EPreguntaCerrada}. + */ +@Service +@Transactional +public class EPreguntaCerradaService { + + private final Logger log = LoggerFactory.getLogger(EPreguntaCerradaService.class); + + private final EPreguntaCerradaRepository ePreguntaCerradaRepository; + + public EPreguntaCerradaService(EPreguntaCerradaRepository ePreguntaCerradaRepository) { + this.ePreguntaCerradaRepository = ePreguntaCerradaRepository; + } + + /** + * Save a ePreguntaCerrada. + * + * @param ePreguntaCerrada the entity to save. + * @return the persisted entity. + */ + public EPreguntaCerrada save(EPreguntaCerrada ePreguntaCerrada) { + log.debug("Request to save EPreguntaCerrada : {}", ePreguntaCerrada); + return ePreguntaCerradaRepository.save(ePreguntaCerrada); + } + + /** + * Partially update a ePreguntaCerrada. + * + * @param ePreguntaCerrada the entity to update partially. + * @return the persisted entity. + */ + public Optional partialUpdate(EPreguntaCerrada ePreguntaCerrada) { + log.debug("Request to partially update EPreguntaCerrada : {}", ePreguntaCerrada); + + return ePreguntaCerradaRepository + .findById(ePreguntaCerrada.getId()) + .map( + existingEPreguntaCerrada -> { + if (ePreguntaCerrada.getNombre() != null) { + existingEPreguntaCerrada.setNombre(ePreguntaCerrada.getNombre()); + } + if (ePreguntaCerrada.getTipo() != null) { + existingEPreguntaCerrada.setTipo(ePreguntaCerrada.getTipo()); + } + if (ePreguntaCerrada.getOpcional() != null) { + existingEPreguntaCerrada.setOpcional(ePreguntaCerrada.getOpcional()); + } + if (ePreguntaCerrada.getOrden() != null) { + existingEPreguntaCerrada.setOrden(ePreguntaCerrada.getOrden()); + } + + return existingEPreguntaCerrada; + } + ) + .map(ePreguntaCerradaRepository::save); + } + + /** + * Get all the ePreguntaCerradas. + * + * @return the list of entities. + */ + @Transactional(readOnly = true) + public List findAll() { + log.debug("Request to get all EPreguntaCerradas"); + return ePreguntaCerradaRepository.findAll(); + } + + /** + * Get one ePreguntaCerrada by id. + * + * @param id the id of the entity. + * @return the entity. + */ + @Transactional(readOnly = true) + public Optional findOne(Long id) { + log.debug("Request to get EPreguntaCerrada : {}", id); + return ePreguntaCerradaRepository.findById(id); + } + + /** + * Delete the ePreguntaCerrada by id. + * + * @param id the id of the entity. + */ + public void delete(Long id) { + log.debug("Request to delete EPreguntaCerrada : {}", id); + ePreguntaCerradaRepository.deleteById(id); + } +} diff --git a/src/main/java/org/datasurvey/service/EmailAlreadyUsedException.java b/src/main/java/org/datasurvey/service/EmailAlreadyUsedException.java new file mode 100644 index 0000000..d2cefea --- /dev/null +++ b/src/main/java/org/datasurvey/service/EmailAlreadyUsedException.java @@ -0,0 +1,10 @@ +package org.datasurvey.service; + +public class EmailAlreadyUsedException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + public EmailAlreadyUsedException() { + super("Email is already in use!"); + } +} diff --git a/src/main/java/org/datasurvey/service/EncuestaQueryService.java b/src/main/java/org/datasurvey/service/EncuestaQueryService.java new file mode 100644 index 0000000..055eee5 --- /dev/null +++ b/src/main/java/org/datasurvey/service/EncuestaQueryService.java @@ -0,0 +1,162 @@ +package org.datasurvey.service; + +import java.util.List; +import javax.persistence.criteria.JoinType; +import org.datasurvey.domain.*; // for static metamodels +import org.datasurvey.domain.Encuesta; +import org.datasurvey.repository.EncuestaRepository; +import org.datasurvey.service.criteria.EncuestaCriteria; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import tech.jhipster.service.QueryService; + +/** + * Service for executing complex queries for {@link Encuesta} entities in the database. + * The main input is a {@link EncuestaCriteria} which gets converted to {@link Specification}, + * in a way that all the filters must apply. + * It returns a {@link List} of {@link Encuesta} or a {@link Page} of {@link Encuesta} which fulfills the criteria. + */ +@Service +@Transactional(readOnly = true) +public class EncuestaQueryService extends QueryService { + + private final Logger log = LoggerFactory.getLogger(EncuestaQueryService.class); + + private final EncuestaRepository encuestaRepository; + + public EncuestaQueryService(EncuestaRepository encuestaRepository) { + this.encuestaRepository = encuestaRepository; + } + + /** + * Return a {@link List} of {@link Encuesta} which matches the criteria from the database. + * @param criteria The object which holds all the filters, which the entities should match. + * @return the matching entities. + */ + @Transactional(readOnly = true) + public List findByCriteria(EncuestaCriteria criteria) { + log.debug("find by criteria : {}", criteria); + final Specification specification = createSpecification(criteria); + return encuestaRepository.findAll(specification); + } + + /** + * Return a {@link Page} of {@link Encuesta} which matches the criteria from the database. + * @param criteria The object which holds all the filters, which the entities should match. + * @param page The page, which should be returned. + * @return the matching entities. + */ + @Transactional(readOnly = true) + public Page findByCriteria(EncuestaCriteria criteria, Pageable page) { + log.debug("find by criteria : {}, page: {}", criteria, page); + final Specification specification = createSpecification(criteria); + return encuestaRepository.findAll(specification, page); + } + + /** + * Return the number of matching entities in the database. + * @param criteria The object which holds all the filters, which the entities should match. + * @return the number of matching entities. + */ + @Transactional(readOnly = true) + public long countByCriteria(EncuestaCriteria criteria) { + log.debug("count by criteria : {}", criteria); + final Specification specification = createSpecification(criteria); + return encuestaRepository.count(specification); + } + + /** + * Function to convert {@link EncuestaCriteria} to a {@link Specification} + * @param criteria The object which holds all the filters, which the entities should match. + * @return the matching {@link Specification} of the entity. + */ + protected Specification createSpecification(EncuestaCriteria criteria) { + Specification specification = Specification.where(null); + if (criteria != null) { + if (criteria.getId() != null) { + specification = specification.and(buildRangeSpecification(criteria.getId(), Encuesta_.id)); + } + if (criteria.getNombre() != null) { + specification = specification.and(buildStringSpecification(criteria.getNombre(), Encuesta_.nombre)); + } + if (criteria.getDescripcion() != null) { + specification = specification.and(buildStringSpecification(criteria.getDescripcion(), Encuesta_.descripcion)); + } + if (criteria.getFechaCreacion() != null) { + specification = specification.and(buildRangeSpecification(criteria.getFechaCreacion(), Encuesta_.fechaCreacion)); + } + if (criteria.getFechaPublicacion() != null) { + specification = specification.and(buildRangeSpecification(criteria.getFechaPublicacion(), Encuesta_.fechaPublicacion)); + } + if (criteria.getFechaFinalizar() != null) { + specification = specification.and(buildRangeSpecification(criteria.getFechaFinalizar(), Encuesta_.fechaFinalizar)); + } + if (criteria.getFechaFinalizada() != null) { + specification = specification.and(buildRangeSpecification(criteria.getFechaFinalizada(), Encuesta_.fechaFinalizada)); + } + if (criteria.getCalificacion() != null) { + specification = specification.and(buildRangeSpecification(criteria.getCalificacion(), Encuesta_.calificacion)); + } + if (criteria.getAcceso() != null) { + specification = specification.and(buildSpecification(criteria.getAcceso(), Encuesta_.acceso)); + } + if (criteria.getContrasenna() != null) { + specification = specification.and(buildStringSpecification(criteria.getContrasenna(), Encuesta_.contrasenna)); + } + if (criteria.getEstado() != null) { + specification = specification.and(buildSpecification(criteria.getEstado(), Encuesta_.estado)); + } + if (criteria.getUsuarioEncuestaId() != null) { + specification = + specification.and( + buildSpecification( + criteria.getUsuarioEncuestaId(), + root -> root.join(Encuesta_.usuarioEncuestas, JoinType.LEFT).get(UsuarioEncuesta_.id) + ) + ); + } + if (criteria.getEPreguntaAbiertaId() != null) { + specification = + specification.and( + buildSpecification( + criteria.getEPreguntaAbiertaId(), + root -> root.join(Encuesta_.ePreguntaAbiertas, JoinType.LEFT).get(EPreguntaAbierta_.id) + ) + ); + } + if (criteria.getEPreguntaCerradaId() != null) { + specification = + specification.and( + buildSpecification( + criteria.getEPreguntaCerradaId(), + root -> root.join(Encuesta_.ePreguntaCerradas, JoinType.LEFT).get(EPreguntaCerrada_.id) + ) + ); + } + if (criteria.getCategoriaId() != null) { + specification = + specification.and( + buildSpecification( + criteria.getCategoriaId(), + root -> root.join(Encuesta_.categoria, JoinType.LEFT).get(Categoria_.id) + ) + ); + } + if (criteria.getUsuarioExtraId() != null) { + specification = + specification.and( + buildSpecification( + criteria.getUsuarioExtraId(), + root -> root.join(Encuesta_.usuarioExtra, JoinType.LEFT).get(UsuarioExtra_.id) + ) + ); + } + } + return specification; + } +} diff --git a/src/main/java/org/datasurvey/service/EncuestaService.java b/src/main/java/org/datasurvey/service/EncuestaService.java new file mode 100644 index 0000000..3ac10a5 --- /dev/null +++ b/src/main/java/org/datasurvey/service/EncuestaService.java @@ -0,0 +1,120 @@ +package org.datasurvey.service; + +import java.util.List; +import java.util.Optional; +import org.datasurvey.domain.Encuesta; +import org.datasurvey.repository.EncuestaRepository; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * Service Implementation for managing {@link Encuesta}. + */ +@Service +@Transactional +public class EncuestaService { + + private final Logger log = LoggerFactory.getLogger(EncuestaService.class); + + private final EncuestaRepository encuestaRepository; + + public EncuestaService(EncuestaRepository encuestaRepository) { + this.encuestaRepository = encuestaRepository; + } + + /** + * Save a encuesta. + * + * @param encuesta the entity to save. + * @return the persisted entity. + */ + public Encuesta save(Encuesta encuesta) { + log.debug("Request to save Encuesta : {}", encuesta); + return encuestaRepository.save(encuesta); + } + + /** + * Partially update a encuesta. + * + * @param encuesta the entity to update partially. + * @return the persisted entity. + */ + public Optional partialUpdate(Encuesta encuesta) { + log.debug("Request to partially update Encuesta : {}", encuesta); + + return encuestaRepository + .findById(encuesta.getId()) + .map( + existingEncuesta -> { + if (encuesta.getNombre() != null) { + existingEncuesta.setNombre(encuesta.getNombre()); + } + if (encuesta.getDescripcion() != null) { + existingEncuesta.setDescripcion(encuesta.getDescripcion()); + } + if (encuesta.getFechaCreacion() != null) { + existingEncuesta.setFechaCreacion(encuesta.getFechaCreacion()); + } + if (encuesta.getFechaPublicacion() != null) { + existingEncuesta.setFechaPublicacion(encuesta.getFechaPublicacion()); + } + if (encuesta.getFechaFinalizar() != null) { + existingEncuesta.setFechaFinalizar(encuesta.getFechaFinalizar()); + } + if (encuesta.getFechaFinalizada() != null) { + existingEncuesta.setFechaFinalizada(encuesta.getFechaFinalizada()); + } + if (encuesta.getCalificacion() != null) { + existingEncuesta.setCalificacion(encuesta.getCalificacion()); + } + if (encuesta.getAcceso() != null) { + existingEncuesta.setAcceso(encuesta.getAcceso()); + } + if (encuesta.getContrasenna() != null) { + existingEncuesta.setContrasenna(encuesta.getContrasenna()); + } + if (encuesta.getEstado() != null) { + existingEncuesta.setEstado(encuesta.getEstado()); + } + + return existingEncuesta; + } + ) + .map(encuestaRepository::save); + } + + /** + * Get all the encuestas. + * + * @return the list of entities. + */ + @Transactional(readOnly = true) + public List findAll() { + log.debug("Request to get all Encuestas"); + return encuestaRepository.findAll(); + } + + /** + * Get one encuesta by id. + * + * @param id the id of the entity. + * @return the entity. + */ + @Transactional(readOnly = true) + public Optional findOne(Long id) { + log.debug("Request to get Encuesta : {}", id); + return encuestaRepository.findById(id); + } + + /** + * Delete the encuesta by id. + * + * @param id the id of the entity. + */ + public void delete(Long id) { + log.debug("Request to delete Encuesta : {}", id); + encuestaRepository.deleteById(id); + } +} diff --git a/src/main/java/org/datasurvey/service/FacturaQueryService.java b/src/main/java/org/datasurvey/service/FacturaQueryService.java new file mode 100644 index 0000000..7cf06ac --- /dev/null +++ b/src/main/java/org/datasurvey/service/FacturaQueryService.java @@ -0,0 +1,99 @@ +package org.datasurvey.service; + +import java.util.List; +import javax.persistence.criteria.JoinType; +import org.datasurvey.domain.*; // for static metamodels +import org.datasurvey.domain.Factura; +import org.datasurvey.repository.FacturaRepository; +import org.datasurvey.service.criteria.FacturaCriteria; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import tech.jhipster.service.QueryService; + +/** + * Service for executing complex queries for {@link Factura} entities in the database. + * The main input is a {@link FacturaCriteria} which gets converted to {@link Specification}, + * in a way that all the filters must apply. + * It returns a {@link List} of {@link Factura} or a {@link Page} of {@link Factura} which fulfills the criteria. + */ +@Service +@Transactional(readOnly = true) +public class FacturaQueryService extends QueryService { + + private final Logger log = LoggerFactory.getLogger(FacturaQueryService.class); + + private final FacturaRepository facturaRepository; + + public FacturaQueryService(FacturaRepository facturaRepository) { + this.facturaRepository = facturaRepository; + } + + /** + * Return a {@link List} of {@link Factura} which matches the criteria from the database. + * @param criteria The object which holds all the filters, which the entities should match. + * @return the matching entities. + */ + @Transactional(readOnly = true) + public List findByCriteria(FacturaCriteria criteria) { + log.debug("find by criteria : {}", criteria); + final Specification specification = createSpecification(criteria); + return facturaRepository.findAll(specification); + } + + /** + * Return a {@link Page} of {@link Factura} which matches the criteria from the database. + * @param criteria The object which holds all the filters, which the entities should match. + * @param page The page, which should be returned. + * @return the matching entities. + */ + @Transactional(readOnly = true) + public Page findByCriteria(FacturaCriteria criteria, Pageable page) { + log.debug("find by criteria : {}, page: {}", criteria, page); + final Specification specification = createSpecification(criteria); + return facturaRepository.findAll(specification, page); + } + + /** + * Return the number of matching entities in the database. + * @param criteria The object which holds all the filters, which the entities should match. + * @return the number of matching entities. + */ + @Transactional(readOnly = true) + public long countByCriteria(FacturaCriteria criteria) { + log.debug("count by criteria : {}", criteria); + final Specification specification = createSpecification(criteria); + return facturaRepository.count(specification); + } + + /** + * Function to convert {@link FacturaCriteria} to a {@link Specification} + * @param criteria The object which holds all the filters, which the entities should match. + * @return the matching {@link Specification} of the entity. + */ + protected Specification createSpecification(FacturaCriteria criteria) { + Specification specification = Specification.where(null); + if (criteria != null) { + if (criteria.getId() != null) { + specification = specification.and(buildRangeSpecification(criteria.getId(), Factura_.id)); + } + if (criteria.getNombreUsuario() != null) { + specification = specification.and(buildStringSpecification(criteria.getNombreUsuario(), Factura_.nombreUsuario)); + } + if (criteria.getNombrePlantilla() != null) { + specification = specification.and(buildStringSpecification(criteria.getNombrePlantilla(), Factura_.nombrePlantilla)); + } + if (criteria.getCosto() != null) { + specification = specification.and(buildRangeSpecification(criteria.getCosto(), Factura_.costo)); + } + if (criteria.getFecha() != null) { + specification = specification.and(buildRangeSpecification(criteria.getFecha(), Factura_.fecha)); + } + } + return specification; + } +} diff --git a/src/main/java/org/datasurvey/service/FacturaService.java b/src/main/java/org/datasurvey/service/FacturaService.java new file mode 100644 index 0000000..75c244c --- /dev/null +++ b/src/main/java/org/datasurvey/service/FacturaService.java @@ -0,0 +1,102 @@ +package org.datasurvey.service; + +import java.util.List; +import java.util.Optional; +import org.datasurvey.domain.Factura; +import org.datasurvey.repository.FacturaRepository; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * Service Implementation for managing {@link Factura}. + */ +@Service +@Transactional +public class FacturaService { + + private final Logger log = LoggerFactory.getLogger(FacturaService.class); + + private final FacturaRepository facturaRepository; + + public FacturaService(FacturaRepository facturaRepository) { + this.facturaRepository = facturaRepository; + } + + /** + * Save a factura. + * + * @param factura the entity to save. + * @return the persisted entity. + */ + public Factura save(Factura factura) { + log.debug("Request to save Factura : {}", factura); + return facturaRepository.save(factura); + } + + /** + * Partially update a factura. + * + * @param factura the entity to update partially. + * @return the persisted entity. + */ + public Optional partialUpdate(Factura factura) { + log.debug("Request to partially update Factura : {}", factura); + + return facturaRepository + .findById(factura.getId()) + .map( + existingFactura -> { + if (factura.getNombreUsuario() != null) { + existingFactura.setNombreUsuario(factura.getNombreUsuario()); + } + if (factura.getNombrePlantilla() != null) { + existingFactura.setNombrePlantilla(factura.getNombrePlantilla()); + } + if (factura.getCosto() != null) { + existingFactura.setCosto(factura.getCosto()); + } + if (factura.getFecha() != null) { + existingFactura.setFecha(factura.getFecha()); + } + + return existingFactura; + } + ) + .map(facturaRepository::save); + } + + /** + * Get all the facturas. + * + * @return the list of entities. + */ + @Transactional(readOnly = true) + public List findAll() { + log.debug("Request to get all Facturas"); + return facturaRepository.findAll(); + } + + /** + * Get one factura by id. + * + * @param id the id of the entity. + * @return the entity. + */ + @Transactional(readOnly = true) + public Optional findOne(Long id) { + log.debug("Request to get Factura : {}", id); + return facturaRepository.findById(id); + } + + /** + * Delete the factura by id. + * + * @param id the id of the entity. + */ + public void delete(Long id) { + log.debug("Request to delete Factura : {}", id); + facturaRepository.deleteById(id); + } +} diff --git a/src/main/java/org/datasurvey/service/InvalidPasswordException.java b/src/main/java/org/datasurvey/service/InvalidPasswordException.java new file mode 100644 index 0000000..f63b9e9 --- /dev/null +++ b/src/main/java/org/datasurvey/service/InvalidPasswordException.java @@ -0,0 +1,10 @@ +package org.datasurvey.service; + +public class InvalidPasswordException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + public InvalidPasswordException() { + super("Incorrect password"); + } +} diff --git a/src/main/java/org/datasurvey/service/MailService.java b/src/main/java/org/datasurvey/service/MailService.java new file mode 100644 index 0000000..0575e3d --- /dev/null +++ b/src/main/java/org/datasurvey/service/MailService.java @@ -0,0 +1,112 @@ +package org.datasurvey.service; + +import java.nio.charset.StandardCharsets; +import java.util.Locale; +import javax.mail.MessagingException; +import javax.mail.internet.MimeMessage; +import org.datasurvey.domain.User; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.MessageSource; +import org.springframework.mail.MailException; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.mail.javamail.MimeMessageHelper; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; +import org.thymeleaf.context.Context; +import org.thymeleaf.spring5.SpringTemplateEngine; +import tech.jhipster.config.JHipsterProperties; + +/** + * Service for sending emails. + *

+ * We use the {@link Async} annotation to send emails asynchronously. + */ +@Service +public class MailService { + + private final Logger log = LoggerFactory.getLogger(MailService.class); + + private static final String USER = "user"; + + private static final String BASE_URL = "baseUrl"; + + private final JHipsterProperties jHipsterProperties; + + private final JavaMailSender javaMailSender; + + private final MessageSource messageSource; + + private final SpringTemplateEngine templateEngine; + + public MailService( + JHipsterProperties jHipsterProperties, + JavaMailSender javaMailSender, + MessageSource messageSource, + SpringTemplateEngine templateEngine + ) { + this.jHipsterProperties = jHipsterProperties; + this.javaMailSender = javaMailSender; + this.messageSource = messageSource; + this.templateEngine = templateEngine; + } + + @Async + public void sendEmail(String to, String subject, String content, boolean isMultipart, boolean isHtml) { + log.debug( + "Send email[multipart '{}' and html '{}'] to '{}' with subject '{}' and content={}", + isMultipart, + isHtml, + to, + subject, + content + ); + + // Prepare message using a Spring helper + MimeMessage mimeMessage = javaMailSender.createMimeMessage(); + try { + MimeMessageHelper message = new MimeMessageHelper(mimeMessage, isMultipart, StandardCharsets.UTF_8.name()); + message.setTo(to); + message.setFrom(jHipsterProperties.getMail().getFrom()); + message.setSubject(subject); + message.setText(content, isHtml); + javaMailSender.send(mimeMessage); + log.debug("Sent email to User '{}'", to); + } catch (MailException | MessagingException e) { + log.warn("Email could not be sent to user '{}'", to, e); + } + } + + @Async + public void sendEmailFromTemplate(User user, String templateName, String titleKey) { + if (user.getEmail() == null) { + log.debug("Email doesn't exist for user '{}'", user.getLogin()); + return; + } + Locale locale = Locale.forLanguageTag(user.getLangKey()); + Context context = new Context(locale); + context.setVariable(USER, user); + context.setVariable(BASE_URL, jHipsterProperties.getMail().getBaseUrl()); + String content = templateEngine.process(templateName, context); + String subject = messageSource.getMessage(titleKey, null, locale); + sendEmail(user.getEmail(), subject, content, false, true); + } + + @Async + public void sendActivationEmail(User user) { + log.debug("Sending activation email to '{}'", user.getEmail()); + sendEmailFromTemplate(user, "mail/activationEmail", "email.activation.title"); + } + + @Async + public void sendCreationEmail(User user) { + log.debug("Sending creation email to '{}'", user.getEmail()); + sendEmailFromTemplate(user, "mail/creationEmail", "email.activation.title"); + } + + @Async + public void sendPasswordResetMail(User user) { + log.debug("Sending password reset email to '{}'", user.getEmail()); + sendEmailFromTemplate(user, "mail/passwordResetEmail", "email.reset.title"); + } +} diff --git a/src/main/java/org/datasurvey/service/PPreguntaAbiertaQueryService.java b/src/main/java/org/datasurvey/service/PPreguntaAbiertaQueryService.java new file mode 100644 index 0000000..1e3a2d7 --- /dev/null +++ b/src/main/java/org/datasurvey/service/PPreguntaAbiertaQueryService.java @@ -0,0 +1,105 @@ +package org.datasurvey.service; + +import java.util.List; +import javax.persistence.criteria.JoinType; +import org.datasurvey.domain.*; // for static metamodels +import org.datasurvey.domain.PPreguntaAbierta; +import org.datasurvey.repository.PPreguntaAbiertaRepository; +import org.datasurvey.service.criteria.PPreguntaAbiertaCriteria; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import tech.jhipster.service.QueryService; + +/** + * Service for executing complex queries for {@link PPreguntaAbierta} entities in the database. + * The main input is a {@link PPreguntaAbiertaCriteria} which gets converted to {@link Specification}, + * in a way that all the filters must apply. + * It returns a {@link List} of {@link PPreguntaAbierta} or a {@link Page} of {@link PPreguntaAbierta} which fulfills the criteria. + */ +@Service +@Transactional(readOnly = true) +public class PPreguntaAbiertaQueryService extends QueryService { + + private final Logger log = LoggerFactory.getLogger(PPreguntaAbiertaQueryService.class); + + private final PPreguntaAbiertaRepository pPreguntaAbiertaRepository; + + public PPreguntaAbiertaQueryService(PPreguntaAbiertaRepository pPreguntaAbiertaRepository) { + this.pPreguntaAbiertaRepository = pPreguntaAbiertaRepository; + } + + /** + * Return a {@link List} of {@link PPreguntaAbierta} which matches the criteria from the database. + * @param criteria The object which holds all the filters, which the entities should match. + * @return the matching entities. + */ + @Transactional(readOnly = true) + public List findByCriteria(PPreguntaAbiertaCriteria criteria) { + log.debug("find by criteria : {}", criteria); + final Specification specification = createSpecification(criteria); + return pPreguntaAbiertaRepository.findAll(specification); + } + + /** + * Return a {@link Page} of {@link PPreguntaAbierta} which matches the criteria from the database. + * @param criteria The object which holds all the filters, which the entities should match. + * @param page The page, which should be returned. + * @return the matching entities. + */ + @Transactional(readOnly = true) + public Page findByCriteria(PPreguntaAbiertaCriteria criteria, Pageable page) { + log.debug("find by criteria : {}, page: {}", criteria, page); + final Specification specification = createSpecification(criteria); + return pPreguntaAbiertaRepository.findAll(specification, page); + } + + /** + * Return the number of matching entities in the database. + * @param criteria The object which holds all the filters, which the entities should match. + * @return the number of matching entities. + */ + @Transactional(readOnly = true) + public long countByCriteria(PPreguntaAbiertaCriteria criteria) { + log.debug("count by criteria : {}", criteria); + final Specification specification = createSpecification(criteria); + return pPreguntaAbiertaRepository.count(specification); + } + + /** + * Function to convert {@link PPreguntaAbiertaCriteria} to a {@link Specification} + * @param criteria The object which holds all the filters, which the entities should match. + * @return the matching {@link Specification} of the entity. + */ + protected Specification createSpecification(PPreguntaAbiertaCriteria criteria) { + Specification specification = Specification.where(null); + if (criteria != null) { + if (criteria.getId() != null) { + specification = specification.and(buildRangeSpecification(criteria.getId(), PPreguntaAbierta_.id)); + } + if (criteria.getNombre() != null) { + specification = specification.and(buildStringSpecification(criteria.getNombre(), PPreguntaAbierta_.nombre)); + } + if (criteria.getOpcional() != null) { + specification = specification.and(buildSpecification(criteria.getOpcional(), PPreguntaAbierta_.opcional)); + } + if (criteria.getOrden() != null) { + specification = specification.and(buildRangeSpecification(criteria.getOrden(), PPreguntaAbierta_.orden)); + } + if (criteria.getPlantillaId() != null) { + specification = + specification.and( + buildSpecification( + criteria.getPlantillaId(), + root -> root.join(PPreguntaAbierta_.plantilla, JoinType.LEFT).get(Plantilla_.id) + ) + ); + } + } + return specification; + } +} diff --git a/src/main/java/org/datasurvey/service/PPreguntaAbiertaService.java b/src/main/java/org/datasurvey/service/PPreguntaAbiertaService.java new file mode 100644 index 0000000..c9c1c58 --- /dev/null +++ b/src/main/java/org/datasurvey/service/PPreguntaAbiertaService.java @@ -0,0 +1,99 @@ +package org.datasurvey.service; + +import java.util.List; +import java.util.Optional; +import org.datasurvey.domain.PPreguntaAbierta; +import org.datasurvey.repository.PPreguntaAbiertaRepository; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * Service Implementation for managing {@link PPreguntaAbierta}. + */ +@Service +@Transactional +public class PPreguntaAbiertaService { + + private final Logger log = LoggerFactory.getLogger(PPreguntaAbiertaService.class); + + private final PPreguntaAbiertaRepository pPreguntaAbiertaRepository; + + public PPreguntaAbiertaService(PPreguntaAbiertaRepository pPreguntaAbiertaRepository) { + this.pPreguntaAbiertaRepository = pPreguntaAbiertaRepository; + } + + /** + * Save a pPreguntaAbierta. + * + * @param pPreguntaAbierta the entity to save. + * @return the persisted entity. + */ + public PPreguntaAbierta save(PPreguntaAbierta pPreguntaAbierta) { + log.debug("Request to save PPreguntaAbierta : {}", pPreguntaAbierta); + return pPreguntaAbiertaRepository.save(pPreguntaAbierta); + } + + /** + * Partially update a pPreguntaAbierta. + * + * @param pPreguntaAbierta the entity to update partially. + * @return the persisted entity. + */ + public Optional partialUpdate(PPreguntaAbierta pPreguntaAbierta) { + log.debug("Request to partially update PPreguntaAbierta : {}", pPreguntaAbierta); + + return pPreguntaAbiertaRepository + .findById(pPreguntaAbierta.getId()) + .map( + existingPPreguntaAbierta -> { + if (pPreguntaAbierta.getNombre() != null) { + existingPPreguntaAbierta.setNombre(pPreguntaAbierta.getNombre()); + } + if (pPreguntaAbierta.getOpcional() != null) { + existingPPreguntaAbierta.setOpcional(pPreguntaAbierta.getOpcional()); + } + if (pPreguntaAbierta.getOrden() != null) { + existingPPreguntaAbierta.setOrden(pPreguntaAbierta.getOrden()); + } + + return existingPPreguntaAbierta; + } + ) + .map(pPreguntaAbiertaRepository::save); + } + + /** + * Get all the pPreguntaAbiertas. + * + * @return the list of entities. + */ + @Transactional(readOnly = true) + public List findAll() { + log.debug("Request to get all PPreguntaAbiertas"); + return pPreguntaAbiertaRepository.findAll(); + } + + /** + * Get one pPreguntaAbierta by id. + * + * @param id the id of the entity. + * @return the entity. + */ + @Transactional(readOnly = true) + public Optional findOne(Long id) { + log.debug("Request to get PPreguntaAbierta : {}", id); + return pPreguntaAbiertaRepository.findById(id); + } + + /** + * Delete the pPreguntaAbierta by id. + * + * @param id the id of the entity. + */ + public void delete(Long id) { + log.debug("Request to delete PPreguntaAbierta : {}", id); + pPreguntaAbiertaRepository.deleteById(id); + } +} diff --git a/src/main/java/org/datasurvey/service/PPreguntaCerradaOpcionQueryService.java b/src/main/java/org/datasurvey/service/PPreguntaCerradaOpcionQueryService.java new file mode 100644 index 0000000..f6e021b --- /dev/null +++ b/src/main/java/org/datasurvey/service/PPreguntaCerradaOpcionQueryService.java @@ -0,0 +1,102 @@ +package org.datasurvey.service; + +import java.util.List; +import javax.persistence.criteria.JoinType; +import org.datasurvey.domain.*; // for static metamodels +import org.datasurvey.domain.PPreguntaCerradaOpcion; +import org.datasurvey.repository.PPreguntaCerradaOpcionRepository; +import org.datasurvey.service.criteria.PPreguntaCerradaOpcionCriteria; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import tech.jhipster.service.QueryService; + +/** + * Service for executing complex queries for {@link PPreguntaCerradaOpcion} entities in the database. + * The main input is a {@link PPreguntaCerradaOpcionCriteria} which gets converted to {@link Specification}, + * in a way that all the filters must apply. + * It returns a {@link List} of {@link PPreguntaCerradaOpcion} or a {@link Page} of {@link PPreguntaCerradaOpcion} which fulfills the criteria. + */ +@Service +@Transactional(readOnly = true) +public class PPreguntaCerradaOpcionQueryService extends QueryService { + + private final Logger log = LoggerFactory.getLogger(PPreguntaCerradaOpcionQueryService.class); + + private final PPreguntaCerradaOpcionRepository pPreguntaCerradaOpcionRepository; + + public PPreguntaCerradaOpcionQueryService(PPreguntaCerradaOpcionRepository pPreguntaCerradaOpcionRepository) { + this.pPreguntaCerradaOpcionRepository = pPreguntaCerradaOpcionRepository; + } + + /** + * Return a {@link List} of {@link PPreguntaCerradaOpcion} which matches the criteria from the database. + * @param criteria The object which holds all the filters, which the entities should match. + * @return the matching entities. + */ + @Transactional(readOnly = true) + public List findByCriteria(PPreguntaCerradaOpcionCriteria criteria) { + log.debug("find by criteria : {}", criteria); + final Specification specification = createSpecification(criteria); + return pPreguntaCerradaOpcionRepository.findAll(specification); + } + + /** + * Return a {@link Page} of {@link PPreguntaCerradaOpcion} which matches the criteria from the database. + * @param criteria The object which holds all the filters, which the entities should match. + * @param page The page, which should be returned. + * @return the matching entities. + */ + @Transactional(readOnly = true) + public Page findByCriteria(PPreguntaCerradaOpcionCriteria criteria, Pageable page) { + log.debug("find by criteria : {}, page: {}", criteria, page); + final Specification specification = createSpecification(criteria); + return pPreguntaCerradaOpcionRepository.findAll(specification, page); + } + + /** + * Return the number of matching entities in the database. + * @param criteria The object which holds all the filters, which the entities should match. + * @return the number of matching entities. + */ + @Transactional(readOnly = true) + public long countByCriteria(PPreguntaCerradaOpcionCriteria criteria) { + log.debug("count by criteria : {}", criteria); + final Specification specification = createSpecification(criteria); + return pPreguntaCerradaOpcionRepository.count(specification); + } + + /** + * Function to convert {@link PPreguntaCerradaOpcionCriteria} to a {@link Specification} + * @param criteria The object which holds all the filters, which the entities should match. + * @return the matching {@link Specification} of the entity. + */ + protected Specification createSpecification(PPreguntaCerradaOpcionCriteria criteria) { + Specification specification = Specification.where(null); + if (criteria != null) { + if (criteria.getId() != null) { + specification = specification.and(buildRangeSpecification(criteria.getId(), PPreguntaCerradaOpcion_.id)); + } + if (criteria.getNombre() != null) { + specification = specification.and(buildStringSpecification(criteria.getNombre(), PPreguntaCerradaOpcion_.nombre)); + } + if (criteria.getOrden() != null) { + specification = specification.and(buildRangeSpecification(criteria.getOrden(), PPreguntaCerradaOpcion_.orden)); + } + if (criteria.getPPreguntaCerradaId() != null) { + specification = + specification.and( + buildSpecification( + criteria.getPPreguntaCerradaId(), + root -> root.join(PPreguntaCerradaOpcion_.pPreguntaCerrada, JoinType.LEFT).get(PPreguntaCerrada_.id) + ) + ); + } + } + return specification; + } +} diff --git a/src/main/java/org/datasurvey/service/PPreguntaCerradaOpcionService.java b/src/main/java/org/datasurvey/service/PPreguntaCerradaOpcionService.java new file mode 100644 index 0000000..ffa290a --- /dev/null +++ b/src/main/java/org/datasurvey/service/PPreguntaCerradaOpcionService.java @@ -0,0 +1,96 @@ +package org.datasurvey.service; + +import java.util.List; +import java.util.Optional; +import org.datasurvey.domain.PPreguntaCerradaOpcion; +import org.datasurvey.repository.PPreguntaCerradaOpcionRepository; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * Service Implementation for managing {@link PPreguntaCerradaOpcion}. + */ +@Service +@Transactional +public class PPreguntaCerradaOpcionService { + + private final Logger log = LoggerFactory.getLogger(PPreguntaCerradaOpcionService.class); + + private final PPreguntaCerradaOpcionRepository pPreguntaCerradaOpcionRepository; + + public PPreguntaCerradaOpcionService(PPreguntaCerradaOpcionRepository pPreguntaCerradaOpcionRepository) { + this.pPreguntaCerradaOpcionRepository = pPreguntaCerradaOpcionRepository; + } + + /** + * Save a pPreguntaCerradaOpcion. + * + * @param pPreguntaCerradaOpcion the entity to save. + * @return the persisted entity. + */ + public PPreguntaCerradaOpcion save(PPreguntaCerradaOpcion pPreguntaCerradaOpcion) { + log.debug("Request to save PPreguntaCerradaOpcion : {}", pPreguntaCerradaOpcion); + return pPreguntaCerradaOpcionRepository.save(pPreguntaCerradaOpcion); + } + + /** + * Partially update a pPreguntaCerradaOpcion. + * + * @param pPreguntaCerradaOpcion the entity to update partially. + * @return the persisted entity. + */ + public Optional partialUpdate(PPreguntaCerradaOpcion pPreguntaCerradaOpcion) { + log.debug("Request to partially update PPreguntaCerradaOpcion : {}", pPreguntaCerradaOpcion); + + return pPreguntaCerradaOpcionRepository + .findById(pPreguntaCerradaOpcion.getId()) + .map( + existingPPreguntaCerradaOpcion -> { + if (pPreguntaCerradaOpcion.getNombre() != null) { + existingPPreguntaCerradaOpcion.setNombre(pPreguntaCerradaOpcion.getNombre()); + } + if (pPreguntaCerradaOpcion.getOrden() != null) { + existingPPreguntaCerradaOpcion.setOrden(pPreguntaCerradaOpcion.getOrden()); + } + + return existingPPreguntaCerradaOpcion; + } + ) + .map(pPreguntaCerradaOpcionRepository::save); + } + + /** + * Get all the pPreguntaCerradaOpcions. + * + * @return the list of entities. + */ + @Transactional(readOnly = true) + public List findAll() { + log.debug("Request to get all PPreguntaCerradaOpcions"); + return pPreguntaCerradaOpcionRepository.findAll(); + } + + /** + * Get one pPreguntaCerradaOpcion by id. + * + * @param id the id of the entity. + * @return the entity. + */ + @Transactional(readOnly = true) + public Optional findOne(Long id) { + log.debug("Request to get PPreguntaCerradaOpcion : {}", id); + return pPreguntaCerradaOpcionRepository.findById(id); + } + + /** + * Delete the pPreguntaCerradaOpcion by id. + * + * @param id the id of the entity. + */ + public void delete(Long id) { + log.debug("Request to delete PPreguntaCerradaOpcion : {}", id); + pPreguntaCerradaOpcionRepository.deleteById(id); + } +} diff --git a/src/main/java/org/datasurvey/service/PPreguntaCerradaQueryService.java b/src/main/java/org/datasurvey/service/PPreguntaCerradaQueryService.java new file mode 100644 index 0000000..e840fd7 --- /dev/null +++ b/src/main/java/org/datasurvey/service/PPreguntaCerradaQueryService.java @@ -0,0 +1,117 @@ +package org.datasurvey.service; + +import java.util.List; +import javax.persistence.criteria.JoinType; +import org.datasurvey.domain.*; // for static metamodels +import org.datasurvey.domain.PPreguntaCerrada; +import org.datasurvey.repository.PPreguntaCerradaRepository; +import org.datasurvey.service.criteria.PPreguntaCerradaCriteria; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import tech.jhipster.service.QueryService; + +/** + * Service for executing complex queries for {@link PPreguntaCerrada} entities in the database. + * The main input is a {@link PPreguntaCerradaCriteria} which gets converted to {@link Specification}, + * in a way that all the filters must apply. + * It returns a {@link List} of {@link PPreguntaCerrada} or a {@link Page} of {@link PPreguntaCerrada} which fulfills the criteria. + */ +@Service +@Transactional(readOnly = true) +public class PPreguntaCerradaQueryService extends QueryService { + + private final Logger log = LoggerFactory.getLogger(PPreguntaCerradaQueryService.class); + + private final PPreguntaCerradaRepository pPreguntaCerradaRepository; + + public PPreguntaCerradaQueryService(PPreguntaCerradaRepository pPreguntaCerradaRepository) { + this.pPreguntaCerradaRepository = pPreguntaCerradaRepository; + } + + /** + * Return a {@link List} of {@link PPreguntaCerrada} which matches the criteria from the database. + * @param criteria The object which holds all the filters, which the entities should match. + * @return the matching entities. + */ + @Transactional(readOnly = true) + public List findByCriteria(PPreguntaCerradaCriteria criteria) { + log.debug("find by criteria : {}", criteria); + final Specification specification = createSpecification(criteria); + return pPreguntaCerradaRepository.findAll(specification); + } + + /** + * Return a {@link Page} of {@link PPreguntaCerrada} which matches the criteria from the database. + * @param criteria The object which holds all the filters, which the entities should match. + * @param page The page, which should be returned. + * @return the matching entities. + */ + @Transactional(readOnly = true) + public Page findByCriteria(PPreguntaCerradaCriteria criteria, Pageable page) { + log.debug("find by criteria : {}, page: {}", criteria, page); + final Specification specification = createSpecification(criteria); + return pPreguntaCerradaRepository.findAll(specification, page); + } + + /** + * Return the number of matching entities in the database. + * @param criteria The object which holds all the filters, which the entities should match. + * @return the number of matching entities. + */ + @Transactional(readOnly = true) + public long countByCriteria(PPreguntaCerradaCriteria criteria) { + log.debug("count by criteria : {}", criteria); + final Specification specification = createSpecification(criteria); + return pPreguntaCerradaRepository.count(specification); + } + + /** + * Function to convert {@link PPreguntaCerradaCriteria} to a {@link Specification} + * @param criteria The object which holds all the filters, which the entities should match. + * @return the matching {@link Specification} of the entity. + */ + protected Specification createSpecification(PPreguntaCerradaCriteria criteria) { + Specification specification = Specification.where(null); + if (criteria != null) { + if (criteria.getId() != null) { + specification = specification.and(buildRangeSpecification(criteria.getId(), PPreguntaCerrada_.id)); + } + if (criteria.getNombre() != null) { + specification = specification.and(buildStringSpecification(criteria.getNombre(), PPreguntaCerrada_.nombre)); + } + if (criteria.getTipo() != null) { + specification = specification.and(buildSpecification(criteria.getTipo(), PPreguntaCerrada_.tipo)); + } + if (criteria.getOpcional() != null) { + specification = specification.and(buildSpecification(criteria.getOpcional(), PPreguntaCerrada_.opcional)); + } + if (criteria.getOrden() != null) { + specification = specification.and(buildRangeSpecification(criteria.getOrden(), PPreguntaCerrada_.orden)); + } + if (criteria.getPPreguntaCerradaOpcionId() != null) { + specification = + specification.and( + buildSpecification( + criteria.getPPreguntaCerradaOpcionId(), + root -> root.join(PPreguntaCerrada_.pPreguntaCerradaOpcions, JoinType.LEFT).get(PPreguntaCerradaOpcion_.id) + ) + ); + } + if (criteria.getPlantillaId() != null) { + specification = + specification.and( + buildSpecification( + criteria.getPlantillaId(), + root -> root.join(PPreguntaCerrada_.plantilla, JoinType.LEFT).get(Plantilla_.id) + ) + ); + } + } + return specification; + } +} diff --git a/src/main/java/org/datasurvey/service/PPreguntaCerradaService.java b/src/main/java/org/datasurvey/service/PPreguntaCerradaService.java new file mode 100644 index 0000000..bc27a58 --- /dev/null +++ b/src/main/java/org/datasurvey/service/PPreguntaCerradaService.java @@ -0,0 +1,102 @@ +package org.datasurvey.service; + +import java.util.List; +import java.util.Optional; +import org.datasurvey.domain.PPreguntaCerrada; +import org.datasurvey.repository.PPreguntaCerradaRepository; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * Service Implementation for managing {@link PPreguntaCerrada}. + */ +@Service +@Transactional +public class PPreguntaCerradaService { + + private final Logger log = LoggerFactory.getLogger(PPreguntaCerradaService.class); + + private final PPreguntaCerradaRepository pPreguntaCerradaRepository; + + public PPreguntaCerradaService(PPreguntaCerradaRepository pPreguntaCerradaRepository) { + this.pPreguntaCerradaRepository = pPreguntaCerradaRepository; + } + + /** + * Save a pPreguntaCerrada. + * + * @param pPreguntaCerrada the entity to save. + * @return the persisted entity. + */ + public PPreguntaCerrada save(PPreguntaCerrada pPreguntaCerrada) { + log.debug("Request to save PPreguntaCerrada : {}", pPreguntaCerrada); + return pPreguntaCerradaRepository.save(pPreguntaCerrada); + } + + /** + * Partially update a pPreguntaCerrada. + * + * @param pPreguntaCerrada the entity to update partially. + * @return the persisted entity. + */ + public Optional partialUpdate(PPreguntaCerrada pPreguntaCerrada) { + log.debug("Request to partially update PPreguntaCerrada : {}", pPreguntaCerrada); + + return pPreguntaCerradaRepository + .findById(pPreguntaCerrada.getId()) + .map( + existingPPreguntaCerrada -> { + if (pPreguntaCerrada.getNombre() != null) { + existingPPreguntaCerrada.setNombre(pPreguntaCerrada.getNombre()); + } + if (pPreguntaCerrada.getTipo() != null) { + existingPPreguntaCerrada.setTipo(pPreguntaCerrada.getTipo()); + } + if (pPreguntaCerrada.getOpcional() != null) { + existingPPreguntaCerrada.setOpcional(pPreguntaCerrada.getOpcional()); + } + if (pPreguntaCerrada.getOrden() != null) { + existingPPreguntaCerrada.setOrden(pPreguntaCerrada.getOrden()); + } + + return existingPPreguntaCerrada; + } + ) + .map(pPreguntaCerradaRepository::save); + } + + /** + * Get all the pPreguntaCerradas. + * + * @return the list of entities. + */ + @Transactional(readOnly = true) + public List findAll() { + log.debug("Request to get all PPreguntaCerradas"); + return pPreguntaCerradaRepository.findAll(); + } + + /** + * Get one pPreguntaCerrada by id. + * + * @param id the id of the entity. + * @return the entity. + */ + @Transactional(readOnly = true) + public Optional findOne(Long id) { + log.debug("Request to get PPreguntaCerrada : {}", id); + return pPreguntaCerradaRepository.findById(id); + } + + /** + * Delete the pPreguntaCerrada by id. + * + * @param id the id of the entity. + */ + public void delete(Long id) { + log.debug("Request to delete PPreguntaCerrada : {}", id); + pPreguntaCerradaRepository.deleteById(id); + } +} diff --git a/src/main/java/org/datasurvey/service/ParametroAplicacionQueryService.java b/src/main/java/org/datasurvey/service/ParametroAplicacionQueryService.java new file mode 100644 index 0000000..aa5bc78 --- /dev/null +++ b/src/main/java/org/datasurvey/service/ParametroAplicacionQueryService.java @@ -0,0 +1,107 @@ +package org.datasurvey.service; + +import java.util.List; +import javax.persistence.criteria.JoinType; +import org.datasurvey.domain.*; // for static metamodels +import org.datasurvey.domain.ParametroAplicacion; +import org.datasurvey.repository.ParametroAplicacionRepository; +import org.datasurvey.service.criteria.ParametroAplicacionCriteria; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import tech.jhipster.service.QueryService; + +/** + * Service for executing complex queries for {@link ParametroAplicacion} entities in the database. + * The main input is a {@link ParametroAplicacionCriteria} which gets converted to {@link Specification}, + * in a way that all the filters must apply. + * It returns a {@link List} of {@link ParametroAplicacion} or a {@link Page} of {@link ParametroAplicacion} which fulfills the criteria. + */ +@Service +@Transactional(readOnly = true) +public class ParametroAplicacionQueryService extends QueryService { + + private final Logger log = LoggerFactory.getLogger(ParametroAplicacionQueryService.class); + + private final ParametroAplicacionRepository parametroAplicacionRepository; + + public ParametroAplicacionQueryService(ParametroAplicacionRepository parametroAplicacionRepository) { + this.parametroAplicacionRepository = parametroAplicacionRepository; + } + + /** + * Return a {@link List} of {@link ParametroAplicacion} which matches the criteria from the database. + * @param criteria The object which holds all the filters, which the entities should match. + * @return the matching entities. + */ + @Transactional(readOnly = true) + public List findByCriteria(ParametroAplicacionCriteria criteria) { + log.debug("find by criteria : {}", criteria); + final Specification specification = createSpecification(criteria); + return parametroAplicacionRepository.findAll(specification); + } + + /** + * Return a {@link Page} of {@link ParametroAplicacion} which matches the criteria from the database. + * @param criteria The object which holds all the filters, which the entities should match. + * @param page The page, which should be returned. + * @return the matching entities. + */ + @Transactional(readOnly = true) + public Page findByCriteria(ParametroAplicacionCriteria criteria, Pageable page) { + log.debug("find by criteria : {}, page: {}", criteria, page); + final Specification specification = createSpecification(criteria); + return parametroAplicacionRepository.findAll(specification, page); + } + + /** + * Return the number of matching entities in the database. + * @param criteria The object which holds all the filters, which the entities should match. + * @return the number of matching entities. + */ + @Transactional(readOnly = true) + public long countByCriteria(ParametroAplicacionCriteria criteria) { + log.debug("count by criteria : {}", criteria); + final Specification specification = createSpecification(criteria); + return parametroAplicacionRepository.count(specification); + } + + /** + * Function to convert {@link ParametroAplicacionCriteria} to a {@link Specification} + * @param criteria The object which holds all the filters, which the entities should match. + * @return the matching {@link Specification} of the entity. + */ + protected Specification createSpecification(ParametroAplicacionCriteria criteria) { + Specification specification = Specification.where(null); + if (criteria != null) { + if (criteria.getId() != null) { + specification = specification.and(buildRangeSpecification(criteria.getId(), ParametroAplicacion_.id)); + } + if (criteria.getMaxDiasEncuesta() != null) { + specification = + specification.and(buildRangeSpecification(criteria.getMaxDiasEncuesta(), ParametroAplicacion_.maxDiasEncuesta)); + } + if (criteria.getMinDiasEncuesta() != null) { + specification = + specification.and(buildRangeSpecification(criteria.getMinDiasEncuesta(), ParametroAplicacion_.minDiasEncuesta)); + } + if (criteria.getMaxCantidadPreguntas() != null) { + specification = + specification.and( + buildRangeSpecification(criteria.getMaxCantidadPreguntas(), ParametroAplicacion_.maxCantidadPreguntas) + ); + } + if (criteria.getMinCantidadPreguntas() != null) { + specification = + specification.and( + buildRangeSpecification(criteria.getMinCantidadPreguntas(), ParametroAplicacion_.minCantidadPreguntas) + ); + } + } + return specification; + } +} diff --git a/src/main/java/org/datasurvey/service/ParametroAplicacionService.java b/src/main/java/org/datasurvey/service/ParametroAplicacionService.java new file mode 100644 index 0000000..5c7612d --- /dev/null +++ b/src/main/java/org/datasurvey/service/ParametroAplicacionService.java @@ -0,0 +1,102 @@ +package org.datasurvey.service; + +import java.util.List; +import java.util.Optional; +import org.datasurvey.domain.ParametroAplicacion; +import org.datasurvey.repository.ParametroAplicacionRepository; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * Service Implementation for managing {@link ParametroAplicacion}. + */ +@Service +@Transactional +public class ParametroAplicacionService { + + private final Logger log = LoggerFactory.getLogger(ParametroAplicacionService.class); + + private final ParametroAplicacionRepository parametroAplicacionRepository; + + public ParametroAplicacionService(ParametroAplicacionRepository parametroAplicacionRepository) { + this.parametroAplicacionRepository = parametroAplicacionRepository; + } + + /** + * Save a parametroAplicacion. + * + * @param parametroAplicacion the entity to save. + * @return the persisted entity. + */ + public ParametroAplicacion save(ParametroAplicacion parametroAplicacion) { + log.debug("Request to save ParametroAplicacion : {}", parametroAplicacion); + return parametroAplicacionRepository.save(parametroAplicacion); + } + + /** + * Partially update a parametroAplicacion. + * + * @param parametroAplicacion the entity to update partially. + * @return the persisted entity. + */ + public Optional partialUpdate(ParametroAplicacion parametroAplicacion) { + log.debug("Request to partially update ParametroAplicacion : {}", parametroAplicacion); + + return parametroAplicacionRepository + .findById(parametroAplicacion.getId()) + .map( + existingParametroAplicacion -> { + if (parametroAplicacion.getMaxDiasEncuesta() != null) { + existingParametroAplicacion.setMaxDiasEncuesta(parametroAplicacion.getMaxDiasEncuesta()); + } + if (parametroAplicacion.getMinDiasEncuesta() != null) { + existingParametroAplicacion.setMinDiasEncuesta(parametroAplicacion.getMinDiasEncuesta()); + } + if (parametroAplicacion.getMaxCantidadPreguntas() != null) { + existingParametroAplicacion.setMaxCantidadPreguntas(parametroAplicacion.getMaxCantidadPreguntas()); + } + if (parametroAplicacion.getMinCantidadPreguntas() != null) { + existingParametroAplicacion.setMinCantidadPreguntas(parametroAplicacion.getMinCantidadPreguntas()); + } + + return existingParametroAplicacion; + } + ) + .map(parametroAplicacionRepository::save); + } + + /** + * Get all the parametroAplicacions. + * + * @return the list of entities. + */ + @Transactional(readOnly = true) + public List findAll() { + log.debug("Request to get all ParametroAplicacions"); + return parametroAplicacionRepository.findAll(); + } + + /** + * Get one parametroAplicacion by id. + * + * @param id the id of the entity. + * @return the entity. + */ + @Transactional(readOnly = true) + public Optional findOne(Long id) { + log.debug("Request to get ParametroAplicacion : {}", id); + return parametroAplicacionRepository.findById(id); + } + + /** + * Delete the parametroAplicacion by id. + * + * @param id the id of the entity. + */ + public void delete(Long id) { + log.debug("Request to delete ParametroAplicacion : {}", id); + parametroAplicacionRepository.deleteById(id); + } +} diff --git a/src/main/java/org/datasurvey/service/PlantillaQueryService.java b/src/main/java/org/datasurvey/service/PlantillaQueryService.java new file mode 100644 index 0000000..dac02a8 --- /dev/null +++ b/src/main/java/org/datasurvey/service/PlantillaQueryService.java @@ -0,0 +1,142 @@ +package org.datasurvey.service; + +import java.util.List; +import javax.persistence.criteria.JoinType; +import org.datasurvey.domain.*; // for static metamodels +import org.datasurvey.domain.Plantilla; +import org.datasurvey.repository.PlantillaRepository; +import org.datasurvey.service.criteria.PlantillaCriteria; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import tech.jhipster.service.QueryService; + +/** + * Service for executing complex queries for {@link Plantilla} entities in the database. + * The main input is a {@link PlantillaCriteria} which gets converted to {@link Specification}, + * in a way that all the filters must apply. + * It returns a {@link List} of {@link Plantilla} or a {@link Page} of {@link Plantilla} which fulfills the criteria. + */ +@Service +@Transactional(readOnly = true) +public class PlantillaQueryService extends QueryService { + + private final Logger log = LoggerFactory.getLogger(PlantillaQueryService.class); + + private final PlantillaRepository plantillaRepository; + + public PlantillaQueryService(PlantillaRepository plantillaRepository) { + this.plantillaRepository = plantillaRepository; + } + + /** + * Return a {@link List} of {@link Plantilla} which matches the criteria from the database. + * @param criteria The object which holds all the filters, which the entities should match. + * @return the matching entities. + */ + @Transactional(readOnly = true) + public List findByCriteria(PlantillaCriteria criteria) { + log.debug("find by criteria : {}", criteria); + final Specification specification = createSpecification(criteria); + return plantillaRepository.findAll(specification); + } + + /** + * Return a {@link Page} of {@link Plantilla} which matches the criteria from the database. + * @param criteria The object which holds all the filters, which the entities should match. + * @param page The page, which should be returned. + * @return the matching entities. + */ + @Transactional(readOnly = true) + public Page findByCriteria(PlantillaCriteria criteria, Pageable page) { + log.debug("find by criteria : {}, page: {}", criteria, page); + final Specification specification = createSpecification(criteria); + return plantillaRepository.findAll(specification, page); + } + + /** + * Return the number of matching entities in the database. + * @param criteria The object which holds all the filters, which the entities should match. + * @return the number of matching entities. + */ + @Transactional(readOnly = true) + public long countByCriteria(PlantillaCriteria criteria) { + log.debug("count by criteria : {}", criteria); + final Specification specification = createSpecification(criteria); + return plantillaRepository.count(specification); + } + + /** + * Function to convert {@link PlantillaCriteria} to a {@link Specification} + * @param criteria The object which holds all the filters, which the entities should match. + * @return the matching {@link Specification} of the entity. + */ + protected Specification createSpecification(PlantillaCriteria criteria) { + Specification specification = Specification.where(null); + if (criteria != null) { + if (criteria.getId() != null) { + specification = specification.and(buildRangeSpecification(criteria.getId(), Plantilla_.id)); + } + if (criteria.getNombre() != null) { + specification = specification.and(buildStringSpecification(criteria.getNombre(), Plantilla_.nombre)); + } + if (criteria.getDescripcion() != null) { + specification = specification.and(buildStringSpecification(criteria.getDescripcion(), Plantilla_.descripcion)); + } + if (criteria.getFechaCreacion() != null) { + specification = specification.and(buildRangeSpecification(criteria.getFechaCreacion(), Plantilla_.fechaCreacion)); + } + if (criteria.getFechaPublicacionTienda() != null) { + specification = + specification.and(buildRangeSpecification(criteria.getFechaPublicacionTienda(), Plantilla_.fechaPublicacionTienda)); + } + if (criteria.getEstado() != null) { + specification = specification.and(buildSpecification(criteria.getEstado(), Plantilla_.estado)); + } + if (criteria.getPrecio() != null) { + specification = specification.and(buildRangeSpecification(criteria.getPrecio(), Plantilla_.precio)); + } + if (criteria.getPPreguntaCerradaId() != null) { + specification = + specification.and( + buildSpecification( + criteria.getPPreguntaCerradaId(), + root -> root.join(Plantilla_.pPreguntaCerradas, JoinType.LEFT).get(PPreguntaCerrada_.id) + ) + ); + } + if (criteria.getPPreguntaAbiertaId() != null) { + specification = + specification.and( + buildSpecification( + criteria.getPPreguntaAbiertaId(), + root -> root.join(Plantilla_.pPreguntaAbiertas, JoinType.LEFT).get(PPreguntaAbierta_.id) + ) + ); + } + if (criteria.getCategoriaId() != null) { + specification = + specification.and( + buildSpecification( + criteria.getCategoriaId(), + root -> root.join(Plantilla_.categoria, JoinType.LEFT).get(Categoria_.id) + ) + ); + } + if (criteria.getUsuarioExtraId() != null) { + specification = + specification.and( + buildSpecification( + criteria.getUsuarioExtraId(), + root -> root.join(Plantilla_.usuarioExtras, JoinType.LEFT).get(UsuarioExtra_.id) + ) + ); + } + } + return specification; + } +} diff --git a/src/main/java/org/datasurvey/service/PlantillaService.java b/src/main/java/org/datasurvey/service/PlantillaService.java new file mode 100644 index 0000000..f5a70c6 --- /dev/null +++ b/src/main/java/org/datasurvey/service/PlantillaService.java @@ -0,0 +1,108 @@ +package org.datasurvey.service; + +import java.util.List; +import java.util.Optional; +import org.datasurvey.domain.Plantilla; +import org.datasurvey.repository.PlantillaRepository; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * Service Implementation for managing {@link Plantilla}. + */ +@Service +@Transactional +public class PlantillaService { + + private final Logger log = LoggerFactory.getLogger(PlantillaService.class); + + private final PlantillaRepository plantillaRepository; + + public PlantillaService(PlantillaRepository plantillaRepository) { + this.plantillaRepository = plantillaRepository; + } + + /** + * Save a plantilla. + * + * @param plantilla the entity to save. + * @return the persisted entity. + */ + public Plantilla save(Plantilla plantilla) { + log.debug("Request to save Plantilla : {}", plantilla); + return plantillaRepository.save(plantilla); + } + + /** + * Partially update a plantilla. + * + * @param plantilla the entity to update partially. + * @return the persisted entity. + */ + public Optional partialUpdate(Plantilla plantilla) { + log.debug("Request to partially update Plantilla : {}", plantilla); + + return plantillaRepository + .findById(plantilla.getId()) + .map( + existingPlantilla -> { + if (plantilla.getNombre() != null) { + existingPlantilla.setNombre(plantilla.getNombre()); + } + if (plantilla.getDescripcion() != null) { + existingPlantilla.setDescripcion(plantilla.getDescripcion()); + } + if (plantilla.getFechaCreacion() != null) { + existingPlantilla.setFechaCreacion(plantilla.getFechaCreacion()); + } + if (plantilla.getFechaPublicacionTienda() != null) { + existingPlantilla.setFechaPublicacionTienda(plantilla.getFechaPublicacionTienda()); + } + if (plantilla.getEstado() != null) { + existingPlantilla.setEstado(plantilla.getEstado()); + } + if (plantilla.getPrecio() != null) { + existingPlantilla.setPrecio(plantilla.getPrecio()); + } + + return existingPlantilla; + } + ) + .map(plantillaRepository::save); + } + + /** + * Get all the plantillas. + * + * @return the list of entities. + */ + @Transactional(readOnly = true) + public List findAll() { + log.debug("Request to get all Plantillas"); + return plantillaRepository.findAll(); + } + + /** + * Get one plantilla by id. + * + * @param id the id of the entity. + * @return the entity. + */ + @Transactional(readOnly = true) + public Optional findOne(Long id) { + log.debug("Request to get Plantilla : {}", id); + return plantillaRepository.findById(id); + } + + /** + * Delete the plantilla by id. + * + * @param id the id of the entity. + */ + public void delete(Long id) { + log.debug("Request to delete Plantilla : {}", id); + plantillaRepository.deleteById(id); + } +} diff --git a/src/main/java/org/datasurvey/service/UserService.java b/src/main/java/org/datasurvey/service/UserService.java new file mode 100644 index 0000000..9da3cd0 --- /dev/null +++ b/src/main/java/org/datasurvey/service/UserService.java @@ -0,0 +1,345 @@ +package org.datasurvey.service; + +import java.time.Instant; +import java.time.temporal.ChronoUnit; +import java.util.*; +import java.util.stream.Collectors; +import org.datasurvey.config.Constants; +import org.datasurvey.domain.Authority; +import org.datasurvey.domain.User; +import org.datasurvey.repository.AuthorityRepository; +import org.datasurvey.repository.UserRepository; +import org.datasurvey.security.AuthoritiesConstants; +import org.datasurvey.security.SecurityUtils; +import org.datasurvey.service.dto.AdminUserDTO; +import org.datasurvey.service.dto.UserDTO; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.cache.CacheManager; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import tech.jhipster.security.RandomUtil; + +/** + * Service class for managing users. + */ +@Service +@Transactional +public class UserService { + + private final Logger log = LoggerFactory.getLogger(UserService.class); + + private final UserRepository userRepository; + + private final PasswordEncoder passwordEncoder; + + private final AuthorityRepository authorityRepository; + + private final CacheManager cacheManager; + + public UserService( + UserRepository userRepository, + PasswordEncoder passwordEncoder, + AuthorityRepository authorityRepository, + CacheManager cacheManager + ) { + this.userRepository = userRepository; + this.passwordEncoder = passwordEncoder; + this.authorityRepository = authorityRepository; + this.cacheManager = cacheManager; + } + + public Optional activateRegistration(String key) { + log.debug("Activating user for activation key {}", key); + return userRepository + .findOneByActivationKey(key) + .map( + user -> { + // activate given user for the registration key. + user.setActivated(true); + user.setActivationKey(null); + this.clearUserCaches(user); + log.debug("Activated user: {}", user); + return user; + } + ); + } + + public Optional completePasswordReset(String newPassword, String key) { + log.debug("Reset user password for reset key {}", key); + return userRepository + .findOneByResetKey(key) + .filter(user -> user.getResetDate().isAfter(Instant.now().minusSeconds(86400))) + .map( + user -> { + user.setPassword(passwordEncoder.encode(newPassword)); + user.setResetKey(null); + user.setResetDate(null); + this.clearUserCaches(user); + return user; + } + ); + } + + public Optional requestPasswordReset(String mail) { + return userRepository + .findOneByEmailIgnoreCase(mail) + .filter(User::isActivated) + .map( + user -> { + user.setResetKey(RandomUtil.generateResetKey()); + user.setResetDate(Instant.now()); + this.clearUserCaches(user); + return user; + } + ); + } + + public User registerUser(AdminUserDTO userDTO, String password) { + userRepository + .findOneByLogin(userDTO.getLogin().toLowerCase()) + .ifPresent( + existingUser -> { + boolean removed = removeNonActivatedUser(existingUser); + if (!removed) { + throw new UsernameAlreadyUsedException(); + } + } + ); + userRepository + .findOneByEmailIgnoreCase(userDTO.getEmail()) + .ifPresent( + existingUser -> { + boolean removed = removeNonActivatedUser(existingUser); + if (!removed) { + throw new EmailAlreadyUsedException(); + } + } + ); + User newUser = new User(); + String encryptedPassword = passwordEncoder.encode(password); + newUser.setLogin(userDTO.getLogin().toLowerCase()); + // new user gets initially a generated password + newUser.setPassword(encryptedPassword); + newUser.setFirstName(userDTO.getFirstName()); + newUser.setLastName(userDTO.getLastName()); + if (userDTO.getEmail() != null) { + newUser.setEmail(userDTO.getEmail().toLowerCase()); + } + newUser.setImageUrl(userDTO.getImageUrl()); + newUser.setLangKey(userDTO.getLangKey()); + // new user is not active + newUser.setActivated(false); + // new user gets registration key + newUser.setActivationKey(RandomUtil.generateActivationKey()); + Set authorities = new HashSet<>(); + authorityRepository.findById(AuthoritiesConstants.USER).ifPresent(authorities::add); + newUser.setAuthorities(authorities); + userRepository.save(newUser); + this.clearUserCaches(newUser); + log.debug("Created Information for User: {}", newUser); + return newUser; + } + + private boolean removeNonActivatedUser(User existingUser) { + if (existingUser.isActivated()) { + return false; + } + userRepository.delete(existingUser); + userRepository.flush(); + this.clearUserCaches(existingUser); + return true; + } + + public User createUser(AdminUserDTO userDTO) { + User user = new User(); + user.setLogin(userDTO.getLogin().toLowerCase()); + user.setFirstName(userDTO.getFirstName()); + user.setLastName(userDTO.getLastName()); + if (userDTO.getEmail() != null) { + user.setEmail(userDTO.getEmail().toLowerCase()); + } + user.setImageUrl(userDTO.getImageUrl()); + if (userDTO.getLangKey() == null) { + user.setLangKey(Constants.DEFAULT_LANGUAGE); // default language + } else { + user.setLangKey(userDTO.getLangKey()); + } + String encryptedPassword = passwordEncoder.encode(RandomUtil.generatePassword()); + user.setPassword(encryptedPassword); + user.setResetKey(RandomUtil.generateResetKey()); + user.setResetDate(Instant.now()); + user.setActivated(true); + if (userDTO.getAuthorities() != null) { + Set authorities = userDTO + .getAuthorities() + .stream() + .map(authorityRepository::findById) + .filter(Optional::isPresent) + .map(Optional::get) + .collect(Collectors.toSet()); + user.setAuthorities(authorities); + } + userRepository.save(user); + this.clearUserCaches(user); + log.debug("Created Information for User: {}", user); + return user; + } + + /** + * Update all information for a specific user, and return the modified user. + * + * @param userDTO user to update. + * @return updated user. + */ + public Optional updateUser(AdminUserDTO userDTO) { + return Optional + .of(userRepository.findById(userDTO.getId())) + .filter(Optional::isPresent) + .map(Optional::get) + .map( + user -> { + this.clearUserCaches(user); + user.setLogin(userDTO.getLogin().toLowerCase()); + user.setFirstName(userDTO.getFirstName()); + user.setLastName(userDTO.getLastName()); + if (userDTO.getEmail() != null) { + user.setEmail(userDTO.getEmail().toLowerCase()); + } + user.setImageUrl(userDTO.getImageUrl()); + user.setActivated(userDTO.isActivated()); + user.setLangKey(userDTO.getLangKey()); + Set managedAuthorities = user.getAuthorities(); + managedAuthorities.clear(); + userDTO + .getAuthorities() + .stream() + .map(authorityRepository::findById) + .filter(Optional::isPresent) + .map(Optional::get) + .forEach(managedAuthorities::add); + this.clearUserCaches(user); + log.debug("Changed Information for User: {}", user); + return user; + } + ) + .map(AdminUserDTO::new); + } + + public void deleteUser(String login) { + userRepository + .findOneByLogin(login) + .ifPresent( + user -> { + userRepository.delete(user); + this.clearUserCaches(user); + log.debug("Deleted User: {}", user); + } + ); + } + + /** + * Update basic information (first name, last name, email, language) for the current user. + * + * @param firstName first name of user. + * @param lastName last name of user. + * @param email email id of user. + * @param langKey language key. + * @param imageUrl image URL of user. + */ + public void updateUser(String firstName, String lastName, String email, String langKey, String imageUrl) { + SecurityUtils + .getCurrentUserLogin() + .flatMap(userRepository::findOneByLogin) + .ifPresent( + user -> { + user.setFirstName(firstName); + user.setLastName(lastName); + if (email != null) { + user.setEmail(email.toLowerCase()); + } + user.setLangKey(langKey); + user.setImageUrl(imageUrl); + this.clearUserCaches(user); + log.debug("Changed Information for User: {}", user); + } + ); + } + + @Transactional + public void changePassword(String currentClearTextPassword, String newPassword) { + SecurityUtils + .getCurrentUserLogin() + .flatMap(userRepository::findOneByLogin) + .ifPresent( + user -> { + String currentEncryptedPassword = user.getPassword(); + if (!passwordEncoder.matches(currentClearTextPassword, currentEncryptedPassword)) { + throw new InvalidPasswordException(); + } + String encryptedPassword = passwordEncoder.encode(newPassword); + user.setPassword(encryptedPassword); + this.clearUserCaches(user); + log.debug("Changed password for User: {}", user); + } + ); + } + + @Transactional(readOnly = true) + public Page getAllManagedUsers(Pageable pageable) { + return userRepository.findAll(pageable).map(AdminUserDTO::new); + } + + @Transactional(readOnly = true) + public Page getAllPublicUsers(Pageable pageable) { + return userRepository.findAllByIdNotNullAndActivatedIsTrue(pageable).map(UserDTO::new); + } + + @Transactional(readOnly = true) + public Optional getUserWithAuthoritiesByLogin(String login) { + return userRepository.findOneWithAuthoritiesByLogin(login); + } + + @Transactional(readOnly = true) + public Optional getUserWithAuthorities() { + return SecurityUtils.getCurrentUserLogin().flatMap(userRepository::findOneWithAuthoritiesByLogin); + } + + /** + * Not activated users should be automatically deleted after 3 days. + *

+ * This is scheduled to get fired everyday, at 01:00 (am). + */ + @Scheduled(cron = "0 0 1 * * ?") + public void removeNotActivatedUsers() { + userRepository + .findAllByActivatedIsFalseAndActivationKeyIsNotNullAndCreatedDateBefore(Instant.now().minus(3, ChronoUnit.DAYS)) + .forEach( + user -> { + log.debug("Deleting not activated user {}", user.getLogin()); + userRepository.delete(user); + this.clearUserCaches(user); + } + ); + } + + /** + * Gets a list of all the authorities. + * @return a list of all the authorities. + */ + @Transactional(readOnly = true) + public List getAuthorities() { + return authorityRepository.findAll().stream().map(Authority::getName).collect(Collectors.toList()); + } + + private void clearUserCaches(User user) { + Objects.requireNonNull(cacheManager.getCache(UserRepository.USERS_BY_LOGIN_CACHE)).evict(user.getLogin()); + if (user.getEmail() != null) { + Objects.requireNonNull(cacheManager.getCache(UserRepository.USERS_BY_EMAIL_CACHE)).evict(user.getEmail()); + } + } +} diff --git a/src/main/java/org/datasurvey/service/UsernameAlreadyUsedException.java b/src/main/java/org/datasurvey/service/UsernameAlreadyUsedException.java new file mode 100644 index 0000000..a5a4b1e --- /dev/null +++ b/src/main/java/org/datasurvey/service/UsernameAlreadyUsedException.java @@ -0,0 +1,10 @@ +package org.datasurvey.service; + +public class UsernameAlreadyUsedException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + public UsernameAlreadyUsedException() { + super("Login name already used!"); + } +} diff --git a/src/main/java/org/datasurvey/service/UsuarioEncuestaQueryService.java b/src/main/java/org/datasurvey/service/UsuarioEncuestaQueryService.java new file mode 100644 index 0000000..40c798a --- /dev/null +++ b/src/main/java/org/datasurvey/service/UsuarioEncuestaQueryService.java @@ -0,0 +1,114 @@ +package org.datasurvey.service; + +import java.util.List; +import javax.persistence.criteria.JoinType; +import org.datasurvey.domain.*; // for static metamodels +import org.datasurvey.domain.UsuarioEncuesta; +import org.datasurvey.repository.UsuarioEncuestaRepository; +import org.datasurvey.service.criteria.UsuarioEncuestaCriteria; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import tech.jhipster.service.QueryService; + +/** + * Service for executing complex queries for {@link UsuarioEncuesta} entities in the database. + * The main input is a {@link UsuarioEncuestaCriteria} which gets converted to {@link Specification}, + * in a way that all the filters must apply. + * It returns a {@link List} of {@link UsuarioEncuesta} or a {@link Page} of {@link UsuarioEncuesta} which fulfills the criteria. + */ +@Service +@Transactional(readOnly = true) +public class UsuarioEncuestaQueryService extends QueryService { + + private final Logger log = LoggerFactory.getLogger(UsuarioEncuestaQueryService.class); + + private final UsuarioEncuestaRepository usuarioEncuestaRepository; + + public UsuarioEncuestaQueryService(UsuarioEncuestaRepository usuarioEncuestaRepository) { + this.usuarioEncuestaRepository = usuarioEncuestaRepository; + } + + /** + * Return a {@link List} of {@link UsuarioEncuesta} which matches the criteria from the database. + * @param criteria The object which holds all the filters, which the entities should match. + * @return the matching entities. + */ + @Transactional(readOnly = true) + public List findByCriteria(UsuarioEncuestaCriteria criteria) { + log.debug("find by criteria : {}", criteria); + final Specification specification = createSpecification(criteria); + return usuarioEncuestaRepository.findAll(specification); + } + + /** + * Return a {@link Page} of {@link UsuarioEncuesta} which matches the criteria from the database. + * @param criteria The object which holds all the filters, which the entities should match. + * @param page The page, which should be returned. + * @return the matching entities. + */ + @Transactional(readOnly = true) + public Page findByCriteria(UsuarioEncuestaCriteria criteria, Pageable page) { + log.debug("find by criteria : {}, page: {}", criteria, page); + final Specification specification = createSpecification(criteria); + return usuarioEncuestaRepository.findAll(specification, page); + } + + /** + * Return the number of matching entities in the database. + * @param criteria The object which holds all the filters, which the entities should match. + * @return the number of matching entities. + */ + @Transactional(readOnly = true) + public long countByCriteria(UsuarioEncuestaCriteria criteria) { + log.debug("count by criteria : {}", criteria); + final Specification specification = createSpecification(criteria); + return usuarioEncuestaRepository.count(specification); + } + + /** + * Function to convert {@link UsuarioEncuestaCriteria} to a {@link Specification} + * @param criteria The object which holds all the filters, which the entities should match. + * @return the matching {@link Specification} of the entity. + */ + protected Specification createSpecification(UsuarioEncuestaCriteria criteria) { + Specification specification = Specification.where(null); + if (criteria != null) { + if (criteria.getId() != null) { + specification = specification.and(buildRangeSpecification(criteria.getId(), UsuarioEncuesta_.id)); + } + if (criteria.getRol() != null) { + specification = specification.and(buildSpecification(criteria.getRol(), UsuarioEncuesta_.rol)); + } + if (criteria.getEstado() != null) { + specification = specification.and(buildSpecification(criteria.getEstado(), UsuarioEncuesta_.estado)); + } + if (criteria.getFechaAgregado() != null) { + specification = specification.and(buildRangeSpecification(criteria.getFechaAgregado(), UsuarioEncuesta_.fechaAgregado)); + } + if (criteria.getUsuarioExtraId() != null) { + specification = + specification.and( + buildSpecification( + criteria.getUsuarioExtraId(), + root -> root.join(UsuarioEncuesta_.usuarioExtra, JoinType.LEFT).get(UsuarioExtra_.id) + ) + ); + } + if (criteria.getEncuestaId() != null) { + specification = + specification.and( + buildSpecification( + criteria.getEncuestaId(), + root -> root.join(UsuarioEncuesta_.encuesta, JoinType.LEFT).get(Encuesta_.id) + ) + ); + } + } + return specification; + } +} diff --git a/src/main/java/org/datasurvey/service/UsuarioEncuestaService.java b/src/main/java/org/datasurvey/service/UsuarioEncuestaService.java new file mode 100644 index 0000000..84fc039 --- /dev/null +++ b/src/main/java/org/datasurvey/service/UsuarioEncuestaService.java @@ -0,0 +1,99 @@ +package org.datasurvey.service; + +import java.util.List; +import java.util.Optional; +import org.datasurvey.domain.UsuarioEncuesta; +import org.datasurvey.repository.UsuarioEncuestaRepository; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * Service Implementation for managing {@link UsuarioEncuesta}. + */ +@Service +@Transactional +public class UsuarioEncuestaService { + + private final Logger log = LoggerFactory.getLogger(UsuarioEncuestaService.class); + + private final UsuarioEncuestaRepository usuarioEncuestaRepository; + + public UsuarioEncuestaService(UsuarioEncuestaRepository usuarioEncuestaRepository) { + this.usuarioEncuestaRepository = usuarioEncuestaRepository; + } + + /** + * Save a usuarioEncuesta. + * + * @param usuarioEncuesta the entity to save. + * @return the persisted entity. + */ + public UsuarioEncuesta save(UsuarioEncuesta usuarioEncuesta) { + log.debug("Request to save UsuarioEncuesta : {}", usuarioEncuesta); + return usuarioEncuestaRepository.save(usuarioEncuesta); + } + + /** + * Partially update a usuarioEncuesta. + * + * @param usuarioEncuesta the entity to update partially. + * @return the persisted entity. + */ + public Optional partialUpdate(UsuarioEncuesta usuarioEncuesta) { + log.debug("Request to partially update UsuarioEncuesta : {}", usuarioEncuesta); + + return usuarioEncuestaRepository + .findById(usuarioEncuesta.getId()) + .map( + existingUsuarioEncuesta -> { + if (usuarioEncuesta.getRol() != null) { + existingUsuarioEncuesta.setRol(usuarioEncuesta.getRol()); + } + if (usuarioEncuesta.getEstado() != null) { + existingUsuarioEncuesta.setEstado(usuarioEncuesta.getEstado()); + } + if (usuarioEncuesta.getFechaAgregado() != null) { + existingUsuarioEncuesta.setFechaAgregado(usuarioEncuesta.getFechaAgregado()); + } + + return existingUsuarioEncuesta; + } + ) + .map(usuarioEncuestaRepository::save); + } + + /** + * Get all the usuarioEncuestas. + * + * @return the list of entities. + */ + @Transactional(readOnly = true) + public List findAll() { + log.debug("Request to get all UsuarioEncuestas"); + return usuarioEncuestaRepository.findAll(); + } + + /** + * Get one usuarioEncuesta by id. + * + * @param id the id of the entity. + * @return the entity. + */ + @Transactional(readOnly = true) + public Optional findOne(Long id) { + log.debug("Request to get UsuarioEncuesta : {}", id); + return usuarioEncuestaRepository.findById(id); + } + + /** + * Delete the usuarioEncuesta by id. + * + * @param id the id of the entity. + */ + public void delete(Long id) { + log.debug("Request to delete UsuarioEncuesta : {}", id); + usuarioEncuestaRepository.deleteById(id); + } +} diff --git a/src/main/java/org/datasurvey/service/UsuarioExtraQueryService.java b/src/main/java/org/datasurvey/service/UsuarioExtraQueryService.java new file mode 100644 index 0000000..c6f2735 --- /dev/null +++ b/src/main/java/org/datasurvey/service/UsuarioExtraQueryService.java @@ -0,0 +1,132 @@ +package org.datasurvey.service; + +import java.util.List; +import javax.persistence.criteria.JoinType; +import org.datasurvey.domain.*; // for static metamodels +import org.datasurvey.domain.UsuarioExtra; +import org.datasurvey.repository.UsuarioExtraRepository; +import org.datasurvey.service.criteria.UsuarioExtraCriteria; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import tech.jhipster.service.QueryService; + +/** + * Service for executing complex queries for {@link UsuarioExtra} entities in the database. + * The main input is a {@link UsuarioExtraCriteria} which gets converted to {@link Specification}, + * in a way that all the filters must apply. + * It returns a {@link List} of {@link UsuarioExtra} or a {@link Page} of {@link UsuarioExtra} which fulfills the criteria. + */ +@Service +@Transactional(readOnly = true) +public class UsuarioExtraQueryService extends QueryService { + + private final Logger log = LoggerFactory.getLogger(UsuarioExtraQueryService.class); + + private final UsuarioExtraRepository usuarioExtraRepository; + + public UsuarioExtraQueryService(UsuarioExtraRepository usuarioExtraRepository) { + this.usuarioExtraRepository = usuarioExtraRepository; + } + + /** + * Return a {@link List} of {@link UsuarioExtra} which matches the criteria from the database. + * @param criteria The object which holds all the filters, which the entities should match. + * @return the matching entities. + */ + @Transactional(readOnly = true) + public List findByCriteria(UsuarioExtraCriteria criteria) { + log.debug("find by criteria : {}", criteria); + final Specification specification = createSpecification(criteria); + return usuarioExtraRepository.findAll(specification); + } + + /** + * Return a {@link Page} of {@link UsuarioExtra} which matches the criteria from the database. + * @param criteria The object which holds all the filters, which the entities should match. + * @param page The page, which should be returned. + * @return the matching entities. + */ + @Transactional(readOnly = true) + public Page findByCriteria(UsuarioExtraCriteria criteria, Pageable page) { + log.debug("find by criteria : {}, page: {}", criteria, page); + final Specification specification = createSpecification(criteria); + return usuarioExtraRepository.findAll(specification, page); + } + + /** + * Return the number of matching entities in the database. + * @param criteria The object which holds all the filters, which the entities should match. + * @return the number of matching entities. + */ + @Transactional(readOnly = true) + public long countByCriteria(UsuarioExtraCriteria criteria) { + log.debug("count by criteria : {}", criteria); + final Specification specification = createSpecification(criteria); + return usuarioExtraRepository.count(specification); + } + + /** + * Function to convert {@link UsuarioExtraCriteria} to a {@link Specification} + * @param criteria The object which holds all the filters, which the entities should match. + * @return the matching {@link Specification} of the entity. + */ + protected Specification createSpecification(UsuarioExtraCriteria criteria) { + Specification specification = Specification.where(null); + if (criteria != null) { + if (criteria.getId() != null) { + specification = specification.and(buildRangeSpecification(criteria.getId(), UsuarioExtra_.id)); + } + if (criteria.getNombre() != null) { + specification = specification.and(buildStringSpecification(criteria.getNombre(), UsuarioExtra_.nombre)); + } + if (criteria.getIconoPerfil() != null) { + specification = specification.and(buildStringSpecification(criteria.getIconoPerfil(), UsuarioExtra_.iconoPerfil)); + } + if (criteria.getFechaNacimiento() != null) { + specification = specification.and(buildRangeSpecification(criteria.getFechaNacimiento(), UsuarioExtra_.fechaNacimiento)); + } + if (criteria.getEstado() != null) { + specification = specification.and(buildSpecification(criteria.getEstado(), UsuarioExtra_.estado)); + } + if (criteria.getUserId() != null) { + specification = + specification.and( + buildSpecification(criteria.getUserId(), root -> root.join(UsuarioExtra_.user, JoinType.LEFT).get(User_.id)) + ); + } + if (criteria.getEncuestaId() != null) { + specification = + specification.and( + buildSpecification( + criteria.getEncuestaId(), + root -> root.join(UsuarioExtra_.encuestas, JoinType.LEFT).get(Encuesta_.id) + ) + ); + } + if (criteria.getUsuarioEncuestaId() != null) { + specification = + specification.and( + buildSpecification( + criteria.getUsuarioEncuestaId(), + root -> root.join(UsuarioExtra_.usuarioEncuestas, JoinType.LEFT).get(UsuarioEncuesta_.id) + ) + ); + } + if (criteria.getPlantillaId() != null) { + specification = + specification.and( + buildSpecification( + criteria.getPlantillaId(), + root -> root.join(UsuarioExtra_.plantillas, JoinType.LEFT).get(Plantilla_.id) + ) + ); + } + } + return specification; + } +} diff --git a/src/main/java/org/datasurvey/service/UsuarioExtraService.java b/src/main/java/org/datasurvey/service/UsuarioExtraService.java new file mode 100644 index 0000000..ebb89c3 --- /dev/null +++ b/src/main/java/org/datasurvey/service/UsuarioExtraService.java @@ -0,0 +1,113 @@ +package org.datasurvey.service; + +import java.util.List; +import java.util.Optional; +import org.datasurvey.domain.UsuarioExtra; +import org.datasurvey.repository.UsuarioExtraRepository; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * Service Implementation for managing {@link UsuarioExtra}. + */ +@Service +@Transactional +public class UsuarioExtraService { + + private final Logger log = LoggerFactory.getLogger(UsuarioExtraService.class); + + private final UsuarioExtraRepository usuarioExtraRepository; + + public UsuarioExtraService(UsuarioExtraRepository usuarioExtraRepository) { + this.usuarioExtraRepository = usuarioExtraRepository; + } + + /** + * Save a usuarioExtra. + * + * @param usuarioExtra the entity to save. + * @return the persisted entity. + */ + public UsuarioExtra save(UsuarioExtra usuarioExtra) { + log.debug("Request to save UsuarioExtra : {}", usuarioExtra); + return usuarioExtraRepository.save(usuarioExtra); + } + + /** + * Partially update a usuarioExtra. + * + * @param usuarioExtra the entity to update partially. + * @return the persisted entity. + */ + public Optional partialUpdate(UsuarioExtra usuarioExtra) { + log.debug("Request to partially update UsuarioExtra : {}", usuarioExtra); + + return usuarioExtraRepository + .findById(usuarioExtra.getId()) + .map( + existingUsuarioExtra -> { + if (usuarioExtra.getNombre() != null) { + existingUsuarioExtra.setNombre(usuarioExtra.getNombre()); + } + if (usuarioExtra.getIconoPerfil() != null) { + existingUsuarioExtra.setIconoPerfil(usuarioExtra.getIconoPerfil()); + } + if (usuarioExtra.getFechaNacimiento() != null) { + existingUsuarioExtra.setFechaNacimiento(usuarioExtra.getFechaNacimiento()); + } + if (usuarioExtra.getEstado() != null) { + existingUsuarioExtra.setEstado(usuarioExtra.getEstado()); + } + + return existingUsuarioExtra; + } + ) + .map(usuarioExtraRepository::save); + } + + /** + * Get all the usuarioExtras. + * + * @return the list of entities. + */ + @Transactional(readOnly = true) + public List findAll() { + log.debug("Request to get all UsuarioExtras"); + return usuarioExtraRepository.findAllWithEagerRelationships(); + } + + /** + * Get all the usuarioExtras with eager load of many-to-many relationships. + * + * @return the list of entities. + */ + public Page findAllWithEagerRelationships(Pageable pageable) { + return usuarioExtraRepository.findAllWithEagerRelationships(pageable); + } + + /** + * Get one usuarioExtra by id. + * + * @param id the id of the entity. + * @return the entity. + */ + @Transactional(readOnly = true) + public Optional findOne(Long id) { + log.debug("Request to get UsuarioExtra : {}", id); + return usuarioExtraRepository.findOneWithEagerRelationships(id); + } + + /** + * Delete the usuarioExtra by id. + * + * @param id the id of the entity. + */ + public void delete(Long id) { + log.debug("Request to delete UsuarioExtra : {}", id); + usuarioExtraRepository.deleteById(id); + } +} diff --git a/src/main/java/org/datasurvey/service/criteria/CategoriaCriteria.java b/src/main/java/org/datasurvey/service/criteria/CategoriaCriteria.java new file mode 100644 index 0000000..d8e6c3e --- /dev/null +++ b/src/main/java/org/datasurvey/service/criteria/CategoriaCriteria.java @@ -0,0 +1,179 @@ +package org.datasurvey.service.criteria; + +import java.io.Serializable; +import java.util.Objects; +import org.datasurvey.domain.enumeration.EstadoCategoria; +import tech.jhipster.service.Criteria; +import tech.jhipster.service.filter.BooleanFilter; +import tech.jhipster.service.filter.DoubleFilter; +import tech.jhipster.service.filter.Filter; +import tech.jhipster.service.filter.FloatFilter; +import tech.jhipster.service.filter.IntegerFilter; +import tech.jhipster.service.filter.LongFilter; +import tech.jhipster.service.filter.StringFilter; + +/** + * Criteria class for the {@link org.datasurvey.domain.Categoria} entity. This class is used + * in {@link org.datasurvey.web.rest.CategoriaResource} to receive all the possible filtering options from + * the Http GET request parameters. + * For example the following could be a valid request: + * {@code /categorias?id.greaterThan=5&attr1.contains=something&attr2.specified=false} + * As Spring is unable to properly convert the types, unless specific {@link Filter} class are used, we need to use + * fix type specific filters. + */ +public class CategoriaCriteria implements Serializable, Criteria { + + /** + * Class for filtering EstadoCategoria + */ + public static class EstadoCategoriaFilter extends Filter { + + public EstadoCategoriaFilter() {} + + public EstadoCategoriaFilter(EstadoCategoriaFilter filter) { + super(filter); + } + + @Override + public EstadoCategoriaFilter copy() { + return new EstadoCategoriaFilter(this); + } + } + + private static final long serialVersionUID = 1L; + + private LongFilter id; + + private StringFilter nombre; + + private EstadoCategoriaFilter estado; + + private LongFilter encuestaId; + + private LongFilter plantillaId; + + public CategoriaCriteria() {} + + public CategoriaCriteria(CategoriaCriteria other) { + this.id = other.id == null ? null : other.id.copy(); + this.nombre = other.nombre == null ? null : other.nombre.copy(); + this.estado = other.estado == null ? null : other.estado.copy(); + this.encuestaId = other.encuestaId == null ? null : other.encuestaId.copy(); + this.plantillaId = other.plantillaId == null ? null : other.plantillaId.copy(); + } + + @Override + public CategoriaCriteria copy() { + return new CategoriaCriteria(this); + } + + public LongFilter getId() { + return id; + } + + public LongFilter id() { + if (id == null) { + id = new LongFilter(); + } + return id; + } + + public void setId(LongFilter id) { + this.id = id; + } + + public StringFilter getNombre() { + return nombre; + } + + public StringFilter nombre() { + if (nombre == null) { + nombre = new StringFilter(); + } + return nombre; + } + + public void setNombre(StringFilter nombre) { + this.nombre = nombre; + } + + public EstadoCategoriaFilter getEstado() { + return estado; + } + + public EstadoCategoriaFilter estado() { + if (estado == null) { + estado = new EstadoCategoriaFilter(); + } + return estado; + } + + public void setEstado(EstadoCategoriaFilter estado) { + this.estado = estado; + } + + public LongFilter getEncuestaId() { + return encuestaId; + } + + public LongFilter encuestaId() { + if (encuestaId == null) { + encuestaId = new LongFilter(); + } + return encuestaId; + } + + public void setEncuestaId(LongFilter encuestaId) { + this.encuestaId = encuestaId; + } + + public LongFilter getPlantillaId() { + return plantillaId; + } + + public LongFilter plantillaId() { + if (plantillaId == null) { + plantillaId = new LongFilter(); + } + return plantillaId; + } + + public void setPlantillaId(LongFilter plantillaId) { + this.plantillaId = plantillaId; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + final CategoriaCriteria that = (CategoriaCriteria) o; + return ( + Objects.equals(id, that.id) && + Objects.equals(nombre, that.nombre) && + Objects.equals(estado, that.estado) && + Objects.equals(encuestaId, that.encuestaId) && + Objects.equals(plantillaId, that.plantillaId) + ); + } + + @Override + public int hashCode() { + return Objects.hash(id, nombre, estado, encuestaId, plantillaId); + } + + // prettier-ignore + @Override + public String toString() { + return "CategoriaCriteria{" + + (id != null ? "id=" + id + ", " : "") + + (nombre != null ? "nombre=" + nombre + ", " : "") + + (estado != null ? "estado=" + estado + ", " : "") + + (encuestaId != null ? "encuestaId=" + encuestaId + ", " : "") + + (plantillaId != null ? "plantillaId=" + plantillaId + ", " : "") + + "}"; + } +} diff --git a/src/main/java/org/datasurvey/service/criteria/EPreguntaAbiertaCriteria.java b/src/main/java/org/datasurvey/service/criteria/EPreguntaAbiertaCriteria.java new file mode 100644 index 0000000..6d3900f --- /dev/null +++ b/src/main/java/org/datasurvey/service/criteria/EPreguntaAbiertaCriteria.java @@ -0,0 +1,181 @@ +package org.datasurvey.service.criteria; + +import java.io.Serializable; +import java.util.Objects; +import tech.jhipster.service.Criteria; +import tech.jhipster.service.filter.BooleanFilter; +import tech.jhipster.service.filter.DoubleFilter; +import tech.jhipster.service.filter.Filter; +import tech.jhipster.service.filter.FloatFilter; +import tech.jhipster.service.filter.IntegerFilter; +import tech.jhipster.service.filter.LongFilter; +import tech.jhipster.service.filter.StringFilter; + +/** + * Criteria class for the {@link org.datasurvey.domain.EPreguntaAbierta} entity. This class is used + * in {@link org.datasurvey.web.rest.EPreguntaAbiertaResource} to receive all the possible filtering options from + * the Http GET request parameters. + * For example the following could be a valid request: + * {@code /e-pregunta-abiertas?id.greaterThan=5&attr1.contains=something&attr2.specified=false} + * As Spring is unable to properly convert the types, unless specific {@link Filter} class are used, we need to use + * fix type specific filters. + */ +public class EPreguntaAbiertaCriteria implements Serializable, Criteria { + + private static final long serialVersionUID = 1L; + + private LongFilter id; + + private StringFilter nombre; + + private BooleanFilter opcional; + + private IntegerFilter orden; + + private LongFilter ePreguntaAbiertaRespuestaId; + + private LongFilter encuestaId; + + public EPreguntaAbiertaCriteria() {} + + public EPreguntaAbiertaCriteria(EPreguntaAbiertaCriteria other) { + this.id = other.id == null ? null : other.id.copy(); + this.nombre = other.nombre == null ? null : other.nombre.copy(); + this.opcional = other.opcional == null ? null : other.opcional.copy(); + this.orden = other.orden == null ? null : other.orden.copy(); + this.ePreguntaAbiertaRespuestaId = other.ePreguntaAbiertaRespuestaId == null ? null : other.ePreguntaAbiertaRespuestaId.copy(); + this.encuestaId = other.encuestaId == null ? null : other.encuestaId.copy(); + } + + @Override + public EPreguntaAbiertaCriteria copy() { + return new EPreguntaAbiertaCriteria(this); + } + + public LongFilter getId() { + return id; + } + + public LongFilter id() { + if (id == null) { + id = new LongFilter(); + } + return id; + } + + public void setId(LongFilter id) { + this.id = id; + } + + public StringFilter getNombre() { + return nombre; + } + + public StringFilter nombre() { + if (nombre == null) { + nombre = new StringFilter(); + } + return nombre; + } + + public void setNombre(StringFilter nombre) { + this.nombre = nombre; + } + + public BooleanFilter getOpcional() { + return opcional; + } + + public BooleanFilter opcional() { + if (opcional == null) { + opcional = new BooleanFilter(); + } + return opcional; + } + + public void setOpcional(BooleanFilter opcional) { + this.opcional = opcional; + } + + public IntegerFilter getOrden() { + return orden; + } + + public IntegerFilter orden() { + if (orden == null) { + orden = new IntegerFilter(); + } + return orden; + } + + public void setOrden(IntegerFilter orden) { + this.orden = orden; + } + + public LongFilter getEPreguntaAbiertaRespuestaId() { + return ePreguntaAbiertaRespuestaId; + } + + public LongFilter ePreguntaAbiertaRespuestaId() { + if (ePreguntaAbiertaRespuestaId == null) { + ePreguntaAbiertaRespuestaId = new LongFilter(); + } + return ePreguntaAbiertaRespuestaId; + } + + public void setEPreguntaAbiertaRespuestaId(LongFilter ePreguntaAbiertaRespuestaId) { + this.ePreguntaAbiertaRespuestaId = ePreguntaAbiertaRespuestaId; + } + + public LongFilter getEncuestaId() { + return encuestaId; + } + + public LongFilter encuestaId() { + if (encuestaId == null) { + encuestaId = new LongFilter(); + } + return encuestaId; + } + + public void setEncuestaId(LongFilter encuestaId) { + this.encuestaId = encuestaId; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + final EPreguntaAbiertaCriteria that = (EPreguntaAbiertaCriteria) o; + return ( + Objects.equals(id, that.id) && + Objects.equals(nombre, that.nombre) && + Objects.equals(opcional, that.opcional) && + Objects.equals(orden, that.orden) && + Objects.equals(ePreguntaAbiertaRespuestaId, that.ePreguntaAbiertaRespuestaId) && + Objects.equals(encuestaId, that.encuestaId) + ); + } + + @Override + public int hashCode() { + return Objects.hash(id, nombre, opcional, orden, ePreguntaAbiertaRespuestaId, encuestaId); + } + + // prettier-ignore + @Override + public String toString() { + return "EPreguntaAbiertaCriteria{" + + (id != null ? "id=" + id + ", " : "") + + (nombre != null ? "nombre=" + nombre + ", " : "") + + (opcional != null ? "opcional=" + opcional + ", " : "") + + (orden != null ? "orden=" + orden + ", " : "") + + (ePreguntaAbiertaRespuestaId != null ? "ePreguntaAbiertaRespuestaId=" + ePreguntaAbiertaRespuestaId + ", " : "") + + (encuestaId != null ? "encuestaId=" + encuestaId + ", " : "") + + "}"; + } +} diff --git a/src/main/java/org/datasurvey/service/criteria/EPreguntaAbiertaRespuestaCriteria.java b/src/main/java/org/datasurvey/service/criteria/EPreguntaAbiertaRespuestaCriteria.java new file mode 100644 index 0000000..2c0a6c1 --- /dev/null +++ b/src/main/java/org/datasurvey/service/criteria/EPreguntaAbiertaRespuestaCriteria.java @@ -0,0 +1,121 @@ +package org.datasurvey.service.criteria; + +import java.io.Serializable; +import java.util.Objects; +import tech.jhipster.service.Criteria; +import tech.jhipster.service.filter.BooleanFilter; +import tech.jhipster.service.filter.DoubleFilter; +import tech.jhipster.service.filter.Filter; +import tech.jhipster.service.filter.FloatFilter; +import tech.jhipster.service.filter.IntegerFilter; +import tech.jhipster.service.filter.LongFilter; +import tech.jhipster.service.filter.StringFilter; + +/** + * Criteria class for the {@link org.datasurvey.domain.EPreguntaAbiertaRespuesta} entity. This class is used + * in {@link org.datasurvey.web.rest.EPreguntaAbiertaRespuestaResource} to receive all the possible filtering options from + * the Http GET request parameters. + * For example the following could be a valid request: + * {@code /e-pregunta-abierta-respuestas?id.greaterThan=5&attr1.contains=something&attr2.specified=false} + * As Spring is unable to properly convert the types, unless specific {@link Filter} class are used, we need to use + * fix type specific filters. + */ +public class EPreguntaAbiertaRespuestaCriteria implements Serializable, Criteria { + + private static final long serialVersionUID = 1L; + + private LongFilter id; + + private StringFilter respuesta; + + private LongFilter ePreguntaAbiertaId; + + public EPreguntaAbiertaRespuestaCriteria() {} + + public EPreguntaAbiertaRespuestaCriteria(EPreguntaAbiertaRespuestaCriteria other) { + this.id = other.id == null ? null : other.id.copy(); + this.respuesta = other.respuesta == null ? null : other.respuesta.copy(); + this.ePreguntaAbiertaId = other.ePreguntaAbiertaId == null ? null : other.ePreguntaAbiertaId.copy(); + } + + @Override + public EPreguntaAbiertaRespuestaCriteria copy() { + return new EPreguntaAbiertaRespuestaCriteria(this); + } + + public LongFilter getId() { + return id; + } + + public LongFilter id() { + if (id == null) { + id = new LongFilter(); + } + return id; + } + + public void setId(LongFilter id) { + this.id = id; + } + + public StringFilter getRespuesta() { + return respuesta; + } + + public StringFilter respuesta() { + if (respuesta == null) { + respuesta = new StringFilter(); + } + return respuesta; + } + + public void setRespuesta(StringFilter respuesta) { + this.respuesta = respuesta; + } + + public LongFilter getEPreguntaAbiertaId() { + return ePreguntaAbiertaId; + } + + public LongFilter ePreguntaAbiertaId() { + if (ePreguntaAbiertaId == null) { + ePreguntaAbiertaId = new LongFilter(); + } + return ePreguntaAbiertaId; + } + + public void setEPreguntaAbiertaId(LongFilter ePreguntaAbiertaId) { + this.ePreguntaAbiertaId = ePreguntaAbiertaId; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + final EPreguntaAbiertaRespuestaCriteria that = (EPreguntaAbiertaRespuestaCriteria) o; + return ( + Objects.equals(id, that.id) && + Objects.equals(respuesta, that.respuesta) && + Objects.equals(ePreguntaAbiertaId, that.ePreguntaAbiertaId) + ); + } + + @Override + public int hashCode() { + return Objects.hash(id, respuesta, ePreguntaAbiertaId); + } + + // prettier-ignore + @Override + public String toString() { + return "EPreguntaAbiertaRespuestaCriteria{" + + (id != null ? "id=" + id + ", " : "") + + (respuesta != null ? "respuesta=" + respuesta + ", " : "") + + (ePreguntaAbiertaId != null ? "ePreguntaAbiertaId=" + ePreguntaAbiertaId + ", " : "") + + "}"; + } +} diff --git a/src/main/java/org/datasurvey/service/criteria/EPreguntaCerradaCriteria.java b/src/main/java/org/datasurvey/service/criteria/EPreguntaCerradaCriteria.java new file mode 100644 index 0000000..e0f99e8 --- /dev/null +++ b/src/main/java/org/datasurvey/service/criteria/EPreguntaCerradaCriteria.java @@ -0,0 +1,219 @@ +package org.datasurvey.service.criteria; + +import java.io.Serializable; +import java.util.Objects; +import org.datasurvey.domain.enumeration.PreguntaCerradaTipo; +import tech.jhipster.service.Criteria; +import tech.jhipster.service.filter.BooleanFilter; +import tech.jhipster.service.filter.DoubleFilter; +import tech.jhipster.service.filter.Filter; +import tech.jhipster.service.filter.FloatFilter; +import tech.jhipster.service.filter.IntegerFilter; +import tech.jhipster.service.filter.LongFilter; +import tech.jhipster.service.filter.StringFilter; + +/** + * Criteria class for the {@link org.datasurvey.domain.EPreguntaCerrada} entity. This class is used + * in {@link org.datasurvey.web.rest.EPreguntaCerradaResource} to receive all the possible filtering options from + * the Http GET request parameters. + * For example the following could be a valid request: + * {@code /e-pregunta-cerradas?id.greaterThan=5&attr1.contains=something&attr2.specified=false} + * As Spring is unable to properly convert the types, unless specific {@link Filter} class are used, we need to use + * fix type specific filters. + */ +public class EPreguntaCerradaCriteria implements Serializable, Criteria { + + /** + * Class for filtering PreguntaCerradaTipo + */ + public static class PreguntaCerradaTipoFilter extends Filter { + + public PreguntaCerradaTipoFilter() {} + + public PreguntaCerradaTipoFilter(PreguntaCerradaTipoFilter filter) { + super(filter); + } + + @Override + public PreguntaCerradaTipoFilter copy() { + return new PreguntaCerradaTipoFilter(this); + } + } + + private static final long serialVersionUID = 1L; + + private LongFilter id; + + private StringFilter nombre; + + private PreguntaCerradaTipoFilter tipo; + + private BooleanFilter opcional; + + private IntegerFilter orden; + + private LongFilter ePreguntaCerradaOpcionId; + + private LongFilter encuestaId; + + public EPreguntaCerradaCriteria() {} + + public EPreguntaCerradaCriteria(EPreguntaCerradaCriteria other) { + this.id = other.id == null ? null : other.id.copy(); + this.nombre = other.nombre == null ? null : other.nombre.copy(); + this.tipo = other.tipo == null ? null : other.tipo.copy(); + this.opcional = other.opcional == null ? null : other.opcional.copy(); + this.orden = other.orden == null ? null : other.orden.copy(); + this.ePreguntaCerradaOpcionId = other.ePreguntaCerradaOpcionId == null ? null : other.ePreguntaCerradaOpcionId.copy(); + this.encuestaId = other.encuestaId == null ? null : other.encuestaId.copy(); + } + + @Override + public EPreguntaCerradaCriteria copy() { + return new EPreguntaCerradaCriteria(this); + } + + public LongFilter getId() { + return id; + } + + public LongFilter id() { + if (id == null) { + id = new LongFilter(); + } + return id; + } + + public void setId(LongFilter id) { + this.id = id; + } + + public StringFilter getNombre() { + return nombre; + } + + public StringFilter nombre() { + if (nombre == null) { + nombre = new StringFilter(); + } + return nombre; + } + + public void setNombre(StringFilter nombre) { + this.nombre = nombre; + } + + public PreguntaCerradaTipoFilter getTipo() { + return tipo; + } + + public PreguntaCerradaTipoFilter tipo() { + if (tipo == null) { + tipo = new PreguntaCerradaTipoFilter(); + } + return tipo; + } + + public void setTipo(PreguntaCerradaTipoFilter tipo) { + this.tipo = tipo; + } + + public BooleanFilter getOpcional() { + return opcional; + } + + public BooleanFilter opcional() { + if (opcional == null) { + opcional = new BooleanFilter(); + } + return opcional; + } + + public void setOpcional(BooleanFilter opcional) { + this.opcional = opcional; + } + + public IntegerFilter getOrden() { + return orden; + } + + public IntegerFilter orden() { + if (orden == null) { + orden = new IntegerFilter(); + } + return orden; + } + + public void setOrden(IntegerFilter orden) { + this.orden = orden; + } + + public LongFilter getEPreguntaCerradaOpcionId() { + return ePreguntaCerradaOpcionId; + } + + public LongFilter ePreguntaCerradaOpcionId() { + if (ePreguntaCerradaOpcionId == null) { + ePreguntaCerradaOpcionId = new LongFilter(); + } + return ePreguntaCerradaOpcionId; + } + + public void setEPreguntaCerradaOpcionId(LongFilter ePreguntaCerradaOpcionId) { + this.ePreguntaCerradaOpcionId = ePreguntaCerradaOpcionId; + } + + public LongFilter getEncuestaId() { + return encuestaId; + } + + public LongFilter encuestaId() { + if (encuestaId == null) { + encuestaId = new LongFilter(); + } + return encuestaId; + } + + public void setEncuestaId(LongFilter encuestaId) { + this.encuestaId = encuestaId; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + final EPreguntaCerradaCriteria that = (EPreguntaCerradaCriteria) o; + return ( + Objects.equals(id, that.id) && + Objects.equals(nombre, that.nombre) && + Objects.equals(tipo, that.tipo) && + Objects.equals(opcional, that.opcional) && + Objects.equals(orden, that.orden) && + Objects.equals(ePreguntaCerradaOpcionId, that.ePreguntaCerradaOpcionId) && + Objects.equals(encuestaId, that.encuestaId) + ); + } + + @Override + public int hashCode() { + return Objects.hash(id, nombre, tipo, opcional, orden, ePreguntaCerradaOpcionId, encuestaId); + } + + // prettier-ignore + @Override + public String toString() { + return "EPreguntaCerradaCriteria{" + + (id != null ? "id=" + id + ", " : "") + + (nombre != null ? "nombre=" + nombre + ", " : "") + + (tipo != null ? "tipo=" + tipo + ", " : "") + + (opcional != null ? "opcional=" + opcional + ", " : "") + + (orden != null ? "orden=" + orden + ", " : "") + + (ePreguntaCerradaOpcionId != null ? "ePreguntaCerradaOpcionId=" + ePreguntaCerradaOpcionId + ", " : "") + + (encuestaId != null ? "encuestaId=" + encuestaId + ", " : "") + + "}"; + } +} diff --git a/src/main/java/org/datasurvey/service/criteria/EPreguntaCerradaOpcionCriteria.java b/src/main/java/org/datasurvey/service/criteria/EPreguntaCerradaOpcionCriteria.java new file mode 100644 index 0000000..775f04f --- /dev/null +++ b/src/main/java/org/datasurvey/service/criteria/EPreguntaCerradaOpcionCriteria.java @@ -0,0 +1,161 @@ +package org.datasurvey.service.criteria; + +import java.io.Serializable; +import java.util.Objects; +import tech.jhipster.service.Criteria; +import tech.jhipster.service.filter.BooleanFilter; +import tech.jhipster.service.filter.DoubleFilter; +import tech.jhipster.service.filter.Filter; +import tech.jhipster.service.filter.FloatFilter; +import tech.jhipster.service.filter.IntegerFilter; +import tech.jhipster.service.filter.LongFilter; +import tech.jhipster.service.filter.StringFilter; + +/** + * Criteria class for the {@link org.datasurvey.domain.EPreguntaCerradaOpcion} entity. This class is used + * in {@link org.datasurvey.web.rest.EPreguntaCerradaOpcionResource} to receive all the possible filtering options from + * the Http GET request parameters. + * For example the following could be a valid request: + * {@code /e-pregunta-cerrada-opcions?id.greaterThan=5&attr1.contains=something&attr2.specified=false} + * As Spring is unable to properly convert the types, unless specific {@link Filter} class are used, we need to use + * fix type specific filters. + */ +public class EPreguntaCerradaOpcionCriteria implements Serializable, Criteria { + + private static final long serialVersionUID = 1L; + + private LongFilter id; + + private StringFilter nombre; + + private IntegerFilter orden; + + private IntegerFilter cantidad; + + private LongFilter ePreguntaCerradaId; + + public EPreguntaCerradaOpcionCriteria() {} + + public EPreguntaCerradaOpcionCriteria(EPreguntaCerradaOpcionCriteria other) { + this.id = other.id == null ? null : other.id.copy(); + this.nombre = other.nombre == null ? null : other.nombre.copy(); + this.orden = other.orden == null ? null : other.orden.copy(); + this.cantidad = other.cantidad == null ? null : other.cantidad.copy(); + this.ePreguntaCerradaId = other.ePreguntaCerradaId == null ? null : other.ePreguntaCerradaId.copy(); + } + + @Override + public EPreguntaCerradaOpcionCriteria copy() { + return new EPreguntaCerradaOpcionCriteria(this); + } + + public LongFilter getId() { + return id; + } + + public LongFilter id() { + if (id == null) { + id = new LongFilter(); + } + return id; + } + + public void setId(LongFilter id) { + this.id = id; + } + + public StringFilter getNombre() { + return nombre; + } + + public StringFilter nombre() { + if (nombre == null) { + nombre = new StringFilter(); + } + return nombre; + } + + public void setNombre(StringFilter nombre) { + this.nombre = nombre; + } + + public IntegerFilter getOrden() { + return orden; + } + + public IntegerFilter orden() { + if (orden == null) { + orden = new IntegerFilter(); + } + return orden; + } + + public void setOrden(IntegerFilter orden) { + this.orden = orden; + } + + public IntegerFilter getCantidad() { + return cantidad; + } + + public IntegerFilter cantidad() { + if (cantidad == null) { + cantidad = new IntegerFilter(); + } + return cantidad; + } + + public void setCantidad(IntegerFilter cantidad) { + this.cantidad = cantidad; + } + + public LongFilter getEPreguntaCerradaId() { + return ePreguntaCerradaId; + } + + public LongFilter ePreguntaCerradaId() { + if (ePreguntaCerradaId == null) { + ePreguntaCerradaId = new LongFilter(); + } + return ePreguntaCerradaId; + } + + public void setEPreguntaCerradaId(LongFilter ePreguntaCerradaId) { + this.ePreguntaCerradaId = ePreguntaCerradaId; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + final EPreguntaCerradaOpcionCriteria that = (EPreguntaCerradaOpcionCriteria) o; + return ( + Objects.equals(id, that.id) && + Objects.equals(nombre, that.nombre) && + Objects.equals(orden, that.orden) && + Objects.equals(cantidad, that.cantidad) && + Objects.equals(ePreguntaCerradaId, that.ePreguntaCerradaId) + ); + } + + @Override + public int hashCode() { + return Objects.hash(id, nombre, orden, cantidad, ePreguntaCerradaId); + } + + // prettier-ignore + @Override + public String toString() { + return "EPreguntaCerradaOpcionCriteria{" + + (id != null ? "id=" + id + ", " : "") + + (nombre != null ? "nombre=" + nombre + ", " : "") + + (orden != null ? "orden=" + orden + ", " : "") + + (cantidad != null ? "cantidad=" + cantidad + ", " : "") + + (ePreguntaCerradaId != null ? "ePreguntaCerradaId=" + ePreguntaCerradaId + ", " : "") + + "}"; + } +} diff --git a/src/main/java/org/datasurvey/service/criteria/EncuestaCriteria.java b/src/main/java/org/datasurvey/service/criteria/EncuestaCriteria.java new file mode 100644 index 0000000..96c4bc9 --- /dev/null +++ b/src/main/java/org/datasurvey/service/criteria/EncuestaCriteria.java @@ -0,0 +1,435 @@ +package org.datasurvey.service.criteria; + +import java.io.Serializable; +import java.util.Objects; +import org.datasurvey.domain.enumeration.AccesoEncuesta; +import org.datasurvey.domain.enumeration.EstadoEncuesta; +import tech.jhipster.service.Criteria; +import tech.jhipster.service.filter.BooleanFilter; +import tech.jhipster.service.filter.DoubleFilter; +import tech.jhipster.service.filter.Filter; +import tech.jhipster.service.filter.FloatFilter; +import tech.jhipster.service.filter.IntegerFilter; +import tech.jhipster.service.filter.LongFilter; +import tech.jhipster.service.filter.StringFilter; +import tech.jhipster.service.filter.ZonedDateTimeFilter; + +/** + * Criteria class for the {@link org.datasurvey.domain.Encuesta} entity. This class is used + * in {@link org.datasurvey.web.rest.EncuestaResource} to receive all the possible filtering options from + * the Http GET request parameters. + * For example the following could be a valid request: + * {@code /encuestas?id.greaterThan=5&attr1.contains=something&attr2.specified=false} + * As Spring is unable to properly convert the types, unless specific {@link Filter} class are used, we need to use + * fix type specific filters. + */ +public class EncuestaCriteria implements Serializable, Criteria { + + /** + * Class for filtering AccesoEncuesta + */ + public static class AccesoEncuestaFilter extends Filter { + + public AccesoEncuestaFilter() {} + + public AccesoEncuestaFilter(AccesoEncuestaFilter filter) { + super(filter); + } + + @Override + public AccesoEncuestaFilter copy() { + return new AccesoEncuestaFilter(this); + } + } + + /** + * Class for filtering EstadoEncuesta + */ + public static class EstadoEncuestaFilter extends Filter { + + public EstadoEncuestaFilter() {} + + public EstadoEncuestaFilter(EstadoEncuestaFilter filter) { + super(filter); + } + + @Override + public EstadoEncuestaFilter copy() { + return new EstadoEncuestaFilter(this); + } + } + + private static final long serialVersionUID = 1L; + + private LongFilter id; + + private StringFilter nombre; + + private StringFilter descripcion; + + private ZonedDateTimeFilter fechaCreacion; + + private ZonedDateTimeFilter fechaPublicacion; + + private ZonedDateTimeFilter fechaFinalizar; + + private ZonedDateTimeFilter fechaFinalizada; + + private DoubleFilter calificacion; + + private AccesoEncuestaFilter acceso; + + private StringFilter contrasenna; + + private EstadoEncuestaFilter estado; + + private LongFilter usuarioEncuestaId; + + private LongFilter ePreguntaAbiertaId; + + private LongFilter ePreguntaCerradaId; + + private LongFilter categoriaId; + + private LongFilter usuarioExtraId; + + public EncuestaCriteria() {} + + public EncuestaCriteria(EncuestaCriteria other) { + this.id = other.id == null ? null : other.id.copy(); + this.nombre = other.nombre == null ? null : other.nombre.copy(); + this.descripcion = other.descripcion == null ? null : other.descripcion.copy(); + this.fechaCreacion = other.fechaCreacion == null ? null : other.fechaCreacion.copy(); + this.fechaPublicacion = other.fechaPublicacion == null ? null : other.fechaPublicacion.copy(); + this.fechaFinalizar = other.fechaFinalizar == null ? null : other.fechaFinalizar.copy(); + this.fechaFinalizada = other.fechaFinalizada == null ? null : other.fechaFinalizada.copy(); + this.calificacion = other.calificacion == null ? null : other.calificacion.copy(); + this.acceso = other.acceso == null ? null : other.acceso.copy(); + this.contrasenna = other.contrasenna == null ? null : other.contrasenna.copy(); + this.estado = other.estado == null ? null : other.estado.copy(); + this.usuarioEncuestaId = other.usuarioEncuestaId == null ? null : other.usuarioEncuestaId.copy(); + this.ePreguntaAbiertaId = other.ePreguntaAbiertaId == null ? null : other.ePreguntaAbiertaId.copy(); + this.ePreguntaCerradaId = other.ePreguntaCerradaId == null ? null : other.ePreguntaCerradaId.copy(); + this.categoriaId = other.categoriaId == null ? null : other.categoriaId.copy(); + this.usuarioExtraId = other.usuarioExtraId == null ? null : other.usuarioExtraId.copy(); + } + + @Override + public EncuestaCriteria copy() { + return new EncuestaCriteria(this); + } + + public LongFilter getId() { + return id; + } + + public LongFilter id() { + if (id == null) { + id = new LongFilter(); + } + return id; + } + + public void setId(LongFilter id) { + this.id = id; + } + + public StringFilter getNombre() { + return nombre; + } + + public StringFilter nombre() { + if (nombre == null) { + nombre = new StringFilter(); + } + return nombre; + } + + public void setNombre(StringFilter nombre) { + this.nombre = nombre; + } + + public StringFilter getDescripcion() { + return descripcion; + } + + public StringFilter descripcion() { + if (descripcion == null) { + descripcion = new StringFilter(); + } + return descripcion; + } + + public void setDescripcion(StringFilter descripcion) { + this.descripcion = descripcion; + } + + public ZonedDateTimeFilter getFechaCreacion() { + return fechaCreacion; + } + + public ZonedDateTimeFilter fechaCreacion() { + if (fechaCreacion == null) { + fechaCreacion = new ZonedDateTimeFilter(); + } + return fechaCreacion; + } + + public void setFechaCreacion(ZonedDateTimeFilter fechaCreacion) { + this.fechaCreacion = fechaCreacion; + } + + public ZonedDateTimeFilter getFechaPublicacion() { + return fechaPublicacion; + } + + public ZonedDateTimeFilter fechaPublicacion() { + if (fechaPublicacion == null) { + fechaPublicacion = new ZonedDateTimeFilter(); + } + return fechaPublicacion; + } + + public void setFechaPublicacion(ZonedDateTimeFilter fechaPublicacion) { + this.fechaPublicacion = fechaPublicacion; + } + + public ZonedDateTimeFilter getFechaFinalizar() { + return fechaFinalizar; + } + + public ZonedDateTimeFilter fechaFinalizar() { + if (fechaFinalizar == null) { + fechaFinalizar = new ZonedDateTimeFilter(); + } + return fechaFinalizar; + } + + public void setFechaFinalizar(ZonedDateTimeFilter fechaFinalizar) { + this.fechaFinalizar = fechaFinalizar; + } + + public ZonedDateTimeFilter getFechaFinalizada() { + return fechaFinalizada; + } + + public ZonedDateTimeFilter fechaFinalizada() { + if (fechaFinalizada == null) { + fechaFinalizada = new ZonedDateTimeFilter(); + } + return fechaFinalizada; + } + + public void setFechaFinalizada(ZonedDateTimeFilter fechaFinalizada) { + this.fechaFinalizada = fechaFinalizada; + } + + public DoubleFilter getCalificacion() { + return calificacion; + } + + public DoubleFilter calificacion() { + if (calificacion == null) { + calificacion = new DoubleFilter(); + } + return calificacion; + } + + public void setCalificacion(DoubleFilter calificacion) { + this.calificacion = calificacion; + } + + public AccesoEncuestaFilter getAcceso() { + return acceso; + } + + public AccesoEncuestaFilter acceso() { + if (acceso == null) { + acceso = new AccesoEncuestaFilter(); + } + return acceso; + } + + public void setAcceso(AccesoEncuestaFilter acceso) { + this.acceso = acceso; + } + + public StringFilter getContrasenna() { + return contrasenna; + } + + public StringFilter contrasenna() { + if (contrasenna == null) { + contrasenna = new StringFilter(); + } + return contrasenna; + } + + public void setContrasenna(StringFilter contrasenna) { + this.contrasenna = contrasenna; + } + + public EstadoEncuestaFilter getEstado() { + return estado; + } + + public EstadoEncuestaFilter estado() { + if (estado == null) { + estado = new EstadoEncuestaFilter(); + } + return estado; + } + + public void setEstado(EstadoEncuestaFilter estado) { + this.estado = estado; + } + + public LongFilter getUsuarioEncuestaId() { + return usuarioEncuestaId; + } + + public LongFilter usuarioEncuestaId() { + if (usuarioEncuestaId == null) { + usuarioEncuestaId = new LongFilter(); + } + return usuarioEncuestaId; + } + + public void setUsuarioEncuestaId(LongFilter usuarioEncuestaId) { + this.usuarioEncuestaId = usuarioEncuestaId; + } + + public LongFilter getEPreguntaAbiertaId() { + return ePreguntaAbiertaId; + } + + public LongFilter ePreguntaAbiertaId() { + if (ePreguntaAbiertaId == null) { + ePreguntaAbiertaId = new LongFilter(); + } + return ePreguntaAbiertaId; + } + + public void setEPreguntaAbiertaId(LongFilter ePreguntaAbiertaId) { + this.ePreguntaAbiertaId = ePreguntaAbiertaId; + } + + public LongFilter getEPreguntaCerradaId() { + return ePreguntaCerradaId; + } + + public LongFilter ePreguntaCerradaId() { + if (ePreguntaCerradaId == null) { + ePreguntaCerradaId = new LongFilter(); + } + return ePreguntaCerradaId; + } + + public void setEPreguntaCerradaId(LongFilter ePreguntaCerradaId) { + this.ePreguntaCerradaId = ePreguntaCerradaId; + } + + public LongFilter getCategoriaId() { + return categoriaId; + } + + public LongFilter categoriaId() { + if (categoriaId == null) { + categoriaId = new LongFilter(); + } + return categoriaId; + } + + public void setCategoriaId(LongFilter categoriaId) { + this.categoriaId = categoriaId; + } + + public LongFilter getUsuarioExtraId() { + return usuarioExtraId; + } + + public LongFilter usuarioExtraId() { + if (usuarioExtraId == null) { + usuarioExtraId = new LongFilter(); + } + return usuarioExtraId; + } + + public void setUsuarioExtraId(LongFilter usuarioExtraId) { + this.usuarioExtraId = usuarioExtraId; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + final EncuestaCriteria that = (EncuestaCriteria) o; + return ( + Objects.equals(id, that.id) && + Objects.equals(nombre, that.nombre) && + Objects.equals(descripcion, that.descripcion) && + Objects.equals(fechaCreacion, that.fechaCreacion) && + Objects.equals(fechaPublicacion, that.fechaPublicacion) && + Objects.equals(fechaFinalizar, that.fechaFinalizar) && + Objects.equals(fechaFinalizada, that.fechaFinalizada) && + Objects.equals(calificacion, that.calificacion) && + Objects.equals(acceso, that.acceso) && + Objects.equals(contrasenna, that.contrasenna) && + Objects.equals(estado, that.estado) && + Objects.equals(usuarioEncuestaId, that.usuarioEncuestaId) && + Objects.equals(ePreguntaAbiertaId, that.ePreguntaAbiertaId) && + Objects.equals(ePreguntaCerradaId, that.ePreguntaCerradaId) && + Objects.equals(categoriaId, that.categoriaId) && + Objects.equals(usuarioExtraId, that.usuarioExtraId) + ); + } + + @Override + public int hashCode() { + return Objects.hash( + id, + nombre, + descripcion, + fechaCreacion, + fechaPublicacion, + fechaFinalizar, + fechaFinalizada, + calificacion, + acceso, + contrasenna, + estado, + usuarioEncuestaId, + ePreguntaAbiertaId, + ePreguntaCerradaId, + categoriaId, + usuarioExtraId + ); + } + + // prettier-ignore + @Override + public String toString() { + return "EncuestaCriteria{" + + (id != null ? "id=" + id + ", " : "") + + (nombre != null ? "nombre=" + nombre + ", " : "") + + (descripcion != null ? "descripcion=" + descripcion + ", " : "") + + (fechaCreacion != null ? "fechaCreacion=" + fechaCreacion + ", " : "") + + (fechaPublicacion != null ? "fechaPublicacion=" + fechaPublicacion + ", " : "") + + (fechaFinalizar != null ? "fechaFinalizar=" + fechaFinalizar + ", " : "") + + (fechaFinalizada != null ? "fechaFinalizada=" + fechaFinalizada + ", " : "") + + (calificacion != null ? "calificacion=" + calificacion + ", " : "") + + (acceso != null ? "acceso=" + acceso + ", " : "") + + (contrasenna != null ? "contrasenna=" + contrasenna + ", " : "") + + (estado != null ? "estado=" + estado + ", " : "") + + (usuarioEncuestaId != null ? "usuarioEncuestaId=" + usuarioEncuestaId + ", " : "") + + (ePreguntaAbiertaId != null ? "ePreguntaAbiertaId=" + ePreguntaAbiertaId + ", " : "") + + (ePreguntaCerradaId != null ? "ePreguntaCerradaId=" + ePreguntaCerradaId + ", " : "") + + (categoriaId != null ? "categoriaId=" + categoriaId + ", " : "") + + (usuarioExtraId != null ? "usuarioExtraId=" + usuarioExtraId + ", " : "") + + "}"; + } +} diff --git a/src/main/java/org/datasurvey/service/criteria/FacturaCriteria.java b/src/main/java/org/datasurvey/service/criteria/FacturaCriteria.java new file mode 100644 index 0000000..b848abd --- /dev/null +++ b/src/main/java/org/datasurvey/service/criteria/FacturaCriteria.java @@ -0,0 +1,162 @@ +package org.datasurvey.service.criteria; + +import java.io.Serializable; +import java.util.Objects; +import tech.jhipster.service.Criteria; +import tech.jhipster.service.filter.BooleanFilter; +import tech.jhipster.service.filter.DoubleFilter; +import tech.jhipster.service.filter.Filter; +import tech.jhipster.service.filter.FloatFilter; +import tech.jhipster.service.filter.IntegerFilter; +import tech.jhipster.service.filter.LongFilter; +import tech.jhipster.service.filter.StringFilter; +import tech.jhipster.service.filter.ZonedDateTimeFilter; + +/** + * Criteria class for the {@link org.datasurvey.domain.Factura} entity. This class is used + * in {@link org.datasurvey.web.rest.FacturaResource} to receive all the possible filtering options from + * the Http GET request parameters. + * For example the following could be a valid request: + * {@code /facturas?id.greaterThan=5&attr1.contains=something&attr2.specified=false} + * As Spring is unable to properly convert the types, unless specific {@link Filter} class are used, we need to use + * fix type specific filters. + */ +public class FacturaCriteria implements Serializable, Criteria { + + private static final long serialVersionUID = 1L; + + private LongFilter id; + + private StringFilter nombreUsuario; + + private StringFilter nombrePlantilla; + + private DoubleFilter costo; + + private ZonedDateTimeFilter fecha; + + public FacturaCriteria() {} + + public FacturaCriteria(FacturaCriteria other) { + this.id = other.id == null ? null : other.id.copy(); + this.nombreUsuario = other.nombreUsuario == null ? null : other.nombreUsuario.copy(); + this.nombrePlantilla = other.nombrePlantilla == null ? null : other.nombrePlantilla.copy(); + this.costo = other.costo == null ? null : other.costo.copy(); + this.fecha = other.fecha == null ? null : other.fecha.copy(); + } + + @Override + public FacturaCriteria copy() { + return new FacturaCriteria(this); + } + + public LongFilter getId() { + return id; + } + + public LongFilter id() { + if (id == null) { + id = new LongFilter(); + } + return id; + } + + public void setId(LongFilter id) { + this.id = id; + } + + public StringFilter getNombreUsuario() { + return nombreUsuario; + } + + public StringFilter nombreUsuario() { + if (nombreUsuario == null) { + nombreUsuario = new StringFilter(); + } + return nombreUsuario; + } + + public void setNombreUsuario(StringFilter nombreUsuario) { + this.nombreUsuario = nombreUsuario; + } + + public StringFilter getNombrePlantilla() { + return nombrePlantilla; + } + + public StringFilter nombrePlantilla() { + if (nombrePlantilla == null) { + nombrePlantilla = new StringFilter(); + } + return nombrePlantilla; + } + + public void setNombrePlantilla(StringFilter nombrePlantilla) { + this.nombrePlantilla = nombrePlantilla; + } + + public DoubleFilter getCosto() { + return costo; + } + + public DoubleFilter costo() { + if (costo == null) { + costo = new DoubleFilter(); + } + return costo; + } + + public void setCosto(DoubleFilter costo) { + this.costo = costo; + } + + public ZonedDateTimeFilter getFecha() { + return fecha; + } + + public ZonedDateTimeFilter fecha() { + if (fecha == null) { + fecha = new ZonedDateTimeFilter(); + } + return fecha; + } + + public void setFecha(ZonedDateTimeFilter fecha) { + this.fecha = fecha; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + final FacturaCriteria that = (FacturaCriteria) o; + return ( + Objects.equals(id, that.id) && + Objects.equals(nombreUsuario, that.nombreUsuario) && + Objects.equals(nombrePlantilla, that.nombrePlantilla) && + Objects.equals(costo, that.costo) && + Objects.equals(fecha, that.fecha) + ); + } + + @Override + public int hashCode() { + return Objects.hash(id, nombreUsuario, nombrePlantilla, costo, fecha); + } + + // prettier-ignore + @Override + public String toString() { + return "FacturaCriteria{" + + (id != null ? "id=" + id + ", " : "") + + (nombreUsuario != null ? "nombreUsuario=" + nombreUsuario + ", " : "") + + (nombrePlantilla != null ? "nombrePlantilla=" + nombrePlantilla + ", " : "") + + (costo != null ? "costo=" + costo + ", " : "") + + (fecha != null ? "fecha=" + fecha + ", " : "") + + "}"; + } +} diff --git a/src/main/java/org/datasurvey/service/criteria/PPreguntaAbiertaCriteria.java b/src/main/java/org/datasurvey/service/criteria/PPreguntaAbiertaCriteria.java new file mode 100644 index 0000000..9a955a8 --- /dev/null +++ b/src/main/java/org/datasurvey/service/criteria/PPreguntaAbiertaCriteria.java @@ -0,0 +1,161 @@ +package org.datasurvey.service.criteria; + +import java.io.Serializable; +import java.util.Objects; +import tech.jhipster.service.Criteria; +import tech.jhipster.service.filter.BooleanFilter; +import tech.jhipster.service.filter.DoubleFilter; +import tech.jhipster.service.filter.Filter; +import tech.jhipster.service.filter.FloatFilter; +import tech.jhipster.service.filter.IntegerFilter; +import tech.jhipster.service.filter.LongFilter; +import tech.jhipster.service.filter.StringFilter; + +/** + * Criteria class for the {@link org.datasurvey.domain.PPreguntaAbierta} entity. This class is used + * in {@link org.datasurvey.web.rest.PPreguntaAbiertaResource} to receive all the possible filtering options from + * the Http GET request parameters. + * For example the following could be a valid request: + * {@code /p-pregunta-abiertas?id.greaterThan=5&attr1.contains=something&attr2.specified=false} + * As Spring is unable to properly convert the types, unless specific {@link Filter} class are used, we need to use + * fix type specific filters. + */ +public class PPreguntaAbiertaCriteria implements Serializable, Criteria { + + private static final long serialVersionUID = 1L; + + private LongFilter id; + + private StringFilter nombre; + + private BooleanFilter opcional; + + private IntegerFilter orden; + + private LongFilter plantillaId; + + public PPreguntaAbiertaCriteria() {} + + public PPreguntaAbiertaCriteria(PPreguntaAbiertaCriteria other) { + this.id = other.id == null ? null : other.id.copy(); + this.nombre = other.nombre == null ? null : other.nombre.copy(); + this.opcional = other.opcional == null ? null : other.opcional.copy(); + this.orden = other.orden == null ? null : other.orden.copy(); + this.plantillaId = other.plantillaId == null ? null : other.plantillaId.copy(); + } + + @Override + public PPreguntaAbiertaCriteria copy() { + return new PPreguntaAbiertaCriteria(this); + } + + public LongFilter getId() { + return id; + } + + public LongFilter id() { + if (id == null) { + id = new LongFilter(); + } + return id; + } + + public void setId(LongFilter id) { + this.id = id; + } + + public StringFilter getNombre() { + return nombre; + } + + public StringFilter nombre() { + if (nombre == null) { + nombre = new StringFilter(); + } + return nombre; + } + + public void setNombre(StringFilter nombre) { + this.nombre = nombre; + } + + public BooleanFilter getOpcional() { + return opcional; + } + + public BooleanFilter opcional() { + if (opcional == null) { + opcional = new BooleanFilter(); + } + return opcional; + } + + public void setOpcional(BooleanFilter opcional) { + this.opcional = opcional; + } + + public IntegerFilter getOrden() { + return orden; + } + + public IntegerFilter orden() { + if (orden == null) { + orden = new IntegerFilter(); + } + return orden; + } + + public void setOrden(IntegerFilter orden) { + this.orden = orden; + } + + public LongFilter getPlantillaId() { + return plantillaId; + } + + public LongFilter plantillaId() { + if (plantillaId == null) { + plantillaId = new LongFilter(); + } + return plantillaId; + } + + public void setPlantillaId(LongFilter plantillaId) { + this.plantillaId = plantillaId; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + final PPreguntaAbiertaCriteria that = (PPreguntaAbiertaCriteria) o; + return ( + Objects.equals(id, that.id) && + Objects.equals(nombre, that.nombre) && + Objects.equals(opcional, that.opcional) && + Objects.equals(orden, that.orden) && + Objects.equals(plantillaId, that.plantillaId) + ); + } + + @Override + public int hashCode() { + return Objects.hash(id, nombre, opcional, orden, plantillaId); + } + + // prettier-ignore + @Override + public String toString() { + return "PPreguntaAbiertaCriteria{" + + (id != null ? "id=" + id + ", " : "") + + (nombre != null ? "nombre=" + nombre + ", " : "") + + (opcional != null ? "opcional=" + opcional + ", " : "") + + (orden != null ? "orden=" + orden + ", " : "") + + (plantillaId != null ? "plantillaId=" + plantillaId + ", " : "") + + "}"; + } +} diff --git a/src/main/java/org/datasurvey/service/criteria/PPreguntaCerradaCriteria.java b/src/main/java/org/datasurvey/service/criteria/PPreguntaCerradaCriteria.java new file mode 100644 index 0000000..839358e --- /dev/null +++ b/src/main/java/org/datasurvey/service/criteria/PPreguntaCerradaCriteria.java @@ -0,0 +1,219 @@ +package org.datasurvey.service.criteria; + +import java.io.Serializable; +import java.util.Objects; +import org.datasurvey.domain.enumeration.PreguntaCerradaTipo; +import tech.jhipster.service.Criteria; +import tech.jhipster.service.filter.BooleanFilter; +import tech.jhipster.service.filter.DoubleFilter; +import tech.jhipster.service.filter.Filter; +import tech.jhipster.service.filter.FloatFilter; +import tech.jhipster.service.filter.IntegerFilter; +import tech.jhipster.service.filter.LongFilter; +import tech.jhipster.service.filter.StringFilter; + +/** + * Criteria class for the {@link org.datasurvey.domain.PPreguntaCerrada} entity. This class is used + * in {@link org.datasurvey.web.rest.PPreguntaCerradaResource} to receive all the possible filtering options from + * the Http GET request parameters. + * For example the following could be a valid request: + * {@code /p-pregunta-cerradas?id.greaterThan=5&attr1.contains=something&attr2.specified=false} + * As Spring is unable to properly convert the types, unless specific {@link Filter} class are used, we need to use + * fix type specific filters. + */ +public class PPreguntaCerradaCriteria implements Serializable, Criteria { + + /** + * Class for filtering PreguntaCerradaTipo + */ + public static class PreguntaCerradaTipoFilter extends Filter { + + public PreguntaCerradaTipoFilter() {} + + public PreguntaCerradaTipoFilter(PreguntaCerradaTipoFilter filter) { + super(filter); + } + + @Override + public PreguntaCerradaTipoFilter copy() { + return new PreguntaCerradaTipoFilter(this); + } + } + + private static final long serialVersionUID = 1L; + + private LongFilter id; + + private StringFilter nombre; + + private PreguntaCerradaTipoFilter tipo; + + private BooleanFilter opcional; + + private IntegerFilter orden; + + private LongFilter pPreguntaCerradaOpcionId; + + private LongFilter plantillaId; + + public PPreguntaCerradaCriteria() {} + + public PPreguntaCerradaCriteria(PPreguntaCerradaCriteria other) { + this.id = other.id == null ? null : other.id.copy(); + this.nombre = other.nombre == null ? null : other.nombre.copy(); + this.tipo = other.tipo == null ? null : other.tipo.copy(); + this.opcional = other.opcional == null ? null : other.opcional.copy(); + this.orden = other.orden == null ? null : other.orden.copy(); + this.pPreguntaCerradaOpcionId = other.pPreguntaCerradaOpcionId == null ? null : other.pPreguntaCerradaOpcionId.copy(); + this.plantillaId = other.plantillaId == null ? null : other.plantillaId.copy(); + } + + @Override + public PPreguntaCerradaCriteria copy() { + return new PPreguntaCerradaCriteria(this); + } + + public LongFilter getId() { + return id; + } + + public LongFilter id() { + if (id == null) { + id = new LongFilter(); + } + return id; + } + + public void setId(LongFilter id) { + this.id = id; + } + + public StringFilter getNombre() { + return nombre; + } + + public StringFilter nombre() { + if (nombre == null) { + nombre = new StringFilter(); + } + return nombre; + } + + public void setNombre(StringFilter nombre) { + this.nombre = nombre; + } + + public PreguntaCerradaTipoFilter getTipo() { + return tipo; + } + + public PreguntaCerradaTipoFilter tipo() { + if (tipo == null) { + tipo = new PreguntaCerradaTipoFilter(); + } + return tipo; + } + + public void setTipo(PreguntaCerradaTipoFilter tipo) { + this.tipo = tipo; + } + + public BooleanFilter getOpcional() { + return opcional; + } + + public BooleanFilter opcional() { + if (opcional == null) { + opcional = new BooleanFilter(); + } + return opcional; + } + + public void setOpcional(BooleanFilter opcional) { + this.opcional = opcional; + } + + public IntegerFilter getOrden() { + return orden; + } + + public IntegerFilter orden() { + if (orden == null) { + orden = new IntegerFilter(); + } + return orden; + } + + public void setOrden(IntegerFilter orden) { + this.orden = orden; + } + + public LongFilter getPPreguntaCerradaOpcionId() { + return pPreguntaCerradaOpcionId; + } + + public LongFilter pPreguntaCerradaOpcionId() { + if (pPreguntaCerradaOpcionId == null) { + pPreguntaCerradaOpcionId = new LongFilter(); + } + return pPreguntaCerradaOpcionId; + } + + public void setPPreguntaCerradaOpcionId(LongFilter pPreguntaCerradaOpcionId) { + this.pPreguntaCerradaOpcionId = pPreguntaCerradaOpcionId; + } + + public LongFilter getPlantillaId() { + return plantillaId; + } + + public LongFilter plantillaId() { + if (plantillaId == null) { + plantillaId = new LongFilter(); + } + return plantillaId; + } + + public void setPlantillaId(LongFilter plantillaId) { + this.plantillaId = plantillaId; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + final PPreguntaCerradaCriteria that = (PPreguntaCerradaCriteria) o; + return ( + Objects.equals(id, that.id) && + Objects.equals(nombre, that.nombre) && + Objects.equals(tipo, that.tipo) && + Objects.equals(opcional, that.opcional) && + Objects.equals(orden, that.orden) && + Objects.equals(pPreguntaCerradaOpcionId, that.pPreguntaCerradaOpcionId) && + Objects.equals(plantillaId, that.plantillaId) + ); + } + + @Override + public int hashCode() { + return Objects.hash(id, nombre, tipo, opcional, orden, pPreguntaCerradaOpcionId, plantillaId); + } + + // prettier-ignore + @Override + public String toString() { + return "PPreguntaCerradaCriteria{" + + (id != null ? "id=" + id + ", " : "") + + (nombre != null ? "nombre=" + nombre + ", " : "") + + (tipo != null ? "tipo=" + tipo + ", " : "") + + (opcional != null ? "opcional=" + opcional + ", " : "") + + (orden != null ? "orden=" + orden + ", " : "") + + (pPreguntaCerradaOpcionId != null ? "pPreguntaCerradaOpcionId=" + pPreguntaCerradaOpcionId + ", " : "") + + (plantillaId != null ? "plantillaId=" + plantillaId + ", " : "") + + "}"; + } +} diff --git a/src/main/java/org/datasurvey/service/criteria/PPreguntaCerradaOpcionCriteria.java b/src/main/java/org/datasurvey/service/criteria/PPreguntaCerradaOpcionCriteria.java new file mode 100644 index 0000000..065cdda --- /dev/null +++ b/src/main/java/org/datasurvey/service/criteria/PPreguntaCerradaOpcionCriteria.java @@ -0,0 +1,141 @@ +package org.datasurvey.service.criteria; + +import java.io.Serializable; +import java.util.Objects; +import tech.jhipster.service.Criteria; +import tech.jhipster.service.filter.BooleanFilter; +import tech.jhipster.service.filter.DoubleFilter; +import tech.jhipster.service.filter.Filter; +import tech.jhipster.service.filter.FloatFilter; +import tech.jhipster.service.filter.IntegerFilter; +import tech.jhipster.service.filter.LongFilter; +import tech.jhipster.service.filter.StringFilter; + +/** + * Criteria class for the {@link org.datasurvey.domain.PPreguntaCerradaOpcion} entity. This class is used + * in {@link org.datasurvey.web.rest.PPreguntaCerradaOpcionResource} to receive all the possible filtering options from + * the Http GET request parameters. + * For example the following could be a valid request: + * {@code /p-pregunta-cerrada-opcions?id.greaterThan=5&attr1.contains=something&attr2.specified=false} + * As Spring is unable to properly convert the types, unless specific {@link Filter} class are used, we need to use + * fix type specific filters. + */ +public class PPreguntaCerradaOpcionCriteria implements Serializable, Criteria { + + private static final long serialVersionUID = 1L; + + private LongFilter id; + + private StringFilter nombre; + + private IntegerFilter orden; + + private LongFilter pPreguntaCerradaId; + + public PPreguntaCerradaOpcionCriteria() {} + + public PPreguntaCerradaOpcionCriteria(PPreguntaCerradaOpcionCriteria other) { + this.id = other.id == null ? null : other.id.copy(); + this.nombre = other.nombre == null ? null : other.nombre.copy(); + this.orden = other.orden == null ? null : other.orden.copy(); + this.pPreguntaCerradaId = other.pPreguntaCerradaId == null ? null : other.pPreguntaCerradaId.copy(); + } + + @Override + public PPreguntaCerradaOpcionCriteria copy() { + return new PPreguntaCerradaOpcionCriteria(this); + } + + public LongFilter getId() { + return id; + } + + public LongFilter id() { + if (id == null) { + id = new LongFilter(); + } + return id; + } + + public void setId(LongFilter id) { + this.id = id; + } + + public StringFilter getNombre() { + return nombre; + } + + public StringFilter nombre() { + if (nombre == null) { + nombre = new StringFilter(); + } + return nombre; + } + + public void setNombre(StringFilter nombre) { + this.nombre = nombre; + } + + public IntegerFilter getOrden() { + return orden; + } + + public IntegerFilter orden() { + if (orden == null) { + orden = new IntegerFilter(); + } + return orden; + } + + public void setOrden(IntegerFilter orden) { + this.orden = orden; + } + + public LongFilter getPPreguntaCerradaId() { + return pPreguntaCerradaId; + } + + public LongFilter pPreguntaCerradaId() { + if (pPreguntaCerradaId == null) { + pPreguntaCerradaId = new LongFilter(); + } + return pPreguntaCerradaId; + } + + public void setPPreguntaCerradaId(LongFilter pPreguntaCerradaId) { + this.pPreguntaCerradaId = pPreguntaCerradaId; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + final PPreguntaCerradaOpcionCriteria that = (PPreguntaCerradaOpcionCriteria) o; + return ( + Objects.equals(id, that.id) && + Objects.equals(nombre, that.nombre) && + Objects.equals(orden, that.orden) && + Objects.equals(pPreguntaCerradaId, that.pPreguntaCerradaId) + ); + } + + @Override + public int hashCode() { + return Objects.hash(id, nombre, orden, pPreguntaCerradaId); + } + + // prettier-ignore + @Override + public String toString() { + return "PPreguntaCerradaOpcionCriteria{" + + (id != null ? "id=" + id + ", " : "") + + (nombre != null ? "nombre=" + nombre + ", " : "") + + (orden != null ? "orden=" + orden + ", " : "") + + (pPreguntaCerradaId != null ? "pPreguntaCerradaId=" + pPreguntaCerradaId + ", " : "") + + "}"; + } +} diff --git a/src/main/java/org/datasurvey/service/criteria/ParametroAplicacionCriteria.java b/src/main/java/org/datasurvey/service/criteria/ParametroAplicacionCriteria.java new file mode 100644 index 0000000..b65d9b5 --- /dev/null +++ b/src/main/java/org/datasurvey/service/criteria/ParametroAplicacionCriteria.java @@ -0,0 +1,161 @@ +package org.datasurvey.service.criteria; + +import java.io.Serializable; +import java.util.Objects; +import tech.jhipster.service.Criteria; +import tech.jhipster.service.filter.BooleanFilter; +import tech.jhipster.service.filter.DoubleFilter; +import tech.jhipster.service.filter.Filter; +import tech.jhipster.service.filter.FloatFilter; +import tech.jhipster.service.filter.IntegerFilter; +import tech.jhipster.service.filter.LongFilter; +import tech.jhipster.service.filter.StringFilter; + +/** + * Criteria class for the {@link org.datasurvey.domain.ParametroAplicacion} entity. This class is used + * in {@link org.datasurvey.web.rest.ParametroAplicacionResource} to receive all the possible filtering options from + * the Http GET request parameters. + * For example the following could be a valid request: + * {@code /parametro-aplicacions?id.greaterThan=5&attr1.contains=something&attr2.specified=false} + * As Spring is unable to properly convert the types, unless specific {@link Filter} class are used, we need to use + * fix type specific filters. + */ +public class ParametroAplicacionCriteria implements Serializable, Criteria { + + private static final long serialVersionUID = 1L; + + private LongFilter id; + + private IntegerFilter maxDiasEncuesta; + + private IntegerFilter minDiasEncuesta; + + private IntegerFilter maxCantidadPreguntas; + + private IntegerFilter minCantidadPreguntas; + + public ParametroAplicacionCriteria() {} + + public ParametroAplicacionCriteria(ParametroAplicacionCriteria other) { + this.id = other.id == null ? null : other.id.copy(); + this.maxDiasEncuesta = other.maxDiasEncuesta == null ? null : other.maxDiasEncuesta.copy(); + this.minDiasEncuesta = other.minDiasEncuesta == null ? null : other.minDiasEncuesta.copy(); + this.maxCantidadPreguntas = other.maxCantidadPreguntas == null ? null : other.maxCantidadPreguntas.copy(); + this.minCantidadPreguntas = other.minCantidadPreguntas == null ? null : other.minCantidadPreguntas.copy(); + } + + @Override + public ParametroAplicacionCriteria copy() { + return new ParametroAplicacionCriteria(this); + } + + public LongFilter getId() { + return id; + } + + public LongFilter id() { + if (id == null) { + id = new LongFilter(); + } + return id; + } + + public void setId(LongFilter id) { + this.id = id; + } + + public IntegerFilter getMaxDiasEncuesta() { + return maxDiasEncuesta; + } + + public IntegerFilter maxDiasEncuesta() { + if (maxDiasEncuesta == null) { + maxDiasEncuesta = new IntegerFilter(); + } + return maxDiasEncuesta; + } + + public void setMaxDiasEncuesta(IntegerFilter maxDiasEncuesta) { + this.maxDiasEncuesta = maxDiasEncuesta; + } + + public IntegerFilter getMinDiasEncuesta() { + return minDiasEncuesta; + } + + public IntegerFilter minDiasEncuesta() { + if (minDiasEncuesta == null) { + minDiasEncuesta = new IntegerFilter(); + } + return minDiasEncuesta; + } + + public void setMinDiasEncuesta(IntegerFilter minDiasEncuesta) { + this.minDiasEncuesta = minDiasEncuesta; + } + + public IntegerFilter getMaxCantidadPreguntas() { + return maxCantidadPreguntas; + } + + public IntegerFilter maxCantidadPreguntas() { + if (maxCantidadPreguntas == null) { + maxCantidadPreguntas = new IntegerFilter(); + } + return maxCantidadPreguntas; + } + + public void setMaxCantidadPreguntas(IntegerFilter maxCantidadPreguntas) { + this.maxCantidadPreguntas = maxCantidadPreguntas; + } + + public IntegerFilter getMinCantidadPreguntas() { + return minCantidadPreguntas; + } + + public IntegerFilter minCantidadPreguntas() { + if (minCantidadPreguntas == null) { + minCantidadPreguntas = new IntegerFilter(); + } + return minCantidadPreguntas; + } + + public void setMinCantidadPreguntas(IntegerFilter minCantidadPreguntas) { + this.minCantidadPreguntas = minCantidadPreguntas; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + final ParametroAplicacionCriteria that = (ParametroAplicacionCriteria) o; + return ( + Objects.equals(id, that.id) && + Objects.equals(maxDiasEncuesta, that.maxDiasEncuesta) && + Objects.equals(minDiasEncuesta, that.minDiasEncuesta) && + Objects.equals(maxCantidadPreguntas, that.maxCantidadPreguntas) && + Objects.equals(minCantidadPreguntas, that.minCantidadPreguntas) + ); + } + + @Override + public int hashCode() { + return Objects.hash(id, maxDiasEncuesta, minDiasEncuesta, maxCantidadPreguntas, minCantidadPreguntas); + } + + // prettier-ignore + @Override + public String toString() { + return "ParametroAplicacionCriteria{" + + (id != null ? "id=" + id + ", " : "") + + (maxDiasEncuesta != null ? "maxDiasEncuesta=" + maxDiasEncuesta + ", " : "") + + (minDiasEncuesta != null ? "minDiasEncuesta=" + minDiasEncuesta + ", " : "") + + (maxCantidadPreguntas != null ? "maxCantidadPreguntas=" + maxCantidadPreguntas + ", " : "") + + (minCantidadPreguntas != null ? "minCantidadPreguntas=" + minCantidadPreguntas + ", " : "") + + "}"; + } +} diff --git a/src/main/java/org/datasurvey/service/criteria/PlantillaCriteria.java b/src/main/java/org/datasurvey/service/criteria/PlantillaCriteria.java new file mode 100644 index 0000000..c498899 --- /dev/null +++ b/src/main/java/org/datasurvey/service/criteria/PlantillaCriteria.java @@ -0,0 +1,312 @@ +package org.datasurvey.service.criteria; + +import java.io.Serializable; +import java.util.Objects; +import org.datasurvey.domain.enumeration.EstadoPlantilla; +import tech.jhipster.service.Criteria; +import tech.jhipster.service.filter.BooleanFilter; +import tech.jhipster.service.filter.DoubleFilter; +import tech.jhipster.service.filter.Filter; +import tech.jhipster.service.filter.FloatFilter; +import tech.jhipster.service.filter.IntegerFilter; +import tech.jhipster.service.filter.LongFilter; +import tech.jhipster.service.filter.StringFilter; +import tech.jhipster.service.filter.ZonedDateTimeFilter; + +/** + * Criteria class for the {@link org.datasurvey.domain.Plantilla} entity. This class is used + * in {@link org.datasurvey.web.rest.PlantillaResource} to receive all the possible filtering options from + * the Http GET request parameters. + * For example the following could be a valid request: + * {@code /plantillas?id.greaterThan=5&attr1.contains=something&attr2.specified=false} + * As Spring is unable to properly convert the types, unless specific {@link Filter} class are used, we need to use + * fix type specific filters. + */ +public class PlantillaCriteria implements Serializable, Criteria { + + /** + * Class for filtering EstadoPlantilla + */ + public static class EstadoPlantillaFilter extends Filter { + + public EstadoPlantillaFilter() {} + + public EstadoPlantillaFilter(EstadoPlantillaFilter filter) { + super(filter); + } + + @Override + public EstadoPlantillaFilter copy() { + return new EstadoPlantillaFilter(this); + } + } + + private static final long serialVersionUID = 1L; + + private LongFilter id; + + private StringFilter nombre; + + private StringFilter descripcion; + + private ZonedDateTimeFilter fechaCreacion; + + private ZonedDateTimeFilter fechaPublicacionTienda; + + private EstadoPlantillaFilter estado; + + private DoubleFilter precio; + + private LongFilter pPreguntaCerradaId; + + private LongFilter pPreguntaAbiertaId; + + private LongFilter categoriaId; + + private LongFilter usuarioExtraId; + + public PlantillaCriteria() {} + + public PlantillaCriteria(PlantillaCriteria other) { + this.id = other.id == null ? null : other.id.copy(); + this.nombre = other.nombre == null ? null : other.nombre.copy(); + this.descripcion = other.descripcion == null ? null : other.descripcion.copy(); + this.fechaCreacion = other.fechaCreacion == null ? null : other.fechaCreacion.copy(); + this.fechaPublicacionTienda = other.fechaPublicacionTienda == null ? null : other.fechaPublicacionTienda.copy(); + this.estado = other.estado == null ? null : other.estado.copy(); + this.precio = other.precio == null ? null : other.precio.copy(); + this.pPreguntaCerradaId = other.pPreguntaCerradaId == null ? null : other.pPreguntaCerradaId.copy(); + this.pPreguntaAbiertaId = other.pPreguntaAbiertaId == null ? null : other.pPreguntaAbiertaId.copy(); + this.categoriaId = other.categoriaId == null ? null : other.categoriaId.copy(); + this.usuarioExtraId = other.usuarioExtraId == null ? null : other.usuarioExtraId.copy(); + } + + @Override + public PlantillaCriteria copy() { + return new PlantillaCriteria(this); + } + + public LongFilter getId() { + return id; + } + + public LongFilter id() { + if (id == null) { + id = new LongFilter(); + } + return id; + } + + public void setId(LongFilter id) { + this.id = id; + } + + public StringFilter getNombre() { + return nombre; + } + + public StringFilter nombre() { + if (nombre == null) { + nombre = new StringFilter(); + } + return nombre; + } + + public void setNombre(StringFilter nombre) { + this.nombre = nombre; + } + + public StringFilter getDescripcion() { + return descripcion; + } + + public StringFilter descripcion() { + if (descripcion == null) { + descripcion = new StringFilter(); + } + return descripcion; + } + + public void setDescripcion(StringFilter descripcion) { + this.descripcion = descripcion; + } + + public ZonedDateTimeFilter getFechaCreacion() { + return fechaCreacion; + } + + public ZonedDateTimeFilter fechaCreacion() { + if (fechaCreacion == null) { + fechaCreacion = new ZonedDateTimeFilter(); + } + return fechaCreacion; + } + + public void setFechaCreacion(ZonedDateTimeFilter fechaCreacion) { + this.fechaCreacion = fechaCreacion; + } + + public ZonedDateTimeFilter getFechaPublicacionTienda() { + return fechaPublicacionTienda; + } + + public ZonedDateTimeFilter fechaPublicacionTienda() { + if (fechaPublicacionTienda == null) { + fechaPublicacionTienda = new ZonedDateTimeFilter(); + } + return fechaPublicacionTienda; + } + + public void setFechaPublicacionTienda(ZonedDateTimeFilter fechaPublicacionTienda) { + this.fechaPublicacionTienda = fechaPublicacionTienda; + } + + public EstadoPlantillaFilter getEstado() { + return estado; + } + + public EstadoPlantillaFilter estado() { + if (estado == null) { + estado = new EstadoPlantillaFilter(); + } + return estado; + } + + public void setEstado(EstadoPlantillaFilter estado) { + this.estado = estado; + } + + public DoubleFilter getPrecio() { + return precio; + } + + public DoubleFilter precio() { + if (precio == null) { + precio = new DoubleFilter(); + } + return precio; + } + + public void setPrecio(DoubleFilter precio) { + this.precio = precio; + } + + public LongFilter getPPreguntaCerradaId() { + return pPreguntaCerradaId; + } + + public LongFilter pPreguntaCerradaId() { + if (pPreguntaCerradaId == null) { + pPreguntaCerradaId = new LongFilter(); + } + return pPreguntaCerradaId; + } + + public void setPPreguntaCerradaId(LongFilter pPreguntaCerradaId) { + this.pPreguntaCerradaId = pPreguntaCerradaId; + } + + public LongFilter getPPreguntaAbiertaId() { + return pPreguntaAbiertaId; + } + + public LongFilter pPreguntaAbiertaId() { + if (pPreguntaAbiertaId == null) { + pPreguntaAbiertaId = new LongFilter(); + } + return pPreguntaAbiertaId; + } + + public void setPPreguntaAbiertaId(LongFilter pPreguntaAbiertaId) { + this.pPreguntaAbiertaId = pPreguntaAbiertaId; + } + + public LongFilter getCategoriaId() { + return categoriaId; + } + + public LongFilter categoriaId() { + if (categoriaId == null) { + categoriaId = new LongFilter(); + } + return categoriaId; + } + + public void setCategoriaId(LongFilter categoriaId) { + this.categoriaId = categoriaId; + } + + public LongFilter getUsuarioExtraId() { + return usuarioExtraId; + } + + public LongFilter usuarioExtraId() { + if (usuarioExtraId == null) { + usuarioExtraId = new LongFilter(); + } + return usuarioExtraId; + } + + public void setUsuarioExtraId(LongFilter usuarioExtraId) { + this.usuarioExtraId = usuarioExtraId; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + final PlantillaCriteria that = (PlantillaCriteria) o; + return ( + Objects.equals(id, that.id) && + Objects.equals(nombre, that.nombre) && + Objects.equals(descripcion, that.descripcion) && + Objects.equals(fechaCreacion, that.fechaCreacion) && + Objects.equals(fechaPublicacionTienda, that.fechaPublicacionTienda) && + Objects.equals(estado, that.estado) && + Objects.equals(precio, that.precio) && + Objects.equals(pPreguntaCerradaId, that.pPreguntaCerradaId) && + Objects.equals(pPreguntaAbiertaId, that.pPreguntaAbiertaId) && + Objects.equals(categoriaId, that.categoriaId) && + Objects.equals(usuarioExtraId, that.usuarioExtraId) + ); + } + + @Override + public int hashCode() { + return Objects.hash( + id, + nombre, + descripcion, + fechaCreacion, + fechaPublicacionTienda, + estado, + precio, + pPreguntaCerradaId, + pPreguntaAbiertaId, + categoriaId, + usuarioExtraId + ); + } + + // prettier-ignore + @Override + public String toString() { + return "PlantillaCriteria{" + + (id != null ? "id=" + id + ", " : "") + + (nombre != null ? "nombre=" + nombre + ", " : "") + + (descripcion != null ? "descripcion=" + descripcion + ", " : "") + + (fechaCreacion != null ? "fechaCreacion=" + fechaCreacion + ", " : "") + + (fechaPublicacionTienda != null ? "fechaPublicacionTienda=" + fechaPublicacionTienda + ", " : "") + + (estado != null ? "estado=" + estado + ", " : "") + + (precio != null ? "precio=" + precio + ", " : "") + + (pPreguntaCerradaId != null ? "pPreguntaCerradaId=" + pPreguntaCerradaId + ", " : "") + + (pPreguntaAbiertaId != null ? "pPreguntaAbiertaId=" + pPreguntaAbiertaId + ", " : "") + + (categoriaId != null ? "categoriaId=" + categoriaId + ", " : "") + + (usuarioExtraId != null ? "usuarioExtraId=" + usuarioExtraId + ", " : "") + + "}"; + } +} diff --git a/src/main/java/org/datasurvey/service/criteria/UsuarioEncuestaCriteria.java b/src/main/java/org/datasurvey/service/criteria/UsuarioEncuestaCriteria.java new file mode 100644 index 0000000..e65ecaa --- /dev/null +++ b/src/main/java/org/datasurvey/service/criteria/UsuarioEncuestaCriteria.java @@ -0,0 +1,218 @@ +package org.datasurvey.service.criteria; + +import java.io.Serializable; +import java.util.Objects; +import org.datasurvey.domain.enumeration.EstadoColaborador; +import org.datasurvey.domain.enumeration.RolColaborador; +import tech.jhipster.service.Criteria; +import tech.jhipster.service.filter.BooleanFilter; +import tech.jhipster.service.filter.DoubleFilter; +import tech.jhipster.service.filter.Filter; +import tech.jhipster.service.filter.FloatFilter; +import tech.jhipster.service.filter.IntegerFilter; +import tech.jhipster.service.filter.LongFilter; +import tech.jhipster.service.filter.StringFilter; +import tech.jhipster.service.filter.ZonedDateTimeFilter; + +/** + * Criteria class for the {@link org.datasurvey.domain.UsuarioEncuesta} entity. This class is used + * in {@link org.datasurvey.web.rest.UsuarioEncuestaResource} to receive all the possible filtering options from + * the Http GET request parameters. + * For example the following could be a valid request: + * {@code /usuario-encuestas?id.greaterThan=5&attr1.contains=something&attr2.specified=false} + * As Spring is unable to properly convert the types, unless specific {@link Filter} class are used, we need to use + * fix type specific filters. + */ +public class UsuarioEncuestaCriteria implements Serializable, Criteria { + + /** + * Class for filtering RolColaborador + */ + public static class RolColaboradorFilter extends Filter { + + public RolColaboradorFilter() {} + + public RolColaboradorFilter(RolColaboradorFilter filter) { + super(filter); + } + + @Override + public RolColaboradorFilter copy() { + return new RolColaboradorFilter(this); + } + } + + /** + * Class for filtering EstadoColaborador + */ + public static class EstadoColaboradorFilter extends Filter { + + public EstadoColaboradorFilter() {} + + public EstadoColaboradorFilter(EstadoColaboradorFilter filter) { + super(filter); + } + + @Override + public EstadoColaboradorFilter copy() { + return new EstadoColaboradorFilter(this); + } + } + + private static final long serialVersionUID = 1L; + + private LongFilter id; + + private RolColaboradorFilter rol; + + private EstadoColaboradorFilter estado; + + private ZonedDateTimeFilter fechaAgregado; + + private LongFilter usuarioExtraId; + + private LongFilter encuestaId; + + public UsuarioEncuestaCriteria() {} + + public UsuarioEncuestaCriteria(UsuarioEncuestaCriteria other) { + this.id = other.id == null ? null : other.id.copy(); + this.rol = other.rol == null ? null : other.rol.copy(); + this.estado = other.estado == null ? null : other.estado.copy(); + this.fechaAgregado = other.fechaAgregado == null ? null : other.fechaAgregado.copy(); + this.usuarioExtraId = other.usuarioExtraId == null ? null : other.usuarioExtraId.copy(); + this.encuestaId = other.encuestaId == null ? null : other.encuestaId.copy(); + } + + @Override + public UsuarioEncuestaCriteria copy() { + return new UsuarioEncuestaCriteria(this); + } + + public LongFilter getId() { + return id; + } + + public LongFilter id() { + if (id == null) { + id = new LongFilter(); + } + return id; + } + + public void setId(LongFilter id) { + this.id = id; + } + + public RolColaboradorFilter getRol() { + return rol; + } + + public RolColaboradorFilter rol() { + if (rol == null) { + rol = new RolColaboradorFilter(); + } + return rol; + } + + public void setRol(RolColaboradorFilter rol) { + this.rol = rol; + } + + public EstadoColaboradorFilter getEstado() { + return estado; + } + + public EstadoColaboradorFilter estado() { + if (estado == null) { + estado = new EstadoColaboradorFilter(); + } + return estado; + } + + public void setEstado(EstadoColaboradorFilter estado) { + this.estado = estado; + } + + public ZonedDateTimeFilter getFechaAgregado() { + return fechaAgregado; + } + + public ZonedDateTimeFilter fechaAgregado() { + if (fechaAgregado == null) { + fechaAgregado = new ZonedDateTimeFilter(); + } + return fechaAgregado; + } + + public void setFechaAgregado(ZonedDateTimeFilter fechaAgregado) { + this.fechaAgregado = fechaAgregado; + } + + public LongFilter getUsuarioExtraId() { + return usuarioExtraId; + } + + public LongFilter usuarioExtraId() { + if (usuarioExtraId == null) { + usuarioExtraId = new LongFilter(); + } + return usuarioExtraId; + } + + public void setUsuarioExtraId(LongFilter usuarioExtraId) { + this.usuarioExtraId = usuarioExtraId; + } + + public LongFilter getEncuestaId() { + return encuestaId; + } + + public LongFilter encuestaId() { + if (encuestaId == null) { + encuestaId = new LongFilter(); + } + return encuestaId; + } + + public void setEncuestaId(LongFilter encuestaId) { + this.encuestaId = encuestaId; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + final UsuarioEncuestaCriteria that = (UsuarioEncuestaCriteria) o; + return ( + Objects.equals(id, that.id) && + Objects.equals(rol, that.rol) && + Objects.equals(estado, that.estado) && + Objects.equals(fechaAgregado, that.fechaAgregado) && + Objects.equals(usuarioExtraId, that.usuarioExtraId) && + Objects.equals(encuestaId, that.encuestaId) + ); + } + + @Override + public int hashCode() { + return Objects.hash(id, rol, estado, fechaAgregado, usuarioExtraId, encuestaId); + } + + // prettier-ignore + @Override + public String toString() { + return "UsuarioEncuestaCriteria{" + + (id != null ? "id=" + id + ", " : "") + + (rol != null ? "rol=" + rol + ", " : "") + + (estado != null ? "estado=" + estado + ", " : "") + + (fechaAgregado != null ? "fechaAgregado=" + fechaAgregado + ", " : "") + + (usuarioExtraId != null ? "usuarioExtraId=" + usuarioExtraId + ", " : "") + + (encuestaId != null ? "encuestaId=" + encuestaId + ", " : "") + + "}"; + } +} diff --git a/src/main/java/org/datasurvey/service/criteria/UsuarioExtraCriteria.java b/src/main/java/org/datasurvey/service/criteria/UsuarioExtraCriteria.java new file mode 100644 index 0000000..df71ca7 --- /dev/null +++ b/src/main/java/org/datasurvey/service/criteria/UsuarioExtraCriteria.java @@ -0,0 +1,260 @@ +package org.datasurvey.service.criteria; + +import java.io.Serializable; +import java.util.Objects; +import org.datasurvey.domain.enumeration.EstadoUsuario; +import tech.jhipster.service.Criteria; +import tech.jhipster.service.filter.BooleanFilter; +import tech.jhipster.service.filter.DoubleFilter; +import tech.jhipster.service.filter.Filter; +import tech.jhipster.service.filter.FloatFilter; +import tech.jhipster.service.filter.IntegerFilter; +import tech.jhipster.service.filter.LongFilter; +import tech.jhipster.service.filter.StringFilter; +import tech.jhipster.service.filter.ZonedDateTimeFilter; + +/** + * Criteria class for the {@link org.datasurvey.domain.UsuarioExtra} entity. This class is used + * in {@link org.datasurvey.web.rest.UsuarioExtraResource} to receive all the possible filtering options from + * the Http GET request parameters. + * For example the following could be a valid request: + * {@code /usuario-extras?id.greaterThan=5&attr1.contains=something&attr2.specified=false} + * As Spring is unable to properly convert the types, unless specific {@link Filter} class are used, we need to use + * fix type specific filters. + */ +public class UsuarioExtraCriteria implements Serializable, Criteria { + + /** + * Class for filtering EstadoUsuario + */ + public static class EstadoUsuarioFilter extends Filter { + + public EstadoUsuarioFilter() {} + + public EstadoUsuarioFilter(EstadoUsuarioFilter filter) { + super(filter); + } + + @Override + public EstadoUsuarioFilter copy() { + return new EstadoUsuarioFilter(this); + } + } + + private static final long serialVersionUID = 1L; + + private LongFilter id; + + private StringFilter nombre; + + private StringFilter iconoPerfil; + + private ZonedDateTimeFilter fechaNacimiento; + + private EstadoUsuarioFilter estado; + + private LongFilter userId; + + private LongFilter encuestaId; + + private LongFilter usuarioEncuestaId; + + private LongFilter plantillaId; + + public UsuarioExtraCriteria() {} + + public UsuarioExtraCriteria(UsuarioExtraCriteria other) { + this.id = other.id == null ? null : other.id.copy(); + this.nombre = other.nombre == null ? null : other.nombre.copy(); + this.iconoPerfil = other.iconoPerfil == null ? null : other.iconoPerfil.copy(); + this.fechaNacimiento = other.fechaNacimiento == null ? null : other.fechaNacimiento.copy(); + this.estado = other.estado == null ? null : other.estado.copy(); + this.userId = other.userId == null ? null : other.userId.copy(); + this.encuestaId = other.encuestaId == null ? null : other.encuestaId.copy(); + this.usuarioEncuestaId = other.usuarioEncuestaId == null ? null : other.usuarioEncuestaId.copy(); + this.plantillaId = other.plantillaId == null ? null : other.plantillaId.copy(); + } + + @Override + public UsuarioExtraCriteria copy() { + return new UsuarioExtraCriteria(this); + } + + public LongFilter getId() { + return id; + } + + public LongFilter id() { + if (id == null) { + id = new LongFilter(); + } + return id; + } + + public void setId(LongFilter id) { + this.id = id; + } + + public StringFilter getNombre() { + return nombre; + } + + public StringFilter nombre() { + if (nombre == null) { + nombre = new StringFilter(); + } + return nombre; + } + + public void setNombre(StringFilter nombre) { + this.nombre = nombre; + } + + public StringFilter getIconoPerfil() { + return iconoPerfil; + } + + public StringFilter iconoPerfil() { + if (iconoPerfil == null) { + iconoPerfil = new StringFilter(); + } + return iconoPerfil; + } + + public void setIconoPerfil(StringFilter iconoPerfil) { + this.iconoPerfil = iconoPerfil; + } + + public ZonedDateTimeFilter getFechaNacimiento() { + return fechaNacimiento; + } + + public ZonedDateTimeFilter fechaNacimiento() { + if (fechaNacimiento == null) { + fechaNacimiento = new ZonedDateTimeFilter(); + } + return fechaNacimiento; + } + + public void setFechaNacimiento(ZonedDateTimeFilter fechaNacimiento) { + this.fechaNacimiento = fechaNacimiento; + } + + public EstadoUsuarioFilter getEstado() { + return estado; + } + + public EstadoUsuarioFilter estado() { + if (estado == null) { + estado = new EstadoUsuarioFilter(); + } + return estado; + } + + public void setEstado(EstadoUsuarioFilter estado) { + this.estado = estado; + } + + public LongFilter getUserId() { + return userId; + } + + public LongFilter userId() { + if (userId == null) { + userId = new LongFilter(); + } + return userId; + } + + public void setUserId(LongFilter userId) { + this.userId = userId; + } + + public LongFilter getEncuestaId() { + return encuestaId; + } + + public LongFilter encuestaId() { + if (encuestaId == null) { + encuestaId = new LongFilter(); + } + return encuestaId; + } + + public void setEncuestaId(LongFilter encuestaId) { + this.encuestaId = encuestaId; + } + + public LongFilter getUsuarioEncuestaId() { + return usuarioEncuestaId; + } + + public LongFilter usuarioEncuestaId() { + if (usuarioEncuestaId == null) { + usuarioEncuestaId = new LongFilter(); + } + return usuarioEncuestaId; + } + + public void setUsuarioEncuestaId(LongFilter usuarioEncuestaId) { + this.usuarioEncuestaId = usuarioEncuestaId; + } + + public LongFilter getPlantillaId() { + return plantillaId; + } + + public LongFilter plantillaId() { + if (plantillaId == null) { + plantillaId = new LongFilter(); + } + return plantillaId; + } + + public void setPlantillaId(LongFilter plantillaId) { + this.plantillaId = plantillaId; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + final UsuarioExtraCriteria that = (UsuarioExtraCriteria) o; + return ( + Objects.equals(id, that.id) && + Objects.equals(nombre, that.nombre) && + Objects.equals(iconoPerfil, that.iconoPerfil) && + Objects.equals(fechaNacimiento, that.fechaNacimiento) && + Objects.equals(estado, that.estado) && + Objects.equals(userId, that.userId) && + Objects.equals(encuestaId, that.encuestaId) && + Objects.equals(usuarioEncuestaId, that.usuarioEncuestaId) && + Objects.equals(plantillaId, that.plantillaId) + ); + } + + @Override + public int hashCode() { + return Objects.hash(id, nombre, iconoPerfil, fechaNacimiento, estado, userId, encuestaId, usuarioEncuestaId, plantillaId); + } + + // prettier-ignore + @Override + public String toString() { + return "UsuarioExtraCriteria{" + + (id != null ? "id=" + id + ", " : "") + + (nombre != null ? "nombre=" + nombre + ", " : "") + + (iconoPerfil != null ? "iconoPerfil=" + iconoPerfil + ", " : "") + + (fechaNacimiento != null ? "fechaNacimiento=" + fechaNacimiento + ", " : "") + + (estado != null ? "estado=" + estado + ", " : "") + + (userId != null ? "userId=" + userId + ", " : "") + + (encuestaId != null ? "encuestaId=" + encuestaId + ", " : "") + + (usuarioEncuestaId != null ? "usuarioEncuestaId=" + usuarioEncuestaId + ", " : "") + + (plantillaId != null ? "plantillaId=" + plantillaId + ", " : "") + + "}"; + } +} diff --git a/src/main/java/org/datasurvey/service/dto/AdminUserDTO.java b/src/main/java/org/datasurvey/service/dto/AdminUserDTO.java new file mode 100644 index 0000000..ade585b --- /dev/null +++ b/src/main/java/org/datasurvey/service/dto/AdminUserDTO.java @@ -0,0 +1,193 @@ +package org.datasurvey.service.dto; + +import java.time.Instant; +import java.util.Set; +import java.util.stream.Collectors; +import javax.validation.constraints.*; +import org.datasurvey.config.Constants; +import org.datasurvey.domain.Authority; +import org.datasurvey.domain.User; + +/** + * A DTO representing a user, with his authorities. + */ +public class AdminUserDTO { + + private Long id; + + @NotBlank + @Pattern(regexp = Constants.LOGIN_REGEX) + @Size(min = 1, max = 50) + private String login; + + @Size(max = 50) + private String firstName; + + @Size(max = 50) + private String lastName; + + @Email + @Size(min = 5, max = 254) + private String email; + + @Size(max = 256) + private String imageUrl; + + private boolean activated = false; + + @Size(min = 2, max = 10) + private String langKey; + + private String createdBy; + + private Instant createdDate; + + private String lastModifiedBy; + + private Instant lastModifiedDate; + + private Set authorities; + + public AdminUserDTO() { + // Empty constructor needed for Jackson. + } + + public AdminUserDTO(User user) { + this.id = user.getId(); + this.login = user.getLogin(); + this.firstName = user.getFirstName(); + this.lastName = user.getLastName(); + this.email = user.getEmail(); + this.activated = user.isActivated(); + this.imageUrl = user.getImageUrl(); + this.langKey = user.getLangKey(); + this.createdBy = user.getCreatedBy(); + this.createdDate = user.getCreatedDate(); + this.lastModifiedBy = user.getLastModifiedBy(); + this.lastModifiedDate = user.getLastModifiedDate(); + this.authorities = user.getAuthorities().stream().map(Authority::getName).collect(Collectors.toSet()); + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getLogin() { + return login; + } + + public void setLogin(String login) { + this.login = login; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getImageUrl() { + return imageUrl; + } + + public void setImageUrl(String imageUrl) { + this.imageUrl = imageUrl; + } + + public boolean isActivated() { + return activated; + } + + public void setActivated(boolean activated) { + this.activated = activated; + } + + public String getLangKey() { + return langKey; + } + + public void setLangKey(String langKey) { + this.langKey = langKey; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Instant getCreatedDate() { + return createdDate; + } + + public void setCreatedDate(Instant createdDate) { + this.createdDate = createdDate; + } + + public String getLastModifiedBy() { + return lastModifiedBy; + } + + public void setLastModifiedBy(String lastModifiedBy) { + this.lastModifiedBy = lastModifiedBy; + } + + public Instant getLastModifiedDate() { + return lastModifiedDate; + } + + public void setLastModifiedDate(Instant lastModifiedDate) { + this.lastModifiedDate = lastModifiedDate; + } + + public Set getAuthorities() { + return authorities; + } + + public void setAuthorities(Set authorities) { + this.authorities = authorities; + } + + // prettier-ignore + @Override + public String toString() { + return "AdminUserDTO{" + + "login='" + login + '\'' + + ", firstName='" + firstName + '\'' + + ", lastName='" + lastName + '\'' + + ", email='" + email + '\'' + + ", imageUrl='" + imageUrl + '\'' + + ", activated=" + activated + + ", langKey='" + langKey + '\'' + + ", createdBy=" + createdBy + + ", createdDate=" + createdDate + + ", lastModifiedBy='" + lastModifiedBy + '\'' + + ", lastModifiedDate=" + lastModifiedDate + + ", authorities=" + authorities + + "}"; + } +} diff --git a/src/main/java/org/datasurvey/service/dto/PasswordChangeDTO.java b/src/main/java/org/datasurvey/service/dto/PasswordChangeDTO.java new file mode 100644 index 0000000..0108714 --- /dev/null +++ b/src/main/java/org/datasurvey/service/dto/PasswordChangeDTO.java @@ -0,0 +1,35 @@ +package org.datasurvey.service.dto; + +/** + * A DTO representing a password change required data - current and new password. + */ +public class PasswordChangeDTO { + + private String currentPassword; + private String newPassword; + + public PasswordChangeDTO() { + // Empty constructor needed for Jackson. + } + + public PasswordChangeDTO(String currentPassword, String newPassword) { + this.currentPassword = currentPassword; + this.newPassword = newPassword; + } + + public String getCurrentPassword() { + return currentPassword; + } + + public void setCurrentPassword(String currentPassword) { + this.currentPassword = currentPassword; + } + + public String getNewPassword() { + return newPassword; + } + + public void setNewPassword(String newPassword) { + this.newPassword = newPassword; + } +} diff --git a/src/main/java/org/datasurvey/service/dto/UserDTO.java b/src/main/java/org/datasurvey/service/dto/UserDTO.java new file mode 100644 index 0000000..4521d9e --- /dev/null +++ b/src/main/java/org/datasurvey/service/dto/UserDTO.java @@ -0,0 +1,48 @@ +package org.datasurvey.service.dto; + +import org.datasurvey.domain.User; + +/** + * A DTO representing a user, with only the public attributes. + */ +public class UserDTO { + + private Long id; + + private String login; + + public UserDTO() { + // Empty constructor needed for Jackson. + } + + public UserDTO(User user) { + this.id = user.getId(); + // Customize it here if you need, or not, firstName/lastName/etc + this.login = user.getLogin(); + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getLogin() { + return login; + } + + public void setLogin(String login) { + this.login = login; + } + + // prettier-ignore + @Override + public String toString() { + return "UserDTO{" + + "id='" + id + '\'' + + ", login='" + login + '\'' + + "}"; + } +} diff --git a/src/main/java/org/datasurvey/service/dto/package-info.java b/src/main/java/org/datasurvey/service/dto/package-info.java new file mode 100644 index 0000000..19d4a0c --- /dev/null +++ b/src/main/java/org/datasurvey/service/dto/package-info.java @@ -0,0 +1,4 @@ +/** + * Data Transfer Objects. + */ +package org.datasurvey.service.dto; diff --git a/src/main/java/org/datasurvey/service/mapper/UserMapper.java b/src/main/java/org/datasurvey/service/mapper/UserMapper.java new file mode 100644 index 0000000..92e202d --- /dev/null +++ b/src/main/java/org/datasurvey/service/mapper/UserMapper.java @@ -0,0 +1,149 @@ +package org.datasurvey.service.mapper; + +import java.util.*; +import java.util.stream.Collectors; +import org.datasurvey.domain.Authority; +import org.datasurvey.domain.User; +import org.datasurvey.service.dto.AdminUserDTO; +import org.datasurvey.service.dto.UserDTO; +import org.mapstruct.BeanMapping; +import org.mapstruct.Mapping; +import org.mapstruct.Named; +import org.springframework.stereotype.Service; + +/** + * Mapper for the entity {@link User} and its DTO called {@link UserDTO}. + * + * Normal mappers are generated using MapStruct, this one is hand-coded as MapStruct + * support is still in beta, and requires a manual step with an IDE. + */ +@Service +public class UserMapper { + + public List usersToUserDTOs(List users) { + return users.stream().filter(Objects::nonNull).map(this::userToUserDTO).collect(Collectors.toList()); + } + + public UserDTO userToUserDTO(User user) { + return new UserDTO(user); + } + + public List usersToAdminUserDTOs(List users) { + return users.stream().filter(Objects::nonNull).map(this::userToAdminUserDTO).collect(Collectors.toList()); + } + + public AdminUserDTO userToAdminUserDTO(User user) { + return new AdminUserDTO(user); + } + + public List userDTOsToUsers(List userDTOs) { + return userDTOs.stream().filter(Objects::nonNull).map(this::userDTOToUser).collect(Collectors.toList()); + } + + public User userDTOToUser(AdminUserDTO userDTO) { + if (userDTO == null) { + return null; + } else { + User user = new User(); + user.setId(userDTO.getId()); + user.setLogin(userDTO.getLogin()); + user.setFirstName(userDTO.getFirstName()); + user.setLastName(userDTO.getLastName()); + user.setEmail(userDTO.getEmail()); + user.setImageUrl(userDTO.getImageUrl()); + user.setActivated(userDTO.isActivated()); + user.setLangKey(userDTO.getLangKey()); + Set authorities = this.authoritiesFromStrings(userDTO.getAuthorities()); + user.setAuthorities(authorities); + return user; + } + } + + private Set authoritiesFromStrings(Set authoritiesAsString) { + Set authorities = new HashSet<>(); + + if (authoritiesAsString != null) { + authorities = + authoritiesAsString + .stream() + .map( + string -> { + Authority auth = new Authority(); + auth.setName(string); + return auth; + } + ) + .collect(Collectors.toSet()); + } + + return authorities; + } + + public User userFromId(Long id) { + if (id == null) { + return null; + } + User user = new User(); + user.setId(id); + return user; + } + + @Named("id") + @BeanMapping(ignoreByDefault = true) + @Mapping(target = "id", source = "id") + public UserDTO toDtoId(User user) { + if (user == null) { + return null; + } + UserDTO userDto = new UserDTO(); + userDto.setId(user.getId()); + return userDto; + } + + @Named("idSet") + @BeanMapping(ignoreByDefault = true) + @Mapping(target = "id", source = "id") + public Set toDtoIdSet(Set users) { + if (users == null) { + return Collections.emptySet(); + } + + Set userSet = new HashSet<>(); + for (User userEntity : users) { + userSet.add(this.toDtoId(userEntity)); + } + + return userSet; + } + + @Named("login") + @BeanMapping(ignoreByDefault = true) + @Mapping(target = "id", source = "id") + @Mapping(target = "login", source = "login") + public UserDTO toDtoLogin(User user) { + if (user == null) { + return null; + } + UserDTO userDto = new UserDTO(); + userDto.setId(user.getId()); + userDto.setLogin(user.getLogin()); + return userDto; + } + + @Named("loginSet") + @BeanMapping(ignoreByDefault = true) + @Mapping(target = "id", source = "id") + @Mapping(target = "login", source = "login") + public Set toDtoLoginSet(Set users) { + if (users == null) { + return Collections.emptySet(); + } + + Set userSet = new HashSet<>(); + for (User userEntity : users) { + userSet.add(this.toDtoLogin(userEntity)); + } + + return userSet; + } +} diff --git a/src/main/java/org/datasurvey/service/mapper/package-info.java b/src/main/java/org/datasurvey/service/mapper/package-info.java new file mode 100644 index 0000000..13e7fba --- /dev/null +++ b/src/main/java/org/datasurvey/service/mapper/package-info.java @@ -0,0 +1,4 @@ +/** + * MapStruct mappers for mapping domain objects and Data Transfer Objects. + */ +package org.datasurvey.service.mapper; diff --git a/src/main/java/org/datasurvey/service/package-info.java b/src/main/java/org/datasurvey/service/package-info.java new file mode 100644 index 0000000..ea9ab3b --- /dev/null +++ b/src/main/java/org/datasurvey/service/package-info.java @@ -0,0 +1,4 @@ +/** + * Service layer beans. + */ +package org.datasurvey.service; diff --git a/src/main/java/org/datasurvey/web/rest/AccountResource.java b/src/main/java/org/datasurvey/web/rest/AccountResource.java new file mode 100644 index 0000000..b762746 --- /dev/null +++ b/src/main/java/org/datasurvey/web/rest/AccountResource.java @@ -0,0 +1,195 @@ +package org.datasurvey.web.rest; + +import java.util.*; +import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; +import org.apache.commons.lang3.StringUtils; +import org.datasurvey.domain.User; +import org.datasurvey.repository.UserRepository; +import org.datasurvey.security.SecurityUtils; +import org.datasurvey.service.MailService; +import org.datasurvey.service.UserService; +import org.datasurvey.service.dto.AdminUserDTO; +import org.datasurvey.service.dto.PasswordChangeDTO; +import org.datasurvey.service.dto.UserDTO; +import org.datasurvey.web.rest.errors.*; +import org.datasurvey.web.rest.vm.KeyAndPasswordVM; +import org.datasurvey.web.rest.vm.ManagedUserVM; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.*; + +/** + * REST controller for managing the current user's account. + */ +@RestController +@RequestMapping("/api") +public class AccountResource { + + private static class AccountResourceException extends RuntimeException { + + private AccountResourceException(String message) { + super(message); + } + } + + private final Logger log = LoggerFactory.getLogger(AccountResource.class); + + private final UserRepository userRepository; + + private final UserService userService; + + private final MailService mailService; + + public AccountResource(UserRepository userRepository, UserService userService, MailService mailService) { + this.userRepository = userRepository; + this.userService = userService; + this.mailService = mailService; + } + + /** + * {@code POST /register} : register the user. + * + * @param managedUserVM the managed user View Model. + * @throws InvalidPasswordException {@code 400 (Bad Request)} if the password is incorrect. + * @throws EmailAlreadyUsedException {@code 400 (Bad Request)} if the email is already used. + * @throws LoginAlreadyUsedException {@code 400 (Bad Request)} if the login is already used. + */ + @PostMapping("/register") + @ResponseStatus(HttpStatus.CREATED) + public void registerAccount(@Valid @RequestBody ManagedUserVM managedUserVM) { + if (isPasswordLengthInvalid(managedUserVM.getPassword())) { + throw new InvalidPasswordException(); + } + User user = userService.registerUser(managedUserVM, managedUserVM.getPassword()); + mailService.sendActivationEmail(user); + } + + /** + * {@code GET /activate} : activate the registered user. + * + * @param key the activation key. + * @throws RuntimeException {@code 500 (Internal Server Error)} if the user couldn't be activated. + */ + @GetMapping("/activate") + public void activateAccount(@RequestParam(value = "key") String key) { + Optional user = userService.activateRegistration(key); + if (!user.isPresent()) { + throw new AccountResourceException("No user was found for this activation key"); + } + } + + /** + * {@code GET /authenticate} : check if the user is authenticated, and return its login. + * + * @param request the HTTP request. + * @return the login if the user is authenticated. + */ + @GetMapping("/authenticate") + public String isAuthenticated(HttpServletRequest request) { + log.debug("REST request to check if the current user is authenticated"); + return request.getRemoteUser(); + } + + /** + * {@code GET /account} : get the current user. + * + * @return the current user. + * @throws RuntimeException {@code 500 (Internal Server Error)} if the user couldn't be returned. + */ + @GetMapping("/account") + public AdminUserDTO getAccount() { + return userService + .getUserWithAuthorities() + .map(AdminUserDTO::new) + .orElseThrow(() -> new AccountResourceException("User could not be found")); + } + + /** + * {@code POST /account} : update the current user information. + * + * @param userDTO the current user information. + * @throws EmailAlreadyUsedException {@code 400 (Bad Request)} if the email is already used. + * @throws RuntimeException {@code 500 (Internal Server Error)} if the user login wasn't found. + */ + @PostMapping("/account") + public void saveAccount(@Valid @RequestBody AdminUserDTO userDTO) { + String userLogin = SecurityUtils + .getCurrentUserLogin() + .orElseThrow(() -> new AccountResourceException("Current user login not found")); + Optional existingUser = userRepository.findOneByEmailIgnoreCase(userDTO.getEmail()); + if (existingUser.isPresent() && (!existingUser.get().getLogin().equalsIgnoreCase(userLogin))) { + throw new EmailAlreadyUsedException(); + } + Optional user = userRepository.findOneByLogin(userLogin); + if (!user.isPresent()) { + throw new AccountResourceException("User could not be found"); + } + userService.updateUser( + userDTO.getFirstName(), + userDTO.getLastName(), + userDTO.getEmail(), + userDTO.getLangKey(), + userDTO.getImageUrl() + ); + } + + /** + * {@code POST /account/change-password} : changes the current user's password. + * + * @param passwordChangeDto current and new password. + * @throws InvalidPasswordException {@code 400 (Bad Request)} if the new password is incorrect. + */ + @PostMapping(path = "/account/change-password") + public void changePassword(@RequestBody PasswordChangeDTO passwordChangeDto) { + if (isPasswordLengthInvalid(passwordChangeDto.getNewPassword())) { + throw new InvalidPasswordException(); + } + userService.changePassword(passwordChangeDto.getCurrentPassword(), passwordChangeDto.getNewPassword()); + } + + /** + * {@code POST /account/reset-password/init} : Send an email to reset the password of the user. + * + * @param mail the mail of the user. + */ + @PostMapping(path = "/account/reset-password/init") + public void requestPasswordReset(@RequestBody String mail) { + Optional user = userService.requestPasswordReset(mail); + if (user.isPresent()) { + mailService.sendPasswordResetMail(user.get()); + } else { + // Pretend the request has been successful to prevent checking which emails really exist + // but log that an invalid attempt has been made + log.warn("Password reset requested for non existing mail"); + } + } + + /** + * {@code POST /account/reset-password/finish} : Finish to reset the password of the user. + * + * @param keyAndPassword the generated key and the new password. + * @throws InvalidPasswordException {@code 400 (Bad Request)} if the password is incorrect. + * @throws RuntimeException {@code 500 (Internal Server Error)} if the password could not be reset. + */ + @PostMapping(path = "/account/reset-password/finish") + public void finishPasswordReset(@RequestBody KeyAndPasswordVM keyAndPassword) { + if (isPasswordLengthInvalid(keyAndPassword.getNewPassword())) { + throw new InvalidPasswordException(); + } + Optional user = userService.completePasswordReset(keyAndPassword.getNewPassword(), keyAndPassword.getKey()); + + if (!user.isPresent()) { + throw new AccountResourceException("No user was found for this reset key"); + } + } + + private static boolean isPasswordLengthInvalid(String password) { + return ( + StringUtils.isEmpty(password) || + password.length() < ManagedUserVM.PASSWORD_MIN_LENGTH || + password.length() > ManagedUserVM.PASSWORD_MAX_LENGTH + ); + } +} diff --git a/src/main/java/org/datasurvey/web/rest/CategoriaResource.java b/src/main/java/org/datasurvey/web/rest/CategoriaResource.java new file mode 100644 index 0000000..943708d --- /dev/null +++ b/src/main/java/org/datasurvey/web/rest/CategoriaResource.java @@ -0,0 +1,197 @@ +package org.datasurvey.web.rest; + +import java.net.URI; +import java.net.URISyntaxException; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import javax.validation.Valid; +import javax.validation.constraints.NotNull; +import org.datasurvey.domain.Categoria; +import org.datasurvey.repository.CategoriaRepository; +import org.datasurvey.service.CategoriaQueryService; +import org.datasurvey.service.CategoriaService; +import org.datasurvey.service.criteria.CategoriaCriteria; +import org.datasurvey.web.rest.errors.BadRequestAlertException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import tech.jhipster.web.util.HeaderUtil; +import tech.jhipster.web.util.ResponseUtil; + +/** + * REST controller for managing {@link org.datasurvey.domain.Categoria}. + */ +@RestController +@RequestMapping("/api") +public class CategoriaResource { + + private final Logger log = LoggerFactory.getLogger(CategoriaResource.class); + + private static final String ENTITY_NAME = "categoria"; + + @Value("${jhipster.clientApp.name}") + private String applicationName; + + private final CategoriaService categoriaService; + + private final CategoriaRepository categoriaRepository; + + private final CategoriaQueryService categoriaQueryService; + + public CategoriaResource( + CategoriaService categoriaService, + CategoriaRepository categoriaRepository, + CategoriaQueryService categoriaQueryService + ) { + this.categoriaService = categoriaService; + this.categoriaRepository = categoriaRepository; + this.categoriaQueryService = categoriaQueryService; + } + + /** + * {@code POST /categorias} : Create a new categoria. + * + * @param categoria the categoria to create. + * @return the {@link ResponseEntity} with status {@code 201 (Created)} and with body the new categoria, or with status {@code 400 (Bad Request)} if the categoria has already an ID. + * @throws URISyntaxException if the Location URI syntax is incorrect. + */ + @PostMapping("/categorias") + public ResponseEntity createCategoria(@Valid @RequestBody Categoria categoria) throws URISyntaxException { + log.debug("REST request to save Categoria : {}", categoria); + if (categoria.getId() != null) { + throw new BadRequestAlertException("A new categoria cannot already have an ID", ENTITY_NAME, "idexists"); + } + Categoria result = categoriaService.save(categoria); + return ResponseEntity + .created(new URI("/api/categorias/" + result.getId())) + .headers(HeaderUtil.createEntityCreationAlert(applicationName, true, ENTITY_NAME, result.getId().toString())) + .body(result); + } + + /** + * {@code PUT /categorias/:id} : Updates an existing categoria. + * + * @param id the id of the categoria to save. + * @param categoria the categoria to update. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the updated categoria, + * or with status {@code 400 (Bad Request)} if the categoria is not valid, + * or with status {@code 500 (Internal Server Error)} if the categoria couldn't be updated. + * @throws URISyntaxException if the Location URI syntax is incorrect. + */ + @PutMapping("/categorias/{id}") + public ResponseEntity updateCategoria( + @PathVariable(value = "id", required = false) final Long id, + @Valid @RequestBody Categoria categoria + ) throws URISyntaxException { + log.debug("REST request to update Categoria : {}, {}", id, categoria); + if (categoria.getId() == null) { + throw new BadRequestAlertException("Invalid id", ENTITY_NAME, "idnull"); + } + if (!Objects.equals(id, categoria.getId())) { + throw new BadRequestAlertException("Invalid ID", ENTITY_NAME, "idinvalid"); + } + + if (!categoriaRepository.existsById(id)) { + throw new BadRequestAlertException("Entity not found", ENTITY_NAME, "idnotfound"); + } + + Categoria result = categoriaService.save(categoria); + return ResponseEntity + .ok() + .headers(HeaderUtil.createEntityUpdateAlert(applicationName, true, ENTITY_NAME, categoria.getId().toString())) + .body(result); + } + + /** + * {@code PATCH /categorias/:id} : Partial updates given fields of an existing categoria, field will ignore if it is null + * + * @param id the id of the categoria to save. + * @param categoria the categoria to update. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the updated categoria, + * or with status {@code 400 (Bad Request)} if the categoria is not valid, + * or with status {@code 404 (Not Found)} if the categoria is not found, + * or with status {@code 500 (Internal Server Error)} if the categoria couldn't be updated. + * @throws URISyntaxException if the Location URI syntax is incorrect. + */ + @PatchMapping(value = "/categorias/{id}", consumes = "application/merge-patch+json") + public ResponseEntity partialUpdateCategoria( + @PathVariable(value = "id", required = false) final Long id, + @NotNull @RequestBody Categoria categoria + ) throws URISyntaxException { + log.debug("REST request to partial update Categoria partially : {}, {}", id, categoria); + if (categoria.getId() == null) { + throw new BadRequestAlertException("Invalid id", ENTITY_NAME, "idnull"); + } + if (!Objects.equals(id, categoria.getId())) { + throw new BadRequestAlertException("Invalid ID", ENTITY_NAME, "idinvalid"); + } + + if (!categoriaRepository.existsById(id)) { + throw new BadRequestAlertException("Entity not found", ENTITY_NAME, "idnotfound"); + } + + Optional result = categoriaService.partialUpdate(categoria); + + return ResponseUtil.wrapOrNotFound( + result, + HeaderUtil.createEntityUpdateAlert(applicationName, true, ENTITY_NAME, categoria.getId().toString()) + ); + } + + /** + * {@code GET /categorias} : get all the categorias. + * + * @param criteria the criteria which the requested entities should match. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and the list of categorias in body. + */ + @GetMapping("/categorias") + public ResponseEntity> getAllCategorias(CategoriaCriteria criteria) { + log.debug("REST request to get Categorias by criteria: {}", criteria); + List entityList = categoriaQueryService.findByCriteria(criteria); + return ResponseEntity.ok().body(entityList); + } + + /** + * {@code GET /categorias/count} : count all the categorias. + * + * @param criteria the criteria which the requested entities should match. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and the count in body. + */ + @GetMapping("/categorias/count") + public ResponseEntity countCategorias(CategoriaCriteria criteria) { + log.debug("REST request to count Categorias by criteria: {}", criteria); + return ResponseEntity.ok().body(categoriaQueryService.countByCriteria(criteria)); + } + + /** + * {@code GET /categorias/:id} : get the "id" categoria. + * + * @param id the id of the categoria to retrieve. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the categoria, or with status {@code 404 (Not Found)}. + */ + @GetMapping("/categorias/{id}") + public ResponseEntity getCategoria(@PathVariable Long id) { + log.debug("REST request to get Categoria : {}", id); + Optional categoria = categoriaService.findOne(id); + return ResponseUtil.wrapOrNotFound(categoria); + } + + /** + * {@code DELETE /categorias/:id} : delete the "id" categoria. + * + * @param id the id of the categoria to delete. + * @return the {@link ResponseEntity} with status {@code 204 (NO_CONTENT)}. + */ + @DeleteMapping("/categorias/{id}") + public ResponseEntity deleteCategoria(@PathVariable Long id) { + log.debug("REST request to delete Categoria : {}", id); + categoriaService.delete(id); + return ResponseEntity + .noContent() + .headers(HeaderUtil.createEntityDeletionAlert(applicationName, true, ENTITY_NAME, id.toString())) + .build(); + } +} diff --git a/src/main/java/org/datasurvey/web/rest/ClientForwardController.java b/src/main/java/org/datasurvey/web/rest/ClientForwardController.java new file mode 100644 index 0000000..a71be26 --- /dev/null +++ b/src/main/java/org/datasurvey/web/rest/ClientForwardController.java @@ -0,0 +1,17 @@ +package org.datasurvey.web.rest; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; + +@Controller +public class ClientForwardController { + + /** + * Forwards any unmapped paths (except those containing a period) to the client {@code index.html}. + * @return forward to client {@code index.html}. + */ + @GetMapping(value = { "/{path:[^\\.]*}", "/{path:^(?!websocket).*}/**/{path:[^\\.]*}" }) + public String forward() { + return "forward:/"; + } +} diff --git a/src/main/java/org/datasurvey/web/rest/EPreguntaAbiertaResource.java b/src/main/java/org/datasurvey/web/rest/EPreguntaAbiertaResource.java new file mode 100644 index 0000000..a092d4c --- /dev/null +++ b/src/main/java/org/datasurvey/web/rest/EPreguntaAbiertaResource.java @@ -0,0 +1,198 @@ +package org.datasurvey.web.rest; + +import java.net.URI; +import java.net.URISyntaxException; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import javax.validation.Valid; +import javax.validation.constraints.NotNull; +import org.datasurvey.domain.EPreguntaAbierta; +import org.datasurvey.repository.EPreguntaAbiertaRepository; +import org.datasurvey.service.EPreguntaAbiertaQueryService; +import org.datasurvey.service.EPreguntaAbiertaService; +import org.datasurvey.service.criteria.EPreguntaAbiertaCriteria; +import org.datasurvey.web.rest.errors.BadRequestAlertException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import tech.jhipster.web.util.HeaderUtil; +import tech.jhipster.web.util.ResponseUtil; + +/** + * REST controller for managing {@link org.datasurvey.domain.EPreguntaAbierta}. + */ +@RestController +@RequestMapping("/api") +public class EPreguntaAbiertaResource { + + private final Logger log = LoggerFactory.getLogger(EPreguntaAbiertaResource.class); + + private static final String ENTITY_NAME = "ePreguntaAbierta"; + + @Value("${jhipster.clientApp.name}") + private String applicationName; + + private final EPreguntaAbiertaService ePreguntaAbiertaService; + + private final EPreguntaAbiertaRepository ePreguntaAbiertaRepository; + + private final EPreguntaAbiertaQueryService ePreguntaAbiertaQueryService; + + public EPreguntaAbiertaResource( + EPreguntaAbiertaService ePreguntaAbiertaService, + EPreguntaAbiertaRepository ePreguntaAbiertaRepository, + EPreguntaAbiertaQueryService ePreguntaAbiertaQueryService + ) { + this.ePreguntaAbiertaService = ePreguntaAbiertaService; + this.ePreguntaAbiertaRepository = ePreguntaAbiertaRepository; + this.ePreguntaAbiertaQueryService = ePreguntaAbiertaQueryService; + } + + /** + * {@code POST /e-pregunta-abiertas} : Create a new ePreguntaAbierta. + * + * @param ePreguntaAbierta the ePreguntaAbierta to create. + * @return the {@link ResponseEntity} with status {@code 201 (Created)} and with body the new ePreguntaAbierta, or with status {@code 400 (Bad Request)} if the ePreguntaAbierta has already an ID. + * @throws URISyntaxException if the Location URI syntax is incorrect. + */ + @PostMapping("/e-pregunta-abiertas") + public ResponseEntity createEPreguntaAbierta(@Valid @RequestBody EPreguntaAbierta ePreguntaAbierta) + throws URISyntaxException { + log.debug("REST request to save EPreguntaAbierta : {}", ePreguntaAbierta); + if (ePreguntaAbierta.getId() != null) { + throw new BadRequestAlertException("A new ePreguntaAbierta cannot already have an ID", ENTITY_NAME, "idexists"); + } + EPreguntaAbierta result = ePreguntaAbiertaService.save(ePreguntaAbierta); + return ResponseEntity + .created(new URI("/api/e-pregunta-abiertas/" + result.getId())) + .headers(HeaderUtil.createEntityCreationAlert(applicationName, true, ENTITY_NAME, result.getId().toString())) + .body(result); + } + + /** + * {@code PUT /e-pregunta-abiertas/:id} : Updates an existing ePreguntaAbierta. + * + * @param id the id of the ePreguntaAbierta to save. + * @param ePreguntaAbierta the ePreguntaAbierta to update. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the updated ePreguntaAbierta, + * or with status {@code 400 (Bad Request)} if the ePreguntaAbierta is not valid, + * or with status {@code 500 (Internal Server Error)} if the ePreguntaAbierta couldn't be updated. + * @throws URISyntaxException if the Location URI syntax is incorrect. + */ + @PutMapping("/e-pregunta-abiertas/{id}") + public ResponseEntity updateEPreguntaAbierta( + @PathVariable(value = "id", required = false) final Long id, + @Valid @RequestBody EPreguntaAbierta ePreguntaAbierta + ) throws URISyntaxException { + log.debug("REST request to update EPreguntaAbierta : {}, {}", id, ePreguntaAbierta); + if (ePreguntaAbierta.getId() == null) { + throw new BadRequestAlertException("Invalid id", ENTITY_NAME, "idnull"); + } + if (!Objects.equals(id, ePreguntaAbierta.getId())) { + throw new BadRequestAlertException("Invalid ID", ENTITY_NAME, "idinvalid"); + } + + if (!ePreguntaAbiertaRepository.existsById(id)) { + throw new BadRequestAlertException("Entity not found", ENTITY_NAME, "idnotfound"); + } + + EPreguntaAbierta result = ePreguntaAbiertaService.save(ePreguntaAbierta); + return ResponseEntity + .ok() + .headers(HeaderUtil.createEntityUpdateAlert(applicationName, true, ENTITY_NAME, ePreguntaAbierta.getId().toString())) + .body(result); + } + + /** + * {@code PATCH /e-pregunta-abiertas/:id} : Partial updates given fields of an existing ePreguntaAbierta, field will ignore if it is null + * + * @param id the id of the ePreguntaAbierta to save. + * @param ePreguntaAbierta the ePreguntaAbierta to update. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the updated ePreguntaAbierta, + * or with status {@code 400 (Bad Request)} if the ePreguntaAbierta is not valid, + * or with status {@code 404 (Not Found)} if the ePreguntaAbierta is not found, + * or with status {@code 500 (Internal Server Error)} if the ePreguntaAbierta couldn't be updated. + * @throws URISyntaxException if the Location URI syntax is incorrect. + */ + @PatchMapping(value = "/e-pregunta-abiertas/{id}", consumes = "application/merge-patch+json") + public ResponseEntity partialUpdateEPreguntaAbierta( + @PathVariable(value = "id", required = false) final Long id, + @NotNull @RequestBody EPreguntaAbierta ePreguntaAbierta + ) throws URISyntaxException { + log.debug("REST request to partial update EPreguntaAbierta partially : {}, {}", id, ePreguntaAbierta); + if (ePreguntaAbierta.getId() == null) { + throw new BadRequestAlertException("Invalid id", ENTITY_NAME, "idnull"); + } + if (!Objects.equals(id, ePreguntaAbierta.getId())) { + throw new BadRequestAlertException("Invalid ID", ENTITY_NAME, "idinvalid"); + } + + if (!ePreguntaAbiertaRepository.existsById(id)) { + throw new BadRequestAlertException("Entity not found", ENTITY_NAME, "idnotfound"); + } + + Optional result = ePreguntaAbiertaService.partialUpdate(ePreguntaAbierta); + + return ResponseUtil.wrapOrNotFound( + result, + HeaderUtil.createEntityUpdateAlert(applicationName, true, ENTITY_NAME, ePreguntaAbierta.getId().toString()) + ); + } + + /** + * {@code GET /e-pregunta-abiertas} : get all the ePreguntaAbiertas. + * + * @param criteria the criteria which the requested entities should match. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and the list of ePreguntaAbiertas in body. + */ + @GetMapping("/e-pregunta-abiertas") + public ResponseEntity> getAllEPreguntaAbiertas(EPreguntaAbiertaCriteria criteria) { + log.debug("REST request to get EPreguntaAbiertas by criteria: {}", criteria); + List entityList = ePreguntaAbiertaQueryService.findByCriteria(criteria); + return ResponseEntity.ok().body(entityList); + } + + /** + * {@code GET /e-pregunta-abiertas/count} : count all the ePreguntaAbiertas. + * + * @param criteria the criteria which the requested entities should match. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and the count in body. + */ + @GetMapping("/e-pregunta-abiertas/count") + public ResponseEntity countEPreguntaAbiertas(EPreguntaAbiertaCriteria criteria) { + log.debug("REST request to count EPreguntaAbiertas by criteria: {}", criteria); + return ResponseEntity.ok().body(ePreguntaAbiertaQueryService.countByCriteria(criteria)); + } + + /** + * {@code GET /e-pregunta-abiertas/:id} : get the "id" ePreguntaAbierta. + * + * @param id the id of the ePreguntaAbierta to retrieve. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the ePreguntaAbierta, or with status {@code 404 (Not Found)}. + */ + @GetMapping("/e-pregunta-abiertas/{id}") + public ResponseEntity getEPreguntaAbierta(@PathVariable Long id) { + log.debug("REST request to get EPreguntaAbierta : {}", id); + Optional ePreguntaAbierta = ePreguntaAbiertaService.findOne(id); + return ResponseUtil.wrapOrNotFound(ePreguntaAbierta); + } + + /** + * {@code DELETE /e-pregunta-abiertas/:id} : delete the "id" ePreguntaAbierta. + * + * @param id the id of the ePreguntaAbierta to delete. + * @return the {@link ResponseEntity} with status {@code 204 (NO_CONTENT)}. + */ + @DeleteMapping("/e-pregunta-abiertas/{id}") + public ResponseEntity deleteEPreguntaAbierta(@PathVariable Long id) { + log.debug("REST request to delete EPreguntaAbierta : {}", id); + ePreguntaAbiertaService.delete(id); + return ResponseEntity + .noContent() + .headers(HeaderUtil.createEntityDeletionAlert(applicationName, true, ENTITY_NAME, id.toString())) + .build(); + } +} diff --git a/src/main/java/org/datasurvey/web/rest/EPreguntaAbiertaRespuestaResource.java b/src/main/java/org/datasurvey/web/rest/EPreguntaAbiertaRespuestaResource.java new file mode 100644 index 0000000..7c14587 --- /dev/null +++ b/src/main/java/org/datasurvey/web/rest/EPreguntaAbiertaRespuestaResource.java @@ -0,0 +1,199 @@ +package org.datasurvey.web.rest; + +import java.net.URI; +import java.net.URISyntaxException; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import javax.validation.Valid; +import javax.validation.constraints.NotNull; +import org.datasurvey.domain.EPreguntaAbiertaRespuesta; +import org.datasurvey.repository.EPreguntaAbiertaRespuestaRepository; +import org.datasurvey.service.EPreguntaAbiertaRespuestaQueryService; +import org.datasurvey.service.EPreguntaAbiertaRespuestaService; +import org.datasurvey.service.criteria.EPreguntaAbiertaRespuestaCriteria; +import org.datasurvey.web.rest.errors.BadRequestAlertException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import tech.jhipster.web.util.HeaderUtil; +import tech.jhipster.web.util.ResponseUtil; + +/** + * REST controller for managing {@link org.datasurvey.domain.EPreguntaAbiertaRespuesta}. + */ +@RestController +@RequestMapping("/api") +public class EPreguntaAbiertaRespuestaResource { + + private final Logger log = LoggerFactory.getLogger(EPreguntaAbiertaRespuestaResource.class); + + private static final String ENTITY_NAME = "ePreguntaAbiertaRespuesta"; + + @Value("${jhipster.clientApp.name}") + private String applicationName; + + private final EPreguntaAbiertaRespuestaService ePreguntaAbiertaRespuestaService; + + private final EPreguntaAbiertaRespuestaRepository ePreguntaAbiertaRespuestaRepository; + + private final EPreguntaAbiertaRespuestaQueryService ePreguntaAbiertaRespuestaQueryService; + + public EPreguntaAbiertaRespuestaResource( + EPreguntaAbiertaRespuestaService ePreguntaAbiertaRespuestaService, + EPreguntaAbiertaRespuestaRepository ePreguntaAbiertaRespuestaRepository, + EPreguntaAbiertaRespuestaQueryService ePreguntaAbiertaRespuestaQueryService + ) { + this.ePreguntaAbiertaRespuestaService = ePreguntaAbiertaRespuestaService; + this.ePreguntaAbiertaRespuestaRepository = ePreguntaAbiertaRespuestaRepository; + this.ePreguntaAbiertaRespuestaQueryService = ePreguntaAbiertaRespuestaQueryService; + } + + /** + * {@code POST /e-pregunta-abierta-respuestas} : Create a new ePreguntaAbiertaRespuesta. + * + * @param ePreguntaAbiertaRespuesta the ePreguntaAbiertaRespuesta to create. + * @return the {@link ResponseEntity} with status {@code 201 (Created)} and with body the new ePreguntaAbiertaRespuesta, or with status {@code 400 (Bad Request)} if the ePreguntaAbiertaRespuesta has already an ID. + * @throws URISyntaxException if the Location URI syntax is incorrect. + */ + @PostMapping("/e-pregunta-abierta-respuestas") + public ResponseEntity createEPreguntaAbiertaRespuesta( + @Valid @RequestBody EPreguntaAbiertaRespuesta ePreguntaAbiertaRespuesta + ) throws URISyntaxException { + log.debug("REST request to save EPreguntaAbiertaRespuesta : {}", ePreguntaAbiertaRespuesta); + if (ePreguntaAbiertaRespuesta.getId() != null) { + throw new BadRequestAlertException("A new ePreguntaAbiertaRespuesta cannot already have an ID", ENTITY_NAME, "idexists"); + } + EPreguntaAbiertaRespuesta result = ePreguntaAbiertaRespuestaService.save(ePreguntaAbiertaRespuesta); + return ResponseEntity + .created(new URI("/api/e-pregunta-abierta-respuestas/" + result.getId())) + .headers(HeaderUtil.createEntityCreationAlert(applicationName, true, ENTITY_NAME, result.getId().toString())) + .body(result); + } + + /** + * {@code PUT /e-pregunta-abierta-respuestas/:id} : Updates an existing ePreguntaAbiertaRespuesta. + * + * @param id the id of the ePreguntaAbiertaRespuesta to save. + * @param ePreguntaAbiertaRespuesta the ePreguntaAbiertaRespuesta to update. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the updated ePreguntaAbiertaRespuesta, + * or with status {@code 400 (Bad Request)} if the ePreguntaAbiertaRespuesta is not valid, + * or with status {@code 500 (Internal Server Error)} if the ePreguntaAbiertaRespuesta couldn't be updated. + * @throws URISyntaxException if the Location URI syntax is incorrect. + */ + @PutMapping("/e-pregunta-abierta-respuestas/{id}") + public ResponseEntity updateEPreguntaAbiertaRespuesta( + @PathVariable(value = "id", required = false) final Long id, + @Valid @RequestBody EPreguntaAbiertaRespuesta ePreguntaAbiertaRespuesta + ) throws URISyntaxException { + log.debug("REST request to update EPreguntaAbiertaRespuesta : {}, {}", id, ePreguntaAbiertaRespuesta); + if (ePreguntaAbiertaRespuesta.getId() == null) { + throw new BadRequestAlertException("Invalid id", ENTITY_NAME, "idnull"); + } + if (!Objects.equals(id, ePreguntaAbiertaRespuesta.getId())) { + throw new BadRequestAlertException("Invalid ID", ENTITY_NAME, "idinvalid"); + } + + if (!ePreguntaAbiertaRespuestaRepository.existsById(id)) { + throw new BadRequestAlertException("Entity not found", ENTITY_NAME, "idnotfound"); + } + + EPreguntaAbiertaRespuesta result = ePreguntaAbiertaRespuestaService.save(ePreguntaAbiertaRespuesta); + return ResponseEntity + .ok() + .headers(HeaderUtil.createEntityUpdateAlert(applicationName, true, ENTITY_NAME, ePreguntaAbiertaRespuesta.getId().toString())) + .body(result); + } + + /** + * {@code PATCH /e-pregunta-abierta-respuestas/:id} : Partial updates given fields of an existing ePreguntaAbiertaRespuesta, field will ignore if it is null + * + * @param id the id of the ePreguntaAbiertaRespuesta to save. + * @param ePreguntaAbiertaRespuesta the ePreguntaAbiertaRespuesta to update. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the updated ePreguntaAbiertaRespuesta, + * or with status {@code 400 (Bad Request)} if the ePreguntaAbiertaRespuesta is not valid, + * or with status {@code 404 (Not Found)} if the ePreguntaAbiertaRespuesta is not found, + * or with status {@code 500 (Internal Server Error)} if the ePreguntaAbiertaRespuesta couldn't be updated. + * @throws URISyntaxException if the Location URI syntax is incorrect. + */ + @PatchMapping(value = "/e-pregunta-abierta-respuestas/{id}", consumes = "application/merge-patch+json") + public ResponseEntity partialUpdateEPreguntaAbiertaRespuesta( + @PathVariable(value = "id", required = false) final Long id, + @NotNull @RequestBody EPreguntaAbiertaRespuesta ePreguntaAbiertaRespuesta + ) throws URISyntaxException { + log.debug("REST request to partial update EPreguntaAbiertaRespuesta partially : {}, {}", id, ePreguntaAbiertaRespuesta); + if (ePreguntaAbiertaRespuesta.getId() == null) { + throw new BadRequestAlertException("Invalid id", ENTITY_NAME, "idnull"); + } + if (!Objects.equals(id, ePreguntaAbiertaRespuesta.getId())) { + throw new BadRequestAlertException("Invalid ID", ENTITY_NAME, "idinvalid"); + } + + if (!ePreguntaAbiertaRespuestaRepository.existsById(id)) { + throw new BadRequestAlertException("Entity not found", ENTITY_NAME, "idnotfound"); + } + + Optional result = ePreguntaAbiertaRespuestaService.partialUpdate(ePreguntaAbiertaRespuesta); + + return ResponseUtil.wrapOrNotFound( + result, + HeaderUtil.createEntityUpdateAlert(applicationName, true, ENTITY_NAME, ePreguntaAbiertaRespuesta.getId().toString()) + ); + } + + /** + * {@code GET /e-pregunta-abierta-respuestas} : get all the ePreguntaAbiertaRespuestas. + * + * @param criteria the criteria which the requested entities should match. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and the list of ePreguntaAbiertaRespuestas in body. + */ + @GetMapping("/e-pregunta-abierta-respuestas") + public ResponseEntity> getAllEPreguntaAbiertaRespuestas(EPreguntaAbiertaRespuestaCriteria criteria) { + log.debug("REST request to get EPreguntaAbiertaRespuestas by criteria: {}", criteria); + List entityList = ePreguntaAbiertaRespuestaQueryService.findByCriteria(criteria); + return ResponseEntity.ok().body(entityList); + } + + /** + * {@code GET /e-pregunta-abierta-respuestas/count} : count all the ePreguntaAbiertaRespuestas. + * + * @param criteria the criteria which the requested entities should match. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and the count in body. + */ + @GetMapping("/e-pregunta-abierta-respuestas/count") + public ResponseEntity countEPreguntaAbiertaRespuestas(EPreguntaAbiertaRespuestaCriteria criteria) { + log.debug("REST request to count EPreguntaAbiertaRespuestas by criteria: {}", criteria); + return ResponseEntity.ok().body(ePreguntaAbiertaRespuestaQueryService.countByCriteria(criteria)); + } + + /** + * {@code GET /e-pregunta-abierta-respuestas/:id} : get the "id" ePreguntaAbiertaRespuesta. + * + * @param id the id of the ePreguntaAbiertaRespuesta to retrieve. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the ePreguntaAbiertaRespuesta, or with status {@code 404 (Not Found)}. + */ + @GetMapping("/e-pregunta-abierta-respuestas/{id}") + public ResponseEntity getEPreguntaAbiertaRespuesta(@PathVariable Long id) { + log.debug("REST request to get EPreguntaAbiertaRespuesta : {}", id); + Optional ePreguntaAbiertaRespuesta = ePreguntaAbiertaRespuestaService.findOne(id); + return ResponseUtil.wrapOrNotFound(ePreguntaAbiertaRespuesta); + } + + /** + * {@code DELETE /e-pregunta-abierta-respuestas/:id} : delete the "id" ePreguntaAbiertaRespuesta. + * + * @param id the id of the ePreguntaAbiertaRespuesta to delete. + * @return the {@link ResponseEntity} with status {@code 204 (NO_CONTENT)}. + */ + @DeleteMapping("/e-pregunta-abierta-respuestas/{id}") + public ResponseEntity deleteEPreguntaAbiertaRespuesta(@PathVariable Long id) { + log.debug("REST request to delete EPreguntaAbiertaRespuesta : {}", id); + ePreguntaAbiertaRespuestaService.delete(id); + return ResponseEntity + .noContent() + .headers(HeaderUtil.createEntityDeletionAlert(applicationName, true, ENTITY_NAME, id.toString())) + .build(); + } +} diff --git a/src/main/java/org/datasurvey/web/rest/EPreguntaCerradaOpcionResource.java b/src/main/java/org/datasurvey/web/rest/EPreguntaCerradaOpcionResource.java new file mode 100644 index 0000000..61604a7 --- /dev/null +++ b/src/main/java/org/datasurvey/web/rest/EPreguntaCerradaOpcionResource.java @@ -0,0 +1,199 @@ +package org.datasurvey.web.rest; + +import java.net.URI; +import java.net.URISyntaxException; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import javax.validation.Valid; +import javax.validation.constraints.NotNull; +import org.datasurvey.domain.EPreguntaCerradaOpcion; +import org.datasurvey.repository.EPreguntaCerradaOpcionRepository; +import org.datasurvey.service.EPreguntaCerradaOpcionQueryService; +import org.datasurvey.service.EPreguntaCerradaOpcionService; +import org.datasurvey.service.criteria.EPreguntaCerradaOpcionCriteria; +import org.datasurvey.web.rest.errors.BadRequestAlertException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import tech.jhipster.web.util.HeaderUtil; +import tech.jhipster.web.util.ResponseUtil; + +/** + * REST controller for managing {@link org.datasurvey.domain.EPreguntaCerradaOpcion}. + */ +@RestController +@RequestMapping("/api") +public class EPreguntaCerradaOpcionResource { + + private final Logger log = LoggerFactory.getLogger(EPreguntaCerradaOpcionResource.class); + + private static final String ENTITY_NAME = "ePreguntaCerradaOpcion"; + + @Value("${jhipster.clientApp.name}") + private String applicationName; + + private final EPreguntaCerradaOpcionService ePreguntaCerradaOpcionService; + + private final EPreguntaCerradaOpcionRepository ePreguntaCerradaOpcionRepository; + + private final EPreguntaCerradaOpcionQueryService ePreguntaCerradaOpcionQueryService; + + public EPreguntaCerradaOpcionResource( + EPreguntaCerradaOpcionService ePreguntaCerradaOpcionService, + EPreguntaCerradaOpcionRepository ePreguntaCerradaOpcionRepository, + EPreguntaCerradaOpcionQueryService ePreguntaCerradaOpcionQueryService + ) { + this.ePreguntaCerradaOpcionService = ePreguntaCerradaOpcionService; + this.ePreguntaCerradaOpcionRepository = ePreguntaCerradaOpcionRepository; + this.ePreguntaCerradaOpcionQueryService = ePreguntaCerradaOpcionQueryService; + } + + /** + * {@code POST /e-pregunta-cerrada-opcions} : Create a new ePreguntaCerradaOpcion. + * + * @param ePreguntaCerradaOpcion the ePreguntaCerradaOpcion to create. + * @return the {@link ResponseEntity} with status {@code 201 (Created)} and with body the new ePreguntaCerradaOpcion, or with status {@code 400 (Bad Request)} if the ePreguntaCerradaOpcion has already an ID. + * @throws URISyntaxException if the Location URI syntax is incorrect. + */ + @PostMapping("/e-pregunta-cerrada-opcions") + public ResponseEntity createEPreguntaCerradaOpcion( + @Valid @RequestBody EPreguntaCerradaOpcion ePreguntaCerradaOpcion + ) throws URISyntaxException { + log.debug("REST request to save EPreguntaCerradaOpcion : {}", ePreguntaCerradaOpcion); + if (ePreguntaCerradaOpcion.getId() != null) { + throw new BadRequestAlertException("A new ePreguntaCerradaOpcion cannot already have an ID", ENTITY_NAME, "idexists"); + } + EPreguntaCerradaOpcion result = ePreguntaCerradaOpcionService.save(ePreguntaCerradaOpcion); + return ResponseEntity + .created(new URI("/api/e-pregunta-cerrada-opcions/" + result.getId())) + .headers(HeaderUtil.createEntityCreationAlert(applicationName, true, ENTITY_NAME, result.getId().toString())) + .body(result); + } + + /** + * {@code PUT /e-pregunta-cerrada-opcions/:id} : Updates an existing ePreguntaCerradaOpcion. + * + * @param id the id of the ePreguntaCerradaOpcion to save. + * @param ePreguntaCerradaOpcion the ePreguntaCerradaOpcion to update. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the updated ePreguntaCerradaOpcion, + * or with status {@code 400 (Bad Request)} if the ePreguntaCerradaOpcion is not valid, + * or with status {@code 500 (Internal Server Error)} if the ePreguntaCerradaOpcion couldn't be updated. + * @throws URISyntaxException if the Location URI syntax is incorrect. + */ + @PutMapping("/e-pregunta-cerrada-opcions/{id}") + public ResponseEntity updateEPreguntaCerradaOpcion( + @PathVariable(value = "id", required = false) final Long id, + @Valid @RequestBody EPreguntaCerradaOpcion ePreguntaCerradaOpcion + ) throws URISyntaxException { + log.debug("REST request to update EPreguntaCerradaOpcion : {}, {}", id, ePreguntaCerradaOpcion); + if (ePreguntaCerradaOpcion.getId() == null) { + throw new BadRequestAlertException("Invalid id", ENTITY_NAME, "idnull"); + } + if (!Objects.equals(id, ePreguntaCerradaOpcion.getId())) { + throw new BadRequestAlertException("Invalid ID", ENTITY_NAME, "idinvalid"); + } + + if (!ePreguntaCerradaOpcionRepository.existsById(id)) { + throw new BadRequestAlertException("Entity not found", ENTITY_NAME, "idnotfound"); + } + + EPreguntaCerradaOpcion result = ePreguntaCerradaOpcionService.save(ePreguntaCerradaOpcion); + return ResponseEntity + .ok() + .headers(HeaderUtil.createEntityUpdateAlert(applicationName, true, ENTITY_NAME, ePreguntaCerradaOpcion.getId().toString())) + .body(result); + } + + /** + * {@code PATCH /e-pregunta-cerrada-opcions/:id} : Partial updates given fields of an existing ePreguntaCerradaOpcion, field will ignore if it is null + * + * @param id the id of the ePreguntaCerradaOpcion to save. + * @param ePreguntaCerradaOpcion the ePreguntaCerradaOpcion to update. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the updated ePreguntaCerradaOpcion, + * or with status {@code 400 (Bad Request)} if the ePreguntaCerradaOpcion is not valid, + * or with status {@code 404 (Not Found)} if the ePreguntaCerradaOpcion is not found, + * or with status {@code 500 (Internal Server Error)} if the ePreguntaCerradaOpcion couldn't be updated. + * @throws URISyntaxException if the Location URI syntax is incorrect. + */ + @PatchMapping(value = "/e-pregunta-cerrada-opcions/{id}", consumes = "application/merge-patch+json") + public ResponseEntity partialUpdateEPreguntaCerradaOpcion( + @PathVariable(value = "id", required = false) final Long id, + @NotNull @RequestBody EPreguntaCerradaOpcion ePreguntaCerradaOpcion + ) throws URISyntaxException { + log.debug("REST request to partial update EPreguntaCerradaOpcion partially : {}, {}", id, ePreguntaCerradaOpcion); + if (ePreguntaCerradaOpcion.getId() == null) { + throw new BadRequestAlertException("Invalid id", ENTITY_NAME, "idnull"); + } + if (!Objects.equals(id, ePreguntaCerradaOpcion.getId())) { + throw new BadRequestAlertException("Invalid ID", ENTITY_NAME, "idinvalid"); + } + + if (!ePreguntaCerradaOpcionRepository.existsById(id)) { + throw new BadRequestAlertException("Entity not found", ENTITY_NAME, "idnotfound"); + } + + Optional result = ePreguntaCerradaOpcionService.partialUpdate(ePreguntaCerradaOpcion); + + return ResponseUtil.wrapOrNotFound( + result, + HeaderUtil.createEntityUpdateAlert(applicationName, true, ENTITY_NAME, ePreguntaCerradaOpcion.getId().toString()) + ); + } + + /** + * {@code GET /e-pregunta-cerrada-opcions} : get all the ePreguntaCerradaOpcions. + * + * @param criteria the criteria which the requested entities should match. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and the list of ePreguntaCerradaOpcions in body. + */ + @GetMapping("/e-pregunta-cerrada-opcions") + public ResponseEntity> getAllEPreguntaCerradaOpcions(EPreguntaCerradaOpcionCriteria criteria) { + log.debug("REST request to get EPreguntaCerradaOpcions by criteria: {}", criteria); + List entityList = ePreguntaCerradaOpcionQueryService.findByCriteria(criteria); + return ResponseEntity.ok().body(entityList); + } + + /** + * {@code GET /e-pregunta-cerrada-opcions/count} : count all the ePreguntaCerradaOpcions. + * + * @param criteria the criteria which the requested entities should match. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and the count in body. + */ + @GetMapping("/e-pregunta-cerrada-opcions/count") + public ResponseEntity countEPreguntaCerradaOpcions(EPreguntaCerradaOpcionCriteria criteria) { + log.debug("REST request to count EPreguntaCerradaOpcions by criteria: {}", criteria); + return ResponseEntity.ok().body(ePreguntaCerradaOpcionQueryService.countByCriteria(criteria)); + } + + /** + * {@code GET /e-pregunta-cerrada-opcions/:id} : get the "id" ePreguntaCerradaOpcion. + * + * @param id the id of the ePreguntaCerradaOpcion to retrieve. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the ePreguntaCerradaOpcion, or with status {@code 404 (Not Found)}. + */ + @GetMapping("/e-pregunta-cerrada-opcions/{id}") + public ResponseEntity getEPreguntaCerradaOpcion(@PathVariable Long id) { + log.debug("REST request to get EPreguntaCerradaOpcion : {}", id); + Optional ePreguntaCerradaOpcion = ePreguntaCerradaOpcionService.findOne(id); + return ResponseUtil.wrapOrNotFound(ePreguntaCerradaOpcion); + } + + /** + * {@code DELETE /e-pregunta-cerrada-opcions/:id} : delete the "id" ePreguntaCerradaOpcion. + * + * @param id the id of the ePreguntaCerradaOpcion to delete. + * @return the {@link ResponseEntity} with status {@code 204 (NO_CONTENT)}. + */ + @DeleteMapping("/e-pregunta-cerrada-opcions/{id}") + public ResponseEntity deleteEPreguntaCerradaOpcion(@PathVariable Long id) { + log.debug("REST request to delete EPreguntaCerradaOpcion : {}", id); + ePreguntaCerradaOpcionService.delete(id); + return ResponseEntity + .noContent() + .headers(HeaderUtil.createEntityDeletionAlert(applicationName, true, ENTITY_NAME, id.toString())) + .build(); + } +} diff --git a/src/main/java/org/datasurvey/web/rest/EPreguntaCerradaResource.java b/src/main/java/org/datasurvey/web/rest/EPreguntaCerradaResource.java new file mode 100644 index 0000000..8eb2498 --- /dev/null +++ b/src/main/java/org/datasurvey/web/rest/EPreguntaCerradaResource.java @@ -0,0 +1,198 @@ +package org.datasurvey.web.rest; + +import java.net.URI; +import java.net.URISyntaxException; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import javax.validation.Valid; +import javax.validation.constraints.NotNull; +import org.datasurvey.domain.EPreguntaCerrada; +import org.datasurvey.repository.EPreguntaCerradaRepository; +import org.datasurvey.service.EPreguntaCerradaQueryService; +import org.datasurvey.service.EPreguntaCerradaService; +import org.datasurvey.service.criteria.EPreguntaCerradaCriteria; +import org.datasurvey.web.rest.errors.BadRequestAlertException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import tech.jhipster.web.util.HeaderUtil; +import tech.jhipster.web.util.ResponseUtil; + +/** + * REST controller for managing {@link org.datasurvey.domain.EPreguntaCerrada}. + */ +@RestController +@RequestMapping("/api") +public class EPreguntaCerradaResource { + + private final Logger log = LoggerFactory.getLogger(EPreguntaCerradaResource.class); + + private static final String ENTITY_NAME = "ePreguntaCerrada"; + + @Value("${jhipster.clientApp.name}") + private String applicationName; + + private final EPreguntaCerradaService ePreguntaCerradaService; + + private final EPreguntaCerradaRepository ePreguntaCerradaRepository; + + private final EPreguntaCerradaQueryService ePreguntaCerradaQueryService; + + public EPreguntaCerradaResource( + EPreguntaCerradaService ePreguntaCerradaService, + EPreguntaCerradaRepository ePreguntaCerradaRepository, + EPreguntaCerradaQueryService ePreguntaCerradaQueryService + ) { + this.ePreguntaCerradaService = ePreguntaCerradaService; + this.ePreguntaCerradaRepository = ePreguntaCerradaRepository; + this.ePreguntaCerradaQueryService = ePreguntaCerradaQueryService; + } + + /** + * {@code POST /e-pregunta-cerradas} : Create a new ePreguntaCerrada. + * + * @param ePreguntaCerrada the ePreguntaCerrada to create. + * @return the {@link ResponseEntity} with status {@code 201 (Created)} and with body the new ePreguntaCerrada, or with status {@code 400 (Bad Request)} if the ePreguntaCerrada has already an ID. + * @throws URISyntaxException if the Location URI syntax is incorrect. + */ + @PostMapping("/e-pregunta-cerradas") + public ResponseEntity createEPreguntaCerrada(@Valid @RequestBody EPreguntaCerrada ePreguntaCerrada) + throws URISyntaxException { + log.debug("REST request to save EPreguntaCerrada : {}", ePreguntaCerrada); + if (ePreguntaCerrada.getId() != null) { + throw new BadRequestAlertException("A new ePreguntaCerrada cannot already have an ID", ENTITY_NAME, "idexists"); + } + EPreguntaCerrada result = ePreguntaCerradaService.save(ePreguntaCerrada); + return ResponseEntity + .created(new URI("/api/e-pregunta-cerradas/" + result.getId())) + .headers(HeaderUtil.createEntityCreationAlert(applicationName, true, ENTITY_NAME, result.getId().toString())) + .body(result); + } + + /** + * {@code PUT /e-pregunta-cerradas/:id} : Updates an existing ePreguntaCerrada. + * + * @param id the id of the ePreguntaCerrada to save. + * @param ePreguntaCerrada the ePreguntaCerrada to update. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the updated ePreguntaCerrada, + * or with status {@code 400 (Bad Request)} if the ePreguntaCerrada is not valid, + * or with status {@code 500 (Internal Server Error)} if the ePreguntaCerrada couldn't be updated. + * @throws URISyntaxException if the Location URI syntax is incorrect. + */ + @PutMapping("/e-pregunta-cerradas/{id}") + public ResponseEntity updateEPreguntaCerrada( + @PathVariable(value = "id", required = false) final Long id, + @Valid @RequestBody EPreguntaCerrada ePreguntaCerrada + ) throws URISyntaxException { + log.debug("REST request to update EPreguntaCerrada : {}, {}", id, ePreguntaCerrada); + if (ePreguntaCerrada.getId() == null) { + throw new BadRequestAlertException("Invalid id", ENTITY_NAME, "idnull"); + } + if (!Objects.equals(id, ePreguntaCerrada.getId())) { + throw new BadRequestAlertException("Invalid ID", ENTITY_NAME, "idinvalid"); + } + + if (!ePreguntaCerradaRepository.existsById(id)) { + throw new BadRequestAlertException("Entity not found", ENTITY_NAME, "idnotfound"); + } + + EPreguntaCerrada result = ePreguntaCerradaService.save(ePreguntaCerrada); + return ResponseEntity + .ok() + .headers(HeaderUtil.createEntityUpdateAlert(applicationName, true, ENTITY_NAME, ePreguntaCerrada.getId().toString())) + .body(result); + } + + /** + * {@code PATCH /e-pregunta-cerradas/:id} : Partial updates given fields of an existing ePreguntaCerrada, field will ignore if it is null + * + * @param id the id of the ePreguntaCerrada to save. + * @param ePreguntaCerrada the ePreguntaCerrada to update. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the updated ePreguntaCerrada, + * or with status {@code 400 (Bad Request)} if the ePreguntaCerrada is not valid, + * or with status {@code 404 (Not Found)} if the ePreguntaCerrada is not found, + * or with status {@code 500 (Internal Server Error)} if the ePreguntaCerrada couldn't be updated. + * @throws URISyntaxException if the Location URI syntax is incorrect. + */ + @PatchMapping(value = "/e-pregunta-cerradas/{id}", consumes = "application/merge-patch+json") + public ResponseEntity partialUpdateEPreguntaCerrada( + @PathVariable(value = "id", required = false) final Long id, + @NotNull @RequestBody EPreguntaCerrada ePreguntaCerrada + ) throws URISyntaxException { + log.debug("REST request to partial update EPreguntaCerrada partially : {}, {}", id, ePreguntaCerrada); + if (ePreguntaCerrada.getId() == null) { + throw new BadRequestAlertException("Invalid id", ENTITY_NAME, "idnull"); + } + if (!Objects.equals(id, ePreguntaCerrada.getId())) { + throw new BadRequestAlertException("Invalid ID", ENTITY_NAME, "idinvalid"); + } + + if (!ePreguntaCerradaRepository.existsById(id)) { + throw new BadRequestAlertException("Entity not found", ENTITY_NAME, "idnotfound"); + } + + Optional result = ePreguntaCerradaService.partialUpdate(ePreguntaCerrada); + + return ResponseUtil.wrapOrNotFound( + result, + HeaderUtil.createEntityUpdateAlert(applicationName, true, ENTITY_NAME, ePreguntaCerrada.getId().toString()) + ); + } + + /** + * {@code GET /e-pregunta-cerradas} : get all the ePreguntaCerradas. + * + * @param criteria the criteria which the requested entities should match. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and the list of ePreguntaCerradas in body. + */ + @GetMapping("/e-pregunta-cerradas") + public ResponseEntity> getAllEPreguntaCerradas(EPreguntaCerradaCriteria criteria) { + log.debug("REST request to get EPreguntaCerradas by criteria: {}", criteria); + List entityList = ePreguntaCerradaQueryService.findByCriteria(criteria); + return ResponseEntity.ok().body(entityList); + } + + /** + * {@code GET /e-pregunta-cerradas/count} : count all the ePreguntaCerradas. + * + * @param criteria the criteria which the requested entities should match. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and the count in body. + */ + @GetMapping("/e-pregunta-cerradas/count") + public ResponseEntity countEPreguntaCerradas(EPreguntaCerradaCriteria criteria) { + log.debug("REST request to count EPreguntaCerradas by criteria: {}", criteria); + return ResponseEntity.ok().body(ePreguntaCerradaQueryService.countByCriteria(criteria)); + } + + /** + * {@code GET /e-pregunta-cerradas/:id} : get the "id" ePreguntaCerrada. + * + * @param id the id of the ePreguntaCerrada to retrieve. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the ePreguntaCerrada, or with status {@code 404 (Not Found)}. + */ + @GetMapping("/e-pregunta-cerradas/{id}") + public ResponseEntity getEPreguntaCerrada(@PathVariable Long id) { + log.debug("REST request to get EPreguntaCerrada : {}", id); + Optional ePreguntaCerrada = ePreguntaCerradaService.findOne(id); + return ResponseUtil.wrapOrNotFound(ePreguntaCerrada); + } + + /** + * {@code DELETE /e-pregunta-cerradas/:id} : delete the "id" ePreguntaCerrada. + * + * @param id the id of the ePreguntaCerrada to delete. + * @return the {@link ResponseEntity} with status {@code 204 (NO_CONTENT)}. + */ + @DeleteMapping("/e-pregunta-cerradas/{id}") + public ResponseEntity deleteEPreguntaCerrada(@PathVariable Long id) { + log.debug("REST request to delete EPreguntaCerrada : {}", id); + ePreguntaCerradaService.delete(id); + return ResponseEntity + .noContent() + .headers(HeaderUtil.createEntityDeletionAlert(applicationName, true, ENTITY_NAME, id.toString())) + .build(); + } +} diff --git a/src/main/java/org/datasurvey/web/rest/EncuestaResource.java b/src/main/java/org/datasurvey/web/rest/EncuestaResource.java new file mode 100644 index 0000000..bcf74c8 --- /dev/null +++ b/src/main/java/org/datasurvey/web/rest/EncuestaResource.java @@ -0,0 +1,197 @@ +package org.datasurvey.web.rest; + +import java.net.URI; +import java.net.URISyntaxException; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import javax.validation.Valid; +import javax.validation.constraints.NotNull; +import org.datasurvey.domain.Encuesta; +import org.datasurvey.repository.EncuestaRepository; +import org.datasurvey.service.EncuestaQueryService; +import org.datasurvey.service.EncuestaService; +import org.datasurvey.service.criteria.EncuestaCriteria; +import org.datasurvey.web.rest.errors.BadRequestAlertException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import tech.jhipster.web.util.HeaderUtil; +import tech.jhipster.web.util.ResponseUtil; + +/** + * REST controller for managing {@link org.datasurvey.domain.Encuesta}. + */ +@RestController +@RequestMapping("/api") +public class EncuestaResource { + + private final Logger log = LoggerFactory.getLogger(EncuestaResource.class); + + private static final String ENTITY_NAME = "encuesta"; + + @Value("${jhipster.clientApp.name}") + private String applicationName; + + private final EncuestaService encuestaService; + + private final EncuestaRepository encuestaRepository; + + private final EncuestaQueryService encuestaQueryService; + + public EncuestaResource( + EncuestaService encuestaService, + EncuestaRepository encuestaRepository, + EncuestaQueryService encuestaQueryService + ) { + this.encuestaService = encuestaService; + this.encuestaRepository = encuestaRepository; + this.encuestaQueryService = encuestaQueryService; + } + + /** + * {@code POST /encuestas} : Create a new encuesta. + * + * @param encuesta the encuesta to create. + * @return the {@link ResponseEntity} with status {@code 201 (Created)} and with body the new encuesta, or with status {@code 400 (Bad Request)} if the encuesta has already an ID. + * @throws URISyntaxException if the Location URI syntax is incorrect. + */ + @PostMapping("/encuestas") + public ResponseEntity createEncuesta(@Valid @RequestBody Encuesta encuesta) throws URISyntaxException { + log.debug("REST request to save Encuesta : {}", encuesta); + if (encuesta.getId() != null) { + throw new BadRequestAlertException("A new encuesta cannot already have an ID", ENTITY_NAME, "idexists"); + } + Encuesta result = encuestaService.save(encuesta); + return ResponseEntity + .created(new URI("/api/encuestas/" + result.getId())) + .headers(HeaderUtil.createEntityCreationAlert(applicationName, true, ENTITY_NAME, result.getId().toString())) + .body(result); + } + + /** + * {@code PUT /encuestas/:id} : Updates an existing encuesta. + * + * @param id the id of the encuesta to save. + * @param encuesta the encuesta to update. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the updated encuesta, + * or with status {@code 400 (Bad Request)} if the encuesta is not valid, + * or with status {@code 500 (Internal Server Error)} if the encuesta couldn't be updated. + * @throws URISyntaxException if the Location URI syntax is incorrect. + */ + @PutMapping("/encuestas/{id}") + public ResponseEntity updateEncuesta( + @PathVariable(value = "id", required = false) final Long id, + @Valid @RequestBody Encuesta encuesta + ) throws URISyntaxException { + log.debug("REST request to update Encuesta : {}, {}", id, encuesta); + if (encuesta.getId() == null) { + throw new BadRequestAlertException("Invalid id", ENTITY_NAME, "idnull"); + } + if (!Objects.equals(id, encuesta.getId())) { + throw new BadRequestAlertException("Invalid ID", ENTITY_NAME, "idinvalid"); + } + + if (!encuestaRepository.existsById(id)) { + throw new BadRequestAlertException("Entity not found", ENTITY_NAME, "idnotfound"); + } + + Encuesta result = encuestaService.save(encuesta); + return ResponseEntity + .ok() + .headers(HeaderUtil.createEntityUpdateAlert(applicationName, true, ENTITY_NAME, encuesta.getId().toString())) + .body(result); + } + + /** + * {@code PATCH /encuestas/:id} : Partial updates given fields of an existing encuesta, field will ignore if it is null + * + * @param id the id of the encuesta to save. + * @param encuesta the encuesta to update. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the updated encuesta, + * or with status {@code 400 (Bad Request)} if the encuesta is not valid, + * or with status {@code 404 (Not Found)} if the encuesta is not found, + * or with status {@code 500 (Internal Server Error)} if the encuesta couldn't be updated. + * @throws URISyntaxException if the Location URI syntax is incorrect. + */ + @PatchMapping(value = "/encuestas/{id}", consumes = "application/merge-patch+json") + public ResponseEntity partialUpdateEncuesta( + @PathVariable(value = "id", required = false) final Long id, + @NotNull @RequestBody Encuesta encuesta + ) throws URISyntaxException { + log.debug("REST request to partial update Encuesta partially : {}, {}", id, encuesta); + if (encuesta.getId() == null) { + throw new BadRequestAlertException("Invalid id", ENTITY_NAME, "idnull"); + } + if (!Objects.equals(id, encuesta.getId())) { + throw new BadRequestAlertException("Invalid ID", ENTITY_NAME, "idinvalid"); + } + + if (!encuestaRepository.existsById(id)) { + throw new BadRequestAlertException("Entity not found", ENTITY_NAME, "idnotfound"); + } + + Optional result = encuestaService.partialUpdate(encuesta); + + return ResponseUtil.wrapOrNotFound( + result, + HeaderUtil.createEntityUpdateAlert(applicationName, true, ENTITY_NAME, encuesta.getId().toString()) + ); + } + + /** + * {@code GET /encuestas} : get all the encuestas. + * + * @param criteria the criteria which the requested entities should match. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and the list of encuestas in body. + */ + @GetMapping("/encuestas") + public ResponseEntity> getAllEncuestas(EncuestaCriteria criteria) { + log.debug("REST request to get Encuestas by criteria: {}", criteria); + List entityList = encuestaQueryService.findByCriteria(criteria); + return ResponseEntity.ok().body(entityList); + } + + /** + * {@code GET /encuestas/count} : count all the encuestas. + * + * @param criteria the criteria which the requested entities should match. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and the count in body. + */ + @GetMapping("/encuestas/count") + public ResponseEntity countEncuestas(EncuestaCriteria criteria) { + log.debug("REST request to count Encuestas by criteria: {}", criteria); + return ResponseEntity.ok().body(encuestaQueryService.countByCriteria(criteria)); + } + + /** + * {@code GET /encuestas/:id} : get the "id" encuesta. + * + * @param id the id of the encuesta to retrieve. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the encuesta, or with status {@code 404 (Not Found)}. + */ + @GetMapping("/encuestas/{id}") + public ResponseEntity getEncuesta(@PathVariable Long id) { + log.debug("REST request to get Encuesta : {}", id); + Optional encuesta = encuestaService.findOne(id); + return ResponseUtil.wrapOrNotFound(encuesta); + } + + /** + * {@code DELETE /encuestas/:id} : delete the "id" encuesta. + * + * @param id the id of the encuesta to delete. + * @return the {@link ResponseEntity} with status {@code 204 (NO_CONTENT)}. + */ + @DeleteMapping("/encuestas/{id}") + public ResponseEntity deleteEncuesta(@PathVariable Long id) { + log.debug("REST request to delete Encuesta : {}", id); + encuestaService.delete(id); + return ResponseEntity + .noContent() + .headers(HeaderUtil.createEntityDeletionAlert(applicationName, true, ENTITY_NAME, id.toString())) + .build(); + } +} diff --git a/src/main/java/org/datasurvey/web/rest/FacturaResource.java b/src/main/java/org/datasurvey/web/rest/FacturaResource.java new file mode 100644 index 0000000..4a407dc --- /dev/null +++ b/src/main/java/org/datasurvey/web/rest/FacturaResource.java @@ -0,0 +1,193 @@ +package org.datasurvey.web.rest; + +import java.net.URI; +import java.net.URISyntaxException; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import javax.validation.Valid; +import javax.validation.constraints.NotNull; +import org.datasurvey.domain.Factura; +import org.datasurvey.repository.FacturaRepository; +import org.datasurvey.service.FacturaQueryService; +import org.datasurvey.service.FacturaService; +import org.datasurvey.service.criteria.FacturaCriteria; +import org.datasurvey.web.rest.errors.BadRequestAlertException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import tech.jhipster.web.util.HeaderUtil; +import tech.jhipster.web.util.ResponseUtil; + +/** + * REST controller for managing {@link org.datasurvey.domain.Factura}. + */ +@RestController +@RequestMapping("/api") +public class FacturaResource { + + private final Logger log = LoggerFactory.getLogger(FacturaResource.class); + + private static final String ENTITY_NAME = "factura"; + + @Value("${jhipster.clientApp.name}") + private String applicationName; + + private final FacturaService facturaService; + + private final FacturaRepository facturaRepository; + + private final FacturaQueryService facturaQueryService; + + public FacturaResource(FacturaService facturaService, FacturaRepository facturaRepository, FacturaQueryService facturaQueryService) { + this.facturaService = facturaService; + this.facturaRepository = facturaRepository; + this.facturaQueryService = facturaQueryService; + } + + /** + * {@code POST /facturas} : Create a new factura. + * + * @param factura the factura to create. + * @return the {@link ResponseEntity} with status {@code 201 (Created)} and with body the new factura, or with status {@code 400 (Bad Request)} if the factura has already an ID. + * @throws URISyntaxException if the Location URI syntax is incorrect. + */ + @PostMapping("/facturas") + public ResponseEntity createFactura(@Valid @RequestBody Factura factura) throws URISyntaxException { + log.debug("REST request to save Factura : {}", factura); + if (factura.getId() != null) { + throw new BadRequestAlertException("A new factura cannot already have an ID", ENTITY_NAME, "idexists"); + } + Factura result = facturaService.save(factura); + return ResponseEntity + .created(new URI("/api/facturas/" + result.getId())) + .headers(HeaderUtil.createEntityCreationAlert(applicationName, true, ENTITY_NAME, result.getId().toString())) + .body(result); + } + + /** + * {@code PUT /facturas/:id} : Updates an existing factura. + * + * @param id the id of the factura to save. + * @param factura the factura to update. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the updated factura, + * or with status {@code 400 (Bad Request)} if the factura is not valid, + * or with status {@code 500 (Internal Server Error)} if the factura couldn't be updated. + * @throws URISyntaxException if the Location URI syntax is incorrect. + */ + @PutMapping("/facturas/{id}") + public ResponseEntity updateFactura( + @PathVariable(value = "id", required = false) final Long id, + @Valid @RequestBody Factura factura + ) throws URISyntaxException { + log.debug("REST request to update Factura : {}, {}", id, factura); + if (factura.getId() == null) { + throw new BadRequestAlertException("Invalid id", ENTITY_NAME, "idnull"); + } + if (!Objects.equals(id, factura.getId())) { + throw new BadRequestAlertException("Invalid ID", ENTITY_NAME, "idinvalid"); + } + + if (!facturaRepository.existsById(id)) { + throw new BadRequestAlertException("Entity not found", ENTITY_NAME, "idnotfound"); + } + + Factura result = facturaService.save(factura); + return ResponseEntity + .ok() + .headers(HeaderUtil.createEntityUpdateAlert(applicationName, true, ENTITY_NAME, factura.getId().toString())) + .body(result); + } + + /** + * {@code PATCH /facturas/:id} : Partial updates given fields of an existing factura, field will ignore if it is null + * + * @param id the id of the factura to save. + * @param factura the factura to update. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the updated factura, + * or with status {@code 400 (Bad Request)} if the factura is not valid, + * or with status {@code 404 (Not Found)} if the factura is not found, + * or with status {@code 500 (Internal Server Error)} if the factura couldn't be updated. + * @throws URISyntaxException if the Location URI syntax is incorrect. + */ + @PatchMapping(value = "/facturas/{id}", consumes = "application/merge-patch+json") + public ResponseEntity partialUpdateFactura( + @PathVariable(value = "id", required = false) final Long id, + @NotNull @RequestBody Factura factura + ) throws URISyntaxException { + log.debug("REST request to partial update Factura partially : {}, {}", id, factura); + if (factura.getId() == null) { + throw new BadRequestAlertException("Invalid id", ENTITY_NAME, "idnull"); + } + if (!Objects.equals(id, factura.getId())) { + throw new BadRequestAlertException("Invalid ID", ENTITY_NAME, "idinvalid"); + } + + if (!facturaRepository.existsById(id)) { + throw new BadRequestAlertException("Entity not found", ENTITY_NAME, "idnotfound"); + } + + Optional result = facturaService.partialUpdate(factura); + + return ResponseUtil.wrapOrNotFound( + result, + HeaderUtil.createEntityUpdateAlert(applicationName, true, ENTITY_NAME, factura.getId().toString()) + ); + } + + /** + * {@code GET /facturas} : get all the facturas. + * + * @param criteria the criteria which the requested entities should match. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and the list of facturas in body. + */ + @GetMapping("/facturas") + public ResponseEntity> getAllFacturas(FacturaCriteria criteria) { + log.debug("REST request to get Facturas by criteria: {}", criteria); + List entityList = facturaQueryService.findByCriteria(criteria); + return ResponseEntity.ok().body(entityList); + } + + /** + * {@code GET /facturas/count} : count all the facturas. + * + * @param criteria the criteria which the requested entities should match. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and the count in body. + */ + @GetMapping("/facturas/count") + public ResponseEntity countFacturas(FacturaCriteria criteria) { + log.debug("REST request to count Facturas by criteria: {}", criteria); + return ResponseEntity.ok().body(facturaQueryService.countByCriteria(criteria)); + } + + /** + * {@code GET /facturas/:id} : get the "id" factura. + * + * @param id the id of the factura to retrieve. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the factura, or with status {@code 404 (Not Found)}. + */ + @GetMapping("/facturas/{id}") + public ResponseEntity getFactura(@PathVariable Long id) { + log.debug("REST request to get Factura : {}", id); + Optional factura = facturaService.findOne(id); + return ResponseUtil.wrapOrNotFound(factura); + } + + /** + * {@code DELETE /facturas/:id} : delete the "id" factura. + * + * @param id the id of the factura to delete. + * @return the {@link ResponseEntity} with status {@code 204 (NO_CONTENT)}. + */ + @DeleteMapping("/facturas/{id}") + public ResponseEntity deleteFactura(@PathVariable Long id) { + log.debug("REST request to delete Factura : {}", id); + facturaService.delete(id); + return ResponseEntity + .noContent() + .headers(HeaderUtil.createEntityDeletionAlert(applicationName, true, ENTITY_NAME, id.toString())) + .build(); + } +} diff --git a/src/main/java/org/datasurvey/web/rest/PPreguntaAbiertaResource.java b/src/main/java/org/datasurvey/web/rest/PPreguntaAbiertaResource.java new file mode 100644 index 0000000..e2304c3 --- /dev/null +++ b/src/main/java/org/datasurvey/web/rest/PPreguntaAbiertaResource.java @@ -0,0 +1,198 @@ +package org.datasurvey.web.rest; + +import java.net.URI; +import java.net.URISyntaxException; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import javax.validation.Valid; +import javax.validation.constraints.NotNull; +import org.datasurvey.domain.PPreguntaAbierta; +import org.datasurvey.repository.PPreguntaAbiertaRepository; +import org.datasurvey.service.PPreguntaAbiertaQueryService; +import org.datasurvey.service.PPreguntaAbiertaService; +import org.datasurvey.service.criteria.PPreguntaAbiertaCriteria; +import org.datasurvey.web.rest.errors.BadRequestAlertException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import tech.jhipster.web.util.HeaderUtil; +import tech.jhipster.web.util.ResponseUtil; + +/** + * REST controller for managing {@link org.datasurvey.domain.PPreguntaAbierta}. + */ +@RestController +@RequestMapping("/api") +public class PPreguntaAbiertaResource { + + private final Logger log = LoggerFactory.getLogger(PPreguntaAbiertaResource.class); + + private static final String ENTITY_NAME = "pPreguntaAbierta"; + + @Value("${jhipster.clientApp.name}") + private String applicationName; + + private final PPreguntaAbiertaService pPreguntaAbiertaService; + + private final PPreguntaAbiertaRepository pPreguntaAbiertaRepository; + + private final PPreguntaAbiertaQueryService pPreguntaAbiertaQueryService; + + public PPreguntaAbiertaResource( + PPreguntaAbiertaService pPreguntaAbiertaService, + PPreguntaAbiertaRepository pPreguntaAbiertaRepository, + PPreguntaAbiertaQueryService pPreguntaAbiertaQueryService + ) { + this.pPreguntaAbiertaService = pPreguntaAbiertaService; + this.pPreguntaAbiertaRepository = pPreguntaAbiertaRepository; + this.pPreguntaAbiertaQueryService = pPreguntaAbiertaQueryService; + } + + /** + * {@code POST /p-pregunta-abiertas} : Create a new pPreguntaAbierta. + * + * @param pPreguntaAbierta the pPreguntaAbierta to create. + * @return the {@link ResponseEntity} with status {@code 201 (Created)} and with body the new pPreguntaAbierta, or with status {@code 400 (Bad Request)} if the pPreguntaAbierta has already an ID. + * @throws URISyntaxException if the Location URI syntax is incorrect. + */ + @PostMapping("/p-pregunta-abiertas") + public ResponseEntity createPPreguntaAbierta(@Valid @RequestBody PPreguntaAbierta pPreguntaAbierta) + throws URISyntaxException { + log.debug("REST request to save PPreguntaAbierta : {}", pPreguntaAbierta); + if (pPreguntaAbierta.getId() != null) { + throw new BadRequestAlertException("A new pPreguntaAbierta cannot already have an ID", ENTITY_NAME, "idexists"); + } + PPreguntaAbierta result = pPreguntaAbiertaService.save(pPreguntaAbierta); + return ResponseEntity + .created(new URI("/api/p-pregunta-abiertas/" + result.getId())) + .headers(HeaderUtil.createEntityCreationAlert(applicationName, true, ENTITY_NAME, result.getId().toString())) + .body(result); + } + + /** + * {@code PUT /p-pregunta-abiertas/:id} : Updates an existing pPreguntaAbierta. + * + * @param id the id of the pPreguntaAbierta to save. + * @param pPreguntaAbierta the pPreguntaAbierta to update. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the updated pPreguntaAbierta, + * or with status {@code 400 (Bad Request)} if the pPreguntaAbierta is not valid, + * or with status {@code 500 (Internal Server Error)} if the pPreguntaAbierta couldn't be updated. + * @throws URISyntaxException if the Location URI syntax is incorrect. + */ + @PutMapping("/p-pregunta-abiertas/{id}") + public ResponseEntity updatePPreguntaAbierta( + @PathVariable(value = "id", required = false) final Long id, + @Valid @RequestBody PPreguntaAbierta pPreguntaAbierta + ) throws URISyntaxException { + log.debug("REST request to update PPreguntaAbierta : {}, {}", id, pPreguntaAbierta); + if (pPreguntaAbierta.getId() == null) { + throw new BadRequestAlertException("Invalid id", ENTITY_NAME, "idnull"); + } + if (!Objects.equals(id, pPreguntaAbierta.getId())) { + throw new BadRequestAlertException("Invalid ID", ENTITY_NAME, "idinvalid"); + } + + if (!pPreguntaAbiertaRepository.existsById(id)) { + throw new BadRequestAlertException("Entity not found", ENTITY_NAME, "idnotfound"); + } + + PPreguntaAbierta result = pPreguntaAbiertaService.save(pPreguntaAbierta); + return ResponseEntity + .ok() + .headers(HeaderUtil.createEntityUpdateAlert(applicationName, true, ENTITY_NAME, pPreguntaAbierta.getId().toString())) + .body(result); + } + + /** + * {@code PATCH /p-pregunta-abiertas/:id} : Partial updates given fields of an existing pPreguntaAbierta, field will ignore if it is null + * + * @param id the id of the pPreguntaAbierta to save. + * @param pPreguntaAbierta the pPreguntaAbierta to update. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the updated pPreguntaAbierta, + * or with status {@code 400 (Bad Request)} if the pPreguntaAbierta is not valid, + * or with status {@code 404 (Not Found)} if the pPreguntaAbierta is not found, + * or with status {@code 500 (Internal Server Error)} if the pPreguntaAbierta couldn't be updated. + * @throws URISyntaxException if the Location URI syntax is incorrect. + */ + @PatchMapping(value = "/p-pregunta-abiertas/{id}", consumes = "application/merge-patch+json") + public ResponseEntity partialUpdatePPreguntaAbierta( + @PathVariable(value = "id", required = false) final Long id, + @NotNull @RequestBody PPreguntaAbierta pPreguntaAbierta + ) throws URISyntaxException { + log.debug("REST request to partial update PPreguntaAbierta partially : {}, {}", id, pPreguntaAbierta); + if (pPreguntaAbierta.getId() == null) { + throw new BadRequestAlertException("Invalid id", ENTITY_NAME, "idnull"); + } + if (!Objects.equals(id, pPreguntaAbierta.getId())) { + throw new BadRequestAlertException("Invalid ID", ENTITY_NAME, "idinvalid"); + } + + if (!pPreguntaAbiertaRepository.existsById(id)) { + throw new BadRequestAlertException("Entity not found", ENTITY_NAME, "idnotfound"); + } + + Optional result = pPreguntaAbiertaService.partialUpdate(pPreguntaAbierta); + + return ResponseUtil.wrapOrNotFound( + result, + HeaderUtil.createEntityUpdateAlert(applicationName, true, ENTITY_NAME, pPreguntaAbierta.getId().toString()) + ); + } + + /** + * {@code GET /p-pregunta-abiertas} : get all the pPreguntaAbiertas. + * + * @param criteria the criteria which the requested entities should match. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and the list of pPreguntaAbiertas in body. + */ + @GetMapping("/p-pregunta-abiertas") + public ResponseEntity> getAllPPreguntaAbiertas(PPreguntaAbiertaCriteria criteria) { + log.debug("REST request to get PPreguntaAbiertas by criteria: {}", criteria); + List entityList = pPreguntaAbiertaQueryService.findByCriteria(criteria); + return ResponseEntity.ok().body(entityList); + } + + /** + * {@code GET /p-pregunta-abiertas/count} : count all the pPreguntaAbiertas. + * + * @param criteria the criteria which the requested entities should match. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and the count in body. + */ + @GetMapping("/p-pregunta-abiertas/count") + public ResponseEntity countPPreguntaAbiertas(PPreguntaAbiertaCriteria criteria) { + log.debug("REST request to count PPreguntaAbiertas by criteria: {}", criteria); + return ResponseEntity.ok().body(pPreguntaAbiertaQueryService.countByCriteria(criteria)); + } + + /** + * {@code GET /p-pregunta-abiertas/:id} : get the "id" pPreguntaAbierta. + * + * @param id the id of the pPreguntaAbierta to retrieve. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the pPreguntaAbierta, or with status {@code 404 (Not Found)}. + */ + @GetMapping("/p-pregunta-abiertas/{id}") + public ResponseEntity getPPreguntaAbierta(@PathVariable Long id) { + log.debug("REST request to get PPreguntaAbierta : {}", id); + Optional pPreguntaAbierta = pPreguntaAbiertaService.findOne(id); + return ResponseUtil.wrapOrNotFound(pPreguntaAbierta); + } + + /** + * {@code DELETE /p-pregunta-abiertas/:id} : delete the "id" pPreguntaAbierta. + * + * @param id the id of the pPreguntaAbierta to delete. + * @return the {@link ResponseEntity} with status {@code 204 (NO_CONTENT)}. + */ + @DeleteMapping("/p-pregunta-abiertas/{id}") + public ResponseEntity deletePPreguntaAbierta(@PathVariable Long id) { + log.debug("REST request to delete PPreguntaAbierta : {}", id); + pPreguntaAbiertaService.delete(id); + return ResponseEntity + .noContent() + .headers(HeaderUtil.createEntityDeletionAlert(applicationName, true, ENTITY_NAME, id.toString())) + .build(); + } +} diff --git a/src/main/java/org/datasurvey/web/rest/PPreguntaCerradaOpcionResource.java b/src/main/java/org/datasurvey/web/rest/PPreguntaCerradaOpcionResource.java new file mode 100644 index 0000000..3dcc603 --- /dev/null +++ b/src/main/java/org/datasurvey/web/rest/PPreguntaCerradaOpcionResource.java @@ -0,0 +1,199 @@ +package org.datasurvey.web.rest; + +import java.net.URI; +import java.net.URISyntaxException; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import javax.validation.Valid; +import javax.validation.constraints.NotNull; +import org.datasurvey.domain.PPreguntaCerradaOpcion; +import org.datasurvey.repository.PPreguntaCerradaOpcionRepository; +import org.datasurvey.service.PPreguntaCerradaOpcionQueryService; +import org.datasurvey.service.PPreguntaCerradaOpcionService; +import org.datasurvey.service.criteria.PPreguntaCerradaOpcionCriteria; +import org.datasurvey.web.rest.errors.BadRequestAlertException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import tech.jhipster.web.util.HeaderUtil; +import tech.jhipster.web.util.ResponseUtil; + +/** + * REST controller for managing {@link org.datasurvey.domain.PPreguntaCerradaOpcion}. + */ +@RestController +@RequestMapping("/api") +public class PPreguntaCerradaOpcionResource { + + private final Logger log = LoggerFactory.getLogger(PPreguntaCerradaOpcionResource.class); + + private static final String ENTITY_NAME = "pPreguntaCerradaOpcion"; + + @Value("${jhipster.clientApp.name}") + private String applicationName; + + private final PPreguntaCerradaOpcionService pPreguntaCerradaOpcionService; + + private final PPreguntaCerradaOpcionRepository pPreguntaCerradaOpcionRepository; + + private final PPreguntaCerradaOpcionQueryService pPreguntaCerradaOpcionQueryService; + + public PPreguntaCerradaOpcionResource( + PPreguntaCerradaOpcionService pPreguntaCerradaOpcionService, + PPreguntaCerradaOpcionRepository pPreguntaCerradaOpcionRepository, + PPreguntaCerradaOpcionQueryService pPreguntaCerradaOpcionQueryService + ) { + this.pPreguntaCerradaOpcionService = pPreguntaCerradaOpcionService; + this.pPreguntaCerradaOpcionRepository = pPreguntaCerradaOpcionRepository; + this.pPreguntaCerradaOpcionQueryService = pPreguntaCerradaOpcionQueryService; + } + + /** + * {@code POST /p-pregunta-cerrada-opcions} : Create a new pPreguntaCerradaOpcion. + * + * @param pPreguntaCerradaOpcion the pPreguntaCerradaOpcion to create. + * @return the {@link ResponseEntity} with status {@code 201 (Created)} and with body the new pPreguntaCerradaOpcion, or with status {@code 400 (Bad Request)} if the pPreguntaCerradaOpcion has already an ID. + * @throws URISyntaxException if the Location URI syntax is incorrect. + */ + @PostMapping("/p-pregunta-cerrada-opcions") + public ResponseEntity createPPreguntaCerradaOpcion( + @Valid @RequestBody PPreguntaCerradaOpcion pPreguntaCerradaOpcion + ) throws URISyntaxException { + log.debug("REST request to save PPreguntaCerradaOpcion : {}", pPreguntaCerradaOpcion); + if (pPreguntaCerradaOpcion.getId() != null) { + throw new BadRequestAlertException("A new pPreguntaCerradaOpcion cannot already have an ID", ENTITY_NAME, "idexists"); + } + PPreguntaCerradaOpcion result = pPreguntaCerradaOpcionService.save(pPreguntaCerradaOpcion); + return ResponseEntity + .created(new URI("/api/p-pregunta-cerrada-opcions/" + result.getId())) + .headers(HeaderUtil.createEntityCreationAlert(applicationName, true, ENTITY_NAME, result.getId().toString())) + .body(result); + } + + /** + * {@code PUT /p-pregunta-cerrada-opcions/:id} : Updates an existing pPreguntaCerradaOpcion. + * + * @param id the id of the pPreguntaCerradaOpcion to save. + * @param pPreguntaCerradaOpcion the pPreguntaCerradaOpcion to update. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the updated pPreguntaCerradaOpcion, + * or with status {@code 400 (Bad Request)} if the pPreguntaCerradaOpcion is not valid, + * or with status {@code 500 (Internal Server Error)} if the pPreguntaCerradaOpcion couldn't be updated. + * @throws URISyntaxException if the Location URI syntax is incorrect. + */ + @PutMapping("/p-pregunta-cerrada-opcions/{id}") + public ResponseEntity updatePPreguntaCerradaOpcion( + @PathVariable(value = "id", required = false) final Long id, + @Valid @RequestBody PPreguntaCerradaOpcion pPreguntaCerradaOpcion + ) throws URISyntaxException { + log.debug("REST request to update PPreguntaCerradaOpcion : {}, {}", id, pPreguntaCerradaOpcion); + if (pPreguntaCerradaOpcion.getId() == null) { + throw new BadRequestAlertException("Invalid id", ENTITY_NAME, "idnull"); + } + if (!Objects.equals(id, pPreguntaCerradaOpcion.getId())) { + throw new BadRequestAlertException("Invalid ID", ENTITY_NAME, "idinvalid"); + } + + if (!pPreguntaCerradaOpcionRepository.existsById(id)) { + throw new BadRequestAlertException("Entity not found", ENTITY_NAME, "idnotfound"); + } + + PPreguntaCerradaOpcion result = pPreguntaCerradaOpcionService.save(pPreguntaCerradaOpcion); + return ResponseEntity + .ok() + .headers(HeaderUtil.createEntityUpdateAlert(applicationName, true, ENTITY_NAME, pPreguntaCerradaOpcion.getId().toString())) + .body(result); + } + + /** + * {@code PATCH /p-pregunta-cerrada-opcions/:id} : Partial updates given fields of an existing pPreguntaCerradaOpcion, field will ignore if it is null + * + * @param id the id of the pPreguntaCerradaOpcion to save. + * @param pPreguntaCerradaOpcion the pPreguntaCerradaOpcion to update. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the updated pPreguntaCerradaOpcion, + * or with status {@code 400 (Bad Request)} if the pPreguntaCerradaOpcion is not valid, + * or with status {@code 404 (Not Found)} if the pPreguntaCerradaOpcion is not found, + * or with status {@code 500 (Internal Server Error)} if the pPreguntaCerradaOpcion couldn't be updated. + * @throws URISyntaxException if the Location URI syntax is incorrect. + */ + @PatchMapping(value = "/p-pregunta-cerrada-opcions/{id}", consumes = "application/merge-patch+json") + public ResponseEntity partialUpdatePPreguntaCerradaOpcion( + @PathVariable(value = "id", required = false) final Long id, + @NotNull @RequestBody PPreguntaCerradaOpcion pPreguntaCerradaOpcion + ) throws URISyntaxException { + log.debug("REST request to partial update PPreguntaCerradaOpcion partially : {}, {}", id, pPreguntaCerradaOpcion); + if (pPreguntaCerradaOpcion.getId() == null) { + throw new BadRequestAlertException("Invalid id", ENTITY_NAME, "idnull"); + } + if (!Objects.equals(id, pPreguntaCerradaOpcion.getId())) { + throw new BadRequestAlertException("Invalid ID", ENTITY_NAME, "idinvalid"); + } + + if (!pPreguntaCerradaOpcionRepository.existsById(id)) { + throw new BadRequestAlertException("Entity not found", ENTITY_NAME, "idnotfound"); + } + + Optional result = pPreguntaCerradaOpcionService.partialUpdate(pPreguntaCerradaOpcion); + + return ResponseUtil.wrapOrNotFound( + result, + HeaderUtil.createEntityUpdateAlert(applicationName, true, ENTITY_NAME, pPreguntaCerradaOpcion.getId().toString()) + ); + } + + /** + * {@code GET /p-pregunta-cerrada-opcions} : get all the pPreguntaCerradaOpcions. + * + * @param criteria the criteria which the requested entities should match. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and the list of pPreguntaCerradaOpcions in body. + */ + @GetMapping("/p-pregunta-cerrada-opcions") + public ResponseEntity> getAllPPreguntaCerradaOpcions(PPreguntaCerradaOpcionCriteria criteria) { + log.debug("REST request to get PPreguntaCerradaOpcions by criteria: {}", criteria); + List entityList = pPreguntaCerradaOpcionQueryService.findByCriteria(criteria); + return ResponseEntity.ok().body(entityList); + } + + /** + * {@code GET /p-pregunta-cerrada-opcions/count} : count all the pPreguntaCerradaOpcions. + * + * @param criteria the criteria which the requested entities should match. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and the count in body. + */ + @GetMapping("/p-pregunta-cerrada-opcions/count") + public ResponseEntity countPPreguntaCerradaOpcions(PPreguntaCerradaOpcionCriteria criteria) { + log.debug("REST request to count PPreguntaCerradaOpcions by criteria: {}", criteria); + return ResponseEntity.ok().body(pPreguntaCerradaOpcionQueryService.countByCriteria(criteria)); + } + + /** + * {@code GET /p-pregunta-cerrada-opcions/:id} : get the "id" pPreguntaCerradaOpcion. + * + * @param id the id of the pPreguntaCerradaOpcion to retrieve. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the pPreguntaCerradaOpcion, or with status {@code 404 (Not Found)}. + */ + @GetMapping("/p-pregunta-cerrada-opcions/{id}") + public ResponseEntity getPPreguntaCerradaOpcion(@PathVariable Long id) { + log.debug("REST request to get PPreguntaCerradaOpcion : {}", id); + Optional pPreguntaCerradaOpcion = pPreguntaCerradaOpcionService.findOne(id); + return ResponseUtil.wrapOrNotFound(pPreguntaCerradaOpcion); + } + + /** + * {@code DELETE /p-pregunta-cerrada-opcions/:id} : delete the "id" pPreguntaCerradaOpcion. + * + * @param id the id of the pPreguntaCerradaOpcion to delete. + * @return the {@link ResponseEntity} with status {@code 204 (NO_CONTENT)}. + */ + @DeleteMapping("/p-pregunta-cerrada-opcions/{id}") + public ResponseEntity deletePPreguntaCerradaOpcion(@PathVariable Long id) { + log.debug("REST request to delete PPreguntaCerradaOpcion : {}", id); + pPreguntaCerradaOpcionService.delete(id); + return ResponseEntity + .noContent() + .headers(HeaderUtil.createEntityDeletionAlert(applicationName, true, ENTITY_NAME, id.toString())) + .build(); + } +} diff --git a/src/main/java/org/datasurvey/web/rest/PPreguntaCerradaResource.java b/src/main/java/org/datasurvey/web/rest/PPreguntaCerradaResource.java new file mode 100644 index 0000000..2b71afd --- /dev/null +++ b/src/main/java/org/datasurvey/web/rest/PPreguntaCerradaResource.java @@ -0,0 +1,198 @@ +package org.datasurvey.web.rest; + +import java.net.URI; +import java.net.URISyntaxException; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import javax.validation.Valid; +import javax.validation.constraints.NotNull; +import org.datasurvey.domain.PPreguntaCerrada; +import org.datasurvey.repository.PPreguntaCerradaRepository; +import org.datasurvey.service.PPreguntaCerradaQueryService; +import org.datasurvey.service.PPreguntaCerradaService; +import org.datasurvey.service.criteria.PPreguntaCerradaCriteria; +import org.datasurvey.web.rest.errors.BadRequestAlertException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import tech.jhipster.web.util.HeaderUtil; +import tech.jhipster.web.util.ResponseUtil; + +/** + * REST controller for managing {@link org.datasurvey.domain.PPreguntaCerrada}. + */ +@RestController +@RequestMapping("/api") +public class PPreguntaCerradaResource { + + private final Logger log = LoggerFactory.getLogger(PPreguntaCerradaResource.class); + + private static final String ENTITY_NAME = "pPreguntaCerrada"; + + @Value("${jhipster.clientApp.name}") + private String applicationName; + + private final PPreguntaCerradaService pPreguntaCerradaService; + + private final PPreguntaCerradaRepository pPreguntaCerradaRepository; + + private final PPreguntaCerradaQueryService pPreguntaCerradaQueryService; + + public PPreguntaCerradaResource( + PPreguntaCerradaService pPreguntaCerradaService, + PPreguntaCerradaRepository pPreguntaCerradaRepository, + PPreguntaCerradaQueryService pPreguntaCerradaQueryService + ) { + this.pPreguntaCerradaService = pPreguntaCerradaService; + this.pPreguntaCerradaRepository = pPreguntaCerradaRepository; + this.pPreguntaCerradaQueryService = pPreguntaCerradaQueryService; + } + + /** + * {@code POST /p-pregunta-cerradas} : Create a new pPreguntaCerrada. + * + * @param pPreguntaCerrada the pPreguntaCerrada to create. + * @return the {@link ResponseEntity} with status {@code 201 (Created)} and with body the new pPreguntaCerrada, or with status {@code 400 (Bad Request)} if the pPreguntaCerrada has already an ID. + * @throws URISyntaxException if the Location URI syntax is incorrect. + */ + @PostMapping("/p-pregunta-cerradas") + public ResponseEntity createPPreguntaCerrada(@Valid @RequestBody PPreguntaCerrada pPreguntaCerrada) + throws URISyntaxException { + log.debug("REST request to save PPreguntaCerrada : {}", pPreguntaCerrada); + if (pPreguntaCerrada.getId() != null) { + throw new BadRequestAlertException("A new pPreguntaCerrada cannot already have an ID", ENTITY_NAME, "idexists"); + } + PPreguntaCerrada result = pPreguntaCerradaService.save(pPreguntaCerrada); + return ResponseEntity + .created(new URI("/api/p-pregunta-cerradas/" + result.getId())) + .headers(HeaderUtil.createEntityCreationAlert(applicationName, true, ENTITY_NAME, result.getId().toString())) + .body(result); + } + + /** + * {@code PUT /p-pregunta-cerradas/:id} : Updates an existing pPreguntaCerrada. + * + * @param id the id of the pPreguntaCerrada to save. + * @param pPreguntaCerrada the pPreguntaCerrada to update. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the updated pPreguntaCerrada, + * or with status {@code 400 (Bad Request)} if the pPreguntaCerrada is not valid, + * or with status {@code 500 (Internal Server Error)} if the pPreguntaCerrada couldn't be updated. + * @throws URISyntaxException if the Location URI syntax is incorrect. + */ + @PutMapping("/p-pregunta-cerradas/{id}") + public ResponseEntity updatePPreguntaCerrada( + @PathVariable(value = "id", required = false) final Long id, + @Valid @RequestBody PPreguntaCerrada pPreguntaCerrada + ) throws URISyntaxException { + log.debug("REST request to update PPreguntaCerrada : {}, {}", id, pPreguntaCerrada); + if (pPreguntaCerrada.getId() == null) { + throw new BadRequestAlertException("Invalid id", ENTITY_NAME, "idnull"); + } + if (!Objects.equals(id, pPreguntaCerrada.getId())) { + throw new BadRequestAlertException("Invalid ID", ENTITY_NAME, "idinvalid"); + } + + if (!pPreguntaCerradaRepository.existsById(id)) { + throw new BadRequestAlertException("Entity not found", ENTITY_NAME, "idnotfound"); + } + + PPreguntaCerrada result = pPreguntaCerradaService.save(pPreguntaCerrada); + return ResponseEntity + .ok() + .headers(HeaderUtil.createEntityUpdateAlert(applicationName, true, ENTITY_NAME, pPreguntaCerrada.getId().toString())) + .body(result); + } + + /** + * {@code PATCH /p-pregunta-cerradas/:id} : Partial updates given fields of an existing pPreguntaCerrada, field will ignore if it is null + * + * @param id the id of the pPreguntaCerrada to save. + * @param pPreguntaCerrada the pPreguntaCerrada to update. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the updated pPreguntaCerrada, + * or with status {@code 400 (Bad Request)} if the pPreguntaCerrada is not valid, + * or with status {@code 404 (Not Found)} if the pPreguntaCerrada is not found, + * or with status {@code 500 (Internal Server Error)} if the pPreguntaCerrada couldn't be updated. + * @throws URISyntaxException if the Location URI syntax is incorrect. + */ + @PatchMapping(value = "/p-pregunta-cerradas/{id}", consumes = "application/merge-patch+json") + public ResponseEntity partialUpdatePPreguntaCerrada( + @PathVariable(value = "id", required = false) final Long id, + @NotNull @RequestBody PPreguntaCerrada pPreguntaCerrada + ) throws URISyntaxException { + log.debug("REST request to partial update PPreguntaCerrada partially : {}, {}", id, pPreguntaCerrada); + if (pPreguntaCerrada.getId() == null) { + throw new BadRequestAlertException("Invalid id", ENTITY_NAME, "idnull"); + } + if (!Objects.equals(id, pPreguntaCerrada.getId())) { + throw new BadRequestAlertException("Invalid ID", ENTITY_NAME, "idinvalid"); + } + + if (!pPreguntaCerradaRepository.existsById(id)) { + throw new BadRequestAlertException("Entity not found", ENTITY_NAME, "idnotfound"); + } + + Optional result = pPreguntaCerradaService.partialUpdate(pPreguntaCerrada); + + return ResponseUtil.wrapOrNotFound( + result, + HeaderUtil.createEntityUpdateAlert(applicationName, true, ENTITY_NAME, pPreguntaCerrada.getId().toString()) + ); + } + + /** + * {@code GET /p-pregunta-cerradas} : get all the pPreguntaCerradas. + * + * @param criteria the criteria which the requested entities should match. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and the list of pPreguntaCerradas in body. + */ + @GetMapping("/p-pregunta-cerradas") + public ResponseEntity> getAllPPreguntaCerradas(PPreguntaCerradaCriteria criteria) { + log.debug("REST request to get PPreguntaCerradas by criteria: {}", criteria); + List entityList = pPreguntaCerradaQueryService.findByCriteria(criteria); + return ResponseEntity.ok().body(entityList); + } + + /** + * {@code GET /p-pregunta-cerradas/count} : count all the pPreguntaCerradas. + * + * @param criteria the criteria which the requested entities should match. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and the count in body. + */ + @GetMapping("/p-pregunta-cerradas/count") + public ResponseEntity countPPreguntaCerradas(PPreguntaCerradaCriteria criteria) { + log.debug("REST request to count PPreguntaCerradas by criteria: {}", criteria); + return ResponseEntity.ok().body(pPreguntaCerradaQueryService.countByCriteria(criteria)); + } + + /** + * {@code GET /p-pregunta-cerradas/:id} : get the "id" pPreguntaCerrada. + * + * @param id the id of the pPreguntaCerrada to retrieve. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the pPreguntaCerrada, or with status {@code 404 (Not Found)}. + */ + @GetMapping("/p-pregunta-cerradas/{id}") + public ResponseEntity getPPreguntaCerrada(@PathVariable Long id) { + log.debug("REST request to get PPreguntaCerrada : {}", id); + Optional pPreguntaCerrada = pPreguntaCerradaService.findOne(id); + return ResponseUtil.wrapOrNotFound(pPreguntaCerrada); + } + + /** + * {@code DELETE /p-pregunta-cerradas/:id} : delete the "id" pPreguntaCerrada. + * + * @param id the id of the pPreguntaCerrada to delete. + * @return the {@link ResponseEntity} with status {@code 204 (NO_CONTENT)}. + */ + @DeleteMapping("/p-pregunta-cerradas/{id}") + public ResponseEntity deletePPreguntaCerrada(@PathVariable Long id) { + log.debug("REST request to delete PPreguntaCerrada : {}", id); + pPreguntaCerradaService.delete(id); + return ResponseEntity + .noContent() + .headers(HeaderUtil.createEntityDeletionAlert(applicationName, true, ENTITY_NAME, id.toString())) + .build(); + } +} diff --git a/src/main/java/org/datasurvey/web/rest/ParametroAplicacionResource.java b/src/main/java/org/datasurvey/web/rest/ParametroAplicacionResource.java new file mode 100644 index 0000000..0b2963d --- /dev/null +++ b/src/main/java/org/datasurvey/web/rest/ParametroAplicacionResource.java @@ -0,0 +1,198 @@ +package org.datasurvey.web.rest; + +import java.net.URI; +import java.net.URISyntaxException; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import javax.validation.Valid; +import javax.validation.constraints.NotNull; +import org.datasurvey.domain.ParametroAplicacion; +import org.datasurvey.repository.ParametroAplicacionRepository; +import org.datasurvey.service.ParametroAplicacionQueryService; +import org.datasurvey.service.ParametroAplicacionService; +import org.datasurvey.service.criteria.ParametroAplicacionCriteria; +import org.datasurvey.web.rest.errors.BadRequestAlertException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import tech.jhipster.web.util.HeaderUtil; +import tech.jhipster.web.util.ResponseUtil; + +/** + * REST controller for managing {@link org.datasurvey.domain.ParametroAplicacion}. + */ +@RestController +@RequestMapping("/api") +public class ParametroAplicacionResource { + + private final Logger log = LoggerFactory.getLogger(ParametroAplicacionResource.class); + + private static final String ENTITY_NAME = "parametroAplicacion"; + + @Value("${jhipster.clientApp.name}") + private String applicationName; + + private final ParametroAplicacionService parametroAplicacionService; + + private final ParametroAplicacionRepository parametroAplicacionRepository; + + private final ParametroAplicacionQueryService parametroAplicacionQueryService; + + public ParametroAplicacionResource( + ParametroAplicacionService parametroAplicacionService, + ParametroAplicacionRepository parametroAplicacionRepository, + ParametroAplicacionQueryService parametroAplicacionQueryService + ) { + this.parametroAplicacionService = parametroAplicacionService; + this.parametroAplicacionRepository = parametroAplicacionRepository; + this.parametroAplicacionQueryService = parametroAplicacionQueryService; + } + + /** + * {@code POST /parametro-aplicacions} : Create a new parametroAplicacion. + * + * @param parametroAplicacion the parametroAplicacion to create. + * @return the {@link ResponseEntity} with status {@code 201 (Created)} and with body the new parametroAplicacion, or with status {@code 400 (Bad Request)} if the parametroAplicacion has already an ID. + * @throws URISyntaxException if the Location URI syntax is incorrect. + */ + @PostMapping("/parametro-aplicacions") + public ResponseEntity createParametroAplicacion(@Valid @RequestBody ParametroAplicacion parametroAplicacion) + throws URISyntaxException { + log.debug("REST request to save ParametroAplicacion : {}", parametroAplicacion); + if (parametroAplicacion.getId() != null) { + throw new BadRequestAlertException("A new parametroAplicacion cannot already have an ID", ENTITY_NAME, "idexists"); + } + ParametroAplicacion result = parametroAplicacionService.save(parametroAplicacion); + return ResponseEntity + .created(new URI("/api/parametro-aplicacions/" + result.getId())) + .headers(HeaderUtil.createEntityCreationAlert(applicationName, true, ENTITY_NAME, result.getId().toString())) + .body(result); + } + + /** + * {@code PUT /parametro-aplicacions/:id} : Updates an existing parametroAplicacion. + * + * @param id the id of the parametroAplicacion to save. + * @param parametroAplicacion the parametroAplicacion to update. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the updated parametroAplicacion, + * or with status {@code 400 (Bad Request)} if the parametroAplicacion is not valid, + * or with status {@code 500 (Internal Server Error)} if the parametroAplicacion couldn't be updated. + * @throws URISyntaxException if the Location URI syntax is incorrect. + */ + @PutMapping("/parametro-aplicacions/{id}") + public ResponseEntity updateParametroAplicacion( + @PathVariable(value = "id", required = false) final Long id, + @Valid @RequestBody ParametroAplicacion parametroAplicacion + ) throws URISyntaxException { + log.debug("REST request to update ParametroAplicacion : {}, {}", id, parametroAplicacion); + if (parametroAplicacion.getId() == null) { + throw new BadRequestAlertException("Invalid id", ENTITY_NAME, "idnull"); + } + if (!Objects.equals(id, parametroAplicacion.getId())) { + throw new BadRequestAlertException("Invalid ID", ENTITY_NAME, "idinvalid"); + } + + if (!parametroAplicacionRepository.existsById(id)) { + throw new BadRequestAlertException("Entity not found", ENTITY_NAME, "idnotfound"); + } + + ParametroAplicacion result = parametroAplicacionService.save(parametroAplicacion); + return ResponseEntity + .ok() + .headers(HeaderUtil.createEntityUpdateAlert(applicationName, true, ENTITY_NAME, parametroAplicacion.getId().toString())) + .body(result); + } + + /** + * {@code PATCH /parametro-aplicacions/:id} : Partial updates given fields of an existing parametroAplicacion, field will ignore if it is null + * + * @param id the id of the parametroAplicacion to save. + * @param parametroAplicacion the parametroAplicacion to update. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the updated parametroAplicacion, + * or with status {@code 400 (Bad Request)} if the parametroAplicacion is not valid, + * or with status {@code 404 (Not Found)} if the parametroAplicacion is not found, + * or with status {@code 500 (Internal Server Error)} if the parametroAplicacion couldn't be updated. + * @throws URISyntaxException if the Location URI syntax is incorrect. + */ + @PatchMapping(value = "/parametro-aplicacions/{id}", consumes = "application/merge-patch+json") + public ResponseEntity partialUpdateParametroAplicacion( + @PathVariable(value = "id", required = false) final Long id, + @NotNull @RequestBody ParametroAplicacion parametroAplicacion + ) throws URISyntaxException { + log.debug("REST request to partial update ParametroAplicacion partially : {}, {}", id, parametroAplicacion); + if (parametroAplicacion.getId() == null) { + throw new BadRequestAlertException("Invalid id", ENTITY_NAME, "idnull"); + } + if (!Objects.equals(id, parametroAplicacion.getId())) { + throw new BadRequestAlertException("Invalid ID", ENTITY_NAME, "idinvalid"); + } + + if (!parametroAplicacionRepository.existsById(id)) { + throw new BadRequestAlertException("Entity not found", ENTITY_NAME, "idnotfound"); + } + + Optional result = parametroAplicacionService.partialUpdate(parametroAplicacion); + + return ResponseUtil.wrapOrNotFound( + result, + HeaderUtil.createEntityUpdateAlert(applicationName, true, ENTITY_NAME, parametroAplicacion.getId().toString()) + ); + } + + /** + * {@code GET /parametro-aplicacions} : get all the parametroAplicacions. + * + * @param criteria the criteria which the requested entities should match. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and the list of parametroAplicacions in body. + */ + @GetMapping("/parametro-aplicacions") + public ResponseEntity> getAllParametroAplicacions(ParametroAplicacionCriteria criteria) { + log.debug("REST request to get ParametroAplicacions by criteria: {}", criteria); + List entityList = parametroAplicacionQueryService.findByCriteria(criteria); + return ResponseEntity.ok().body(entityList); + } + + /** + * {@code GET /parametro-aplicacions/count} : count all the parametroAplicacions. + * + * @param criteria the criteria which the requested entities should match. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and the count in body. + */ + @GetMapping("/parametro-aplicacions/count") + public ResponseEntity countParametroAplicacions(ParametroAplicacionCriteria criteria) { + log.debug("REST request to count ParametroAplicacions by criteria: {}", criteria); + return ResponseEntity.ok().body(parametroAplicacionQueryService.countByCriteria(criteria)); + } + + /** + * {@code GET /parametro-aplicacions/:id} : get the "id" parametroAplicacion. + * + * @param id the id of the parametroAplicacion to retrieve. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the parametroAplicacion, or with status {@code 404 (Not Found)}. + */ + @GetMapping("/parametro-aplicacions/{id}") + public ResponseEntity getParametroAplicacion(@PathVariable Long id) { + log.debug("REST request to get ParametroAplicacion : {}", id); + Optional parametroAplicacion = parametroAplicacionService.findOne(id); + return ResponseUtil.wrapOrNotFound(parametroAplicacion); + } + + /** + * {@code DELETE /parametro-aplicacions/:id} : delete the "id" parametroAplicacion. + * + * @param id the id of the parametroAplicacion to delete. + * @return the {@link ResponseEntity} with status {@code 204 (NO_CONTENT)}. + */ + @DeleteMapping("/parametro-aplicacions/{id}") + public ResponseEntity deleteParametroAplicacion(@PathVariable Long id) { + log.debug("REST request to delete ParametroAplicacion : {}", id); + parametroAplicacionService.delete(id); + return ResponseEntity + .noContent() + .headers(HeaderUtil.createEntityDeletionAlert(applicationName, true, ENTITY_NAME, id.toString())) + .build(); + } +} diff --git a/src/main/java/org/datasurvey/web/rest/PlantillaResource.java b/src/main/java/org/datasurvey/web/rest/PlantillaResource.java new file mode 100644 index 0000000..1b94fc2 --- /dev/null +++ b/src/main/java/org/datasurvey/web/rest/PlantillaResource.java @@ -0,0 +1,197 @@ +package org.datasurvey.web.rest; + +import java.net.URI; +import java.net.URISyntaxException; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import javax.validation.Valid; +import javax.validation.constraints.NotNull; +import org.datasurvey.domain.Plantilla; +import org.datasurvey.repository.PlantillaRepository; +import org.datasurvey.service.PlantillaQueryService; +import org.datasurvey.service.PlantillaService; +import org.datasurvey.service.criteria.PlantillaCriteria; +import org.datasurvey.web.rest.errors.BadRequestAlertException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import tech.jhipster.web.util.HeaderUtil; +import tech.jhipster.web.util.ResponseUtil; + +/** + * REST controller for managing {@link org.datasurvey.domain.Plantilla}. + */ +@RestController +@RequestMapping("/api") +public class PlantillaResource { + + private final Logger log = LoggerFactory.getLogger(PlantillaResource.class); + + private static final String ENTITY_NAME = "plantilla"; + + @Value("${jhipster.clientApp.name}") + private String applicationName; + + private final PlantillaService plantillaService; + + private final PlantillaRepository plantillaRepository; + + private final PlantillaQueryService plantillaQueryService; + + public PlantillaResource( + PlantillaService plantillaService, + PlantillaRepository plantillaRepository, + PlantillaQueryService plantillaQueryService + ) { + this.plantillaService = plantillaService; + this.plantillaRepository = plantillaRepository; + this.plantillaQueryService = plantillaQueryService; + } + + /** + * {@code POST /plantillas} : Create a new plantilla. + * + * @param plantilla the plantilla to create. + * @return the {@link ResponseEntity} with status {@code 201 (Created)} and with body the new plantilla, or with status {@code 400 (Bad Request)} if the plantilla has already an ID. + * @throws URISyntaxException if the Location URI syntax is incorrect. + */ + @PostMapping("/plantillas") + public ResponseEntity createPlantilla(@Valid @RequestBody Plantilla plantilla) throws URISyntaxException { + log.debug("REST request to save Plantilla : {}", plantilla); + if (plantilla.getId() != null) { + throw new BadRequestAlertException("A new plantilla cannot already have an ID", ENTITY_NAME, "idexists"); + } + Plantilla result = plantillaService.save(plantilla); + return ResponseEntity + .created(new URI("/api/plantillas/" + result.getId())) + .headers(HeaderUtil.createEntityCreationAlert(applicationName, true, ENTITY_NAME, result.getId().toString())) + .body(result); + } + + /** + * {@code PUT /plantillas/:id} : Updates an existing plantilla. + * + * @param id the id of the plantilla to save. + * @param plantilla the plantilla to update. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the updated plantilla, + * or with status {@code 400 (Bad Request)} if the plantilla is not valid, + * or with status {@code 500 (Internal Server Error)} if the plantilla couldn't be updated. + * @throws URISyntaxException if the Location URI syntax is incorrect. + */ + @PutMapping("/plantillas/{id}") + public ResponseEntity updatePlantilla( + @PathVariable(value = "id", required = false) final Long id, + @Valid @RequestBody Plantilla plantilla + ) throws URISyntaxException { + log.debug("REST request to update Plantilla : {}, {}", id, plantilla); + if (plantilla.getId() == null) { + throw new BadRequestAlertException("Invalid id", ENTITY_NAME, "idnull"); + } + if (!Objects.equals(id, plantilla.getId())) { + throw new BadRequestAlertException("Invalid ID", ENTITY_NAME, "idinvalid"); + } + + if (!plantillaRepository.existsById(id)) { + throw new BadRequestAlertException("Entity not found", ENTITY_NAME, "idnotfound"); + } + + Plantilla result = plantillaService.save(plantilla); + return ResponseEntity + .ok() + .headers(HeaderUtil.createEntityUpdateAlert(applicationName, true, ENTITY_NAME, plantilla.getId().toString())) + .body(result); + } + + /** + * {@code PATCH /plantillas/:id} : Partial updates given fields of an existing plantilla, field will ignore if it is null + * + * @param id the id of the plantilla to save. + * @param plantilla the plantilla to update. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the updated plantilla, + * or with status {@code 400 (Bad Request)} if the plantilla is not valid, + * or with status {@code 404 (Not Found)} if the plantilla is not found, + * or with status {@code 500 (Internal Server Error)} if the plantilla couldn't be updated. + * @throws URISyntaxException if the Location URI syntax is incorrect. + */ + @PatchMapping(value = "/plantillas/{id}", consumes = "application/merge-patch+json") + public ResponseEntity partialUpdatePlantilla( + @PathVariable(value = "id", required = false) final Long id, + @NotNull @RequestBody Plantilla plantilla + ) throws URISyntaxException { + log.debug("REST request to partial update Plantilla partially : {}, {}", id, plantilla); + if (plantilla.getId() == null) { + throw new BadRequestAlertException("Invalid id", ENTITY_NAME, "idnull"); + } + if (!Objects.equals(id, plantilla.getId())) { + throw new BadRequestAlertException("Invalid ID", ENTITY_NAME, "idinvalid"); + } + + if (!plantillaRepository.existsById(id)) { + throw new BadRequestAlertException("Entity not found", ENTITY_NAME, "idnotfound"); + } + + Optional result = plantillaService.partialUpdate(plantilla); + + return ResponseUtil.wrapOrNotFound( + result, + HeaderUtil.createEntityUpdateAlert(applicationName, true, ENTITY_NAME, plantilla.getId().toString()) + ); + } + + /** + * {@code GET /plantillas} : get all the plantillas. + * + * @param criteria the criteria which the requested entities should match. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and the list of plantillas in body. + */ + @GetMapping("/plantillas") + public ResponseEntity> getAllPlantillas(PlantillaCriteria criteria) { + log.debug("REST request to get Plantillas by criteria: {}", criteria); + List entityList = plantillaQueryService.findByCriteria(criteria); + return ResponseEntity.ok().body(entityList); + } + + /** + * {@code GET /plantillas/count} : count all the plantillas. + * + * @param criteria the criteria which the requested entities should match. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and the count in body. + */ + @GetMapping("/plantillas/count") + public ResponseEntity countPlantillas(PlantillaCriteria criteria) { + log.debug("REST request to count Plantillas by criteria: {}", criteria); + return ResponseEntity.ok().body(plantillaQueryService.countByCriteria(criteria)); + } + + /** + * {@code GET /plantillas/:id} : get the "id" plantilla. + * + * @param id the id of the plantilla to retrieve. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the plantilla, or with status {@code 404 (Not Found)}. + */ + @GetMapping("/plantillas/{id}") + public ResponseEntity getPlantilla(@PathVariable Long id) { + log.debug("REST request to get Plantilla : {}", id); + Optional plantilla = plantillaService.findOne(id); + return ResponseUtil.wrapOrNotFound(plantilla); + } + + /** + * {@code DELETE /plantillas/:id} : delete the "id" plantilla. + * + * @param id the id of the plantilla to delete. + * @return the {@link ResponseEntity} with status {@code 204 (NO_CONTENT)}. + */ + @DeleteMapping("/plantillas/{id}") + public ResponseEntity deletePlantilla(@PathVariable Long id) { + log.debug("REST request to delete Plantilla : {}", id); + plantillaService.delete(id); + return ResponseEntity + .noContent() + .headers(HeaderUtil.createEntityDeletionAlert(applicationName, true, ENTITY_NAME, id.toString())) + .build(); + } +} diff --git a/src/main/java/org/datasurvey/web/rest/PublicUserResource.java b/src/main/java/org/datasurvey/web/rest/PublicUserResource.java new file mode 100644 index 0000000..90e94fa --- /dev/null +++ b/src/main/java/org/datasurvey/web/rest/PublicUserResource.java @@ -0,0 +1,65 @@ +package org.datasurvey.web.rest; + +import java.util.*; +import java.util.Collections; +import org.datasurvey.service.UserService; +import org.datasurvey.service.dto.UserDTO; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.support.ServletUriComponentsBuilder; +import tech.jhipster.web.util.PaginationUtil; + +@RestController +@RequestMapping("/api") +public class PublicUserResource { + + private static final List ALLOWED_ORDERED_PROPERTIES = Collections.unmodifiableList( + Arrays.asList("id", "login", "firstName", "lastName", "email", "activated", "langKey") + ); + + private final Logger log = LoggerFactory.getLogger(PublicUserResource.class); + + private final UserService userService; + + public PublicUserResource(UserService userService) { + this.userService = userService; + } + + /** + * {@code GET /users} : get all users with only the public informations - calling this are allowed for anyone. + * + * @param pageable the pagination information. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body all users. + */ + @GetMapping("/users") + public ResponseEntity> getAllPublicUsers(Pageable pageable) { + log.debug("REST request to get all public User names"); + if (!onlyContainsAllowedProperties(pageable)) { + return ResponseEntity.badRequest().build(); + } + + final Page page = userService.getAllPublicUsers(pageable); + HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(ServletUriComponentsBuilder.fromCurrentRequest(), page); + return new ResponseEntity<>(page.getContent(), headers, HttpStatus.OK); + } + + private boolean onlyContainsAllowedProperties(Pageable pageable) { + return pageable.getSort().stream().map(Sort.Order::getProperty).allMatch(ALLOWED_ORDERED_PROPERTIES::contains); + } + + /** + * Gets a list of all roles. + * @return a string list of all roles. + */ + @GetMapping("/authorities") + public List getAuthorities() { + return userService.getAuthorities(); + } +} diff --git a/src/main/java/org/datasurvey/web/rest/UserJWTController.java b/src/main/java/org/datasurvey/web/rest/UserJWTController.java new file mode 100644 index 0000000..3ab2601 --- /dev/null +++ b/src/main/java/org/datasurvey/web/rest/UserJWTController.java @@ -0,0 +1,68 @@ +package org.datasurvey.web.rest; + +import com.fasterxml.jackson.annotation.JsonProperty; +import javax.validation.Valid; +import org.datasurvey.security.jwt.JWTFilter; +import org.datasurvey.security.jwt.TokenProvider; +import org.datasurvey.web.rest.vm.LoginVM; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.web.bind.annotation.*; + +/** + * Controller to authenticate users. + */ +@RestController +@RequestMapping("/api") +public class UserJWTController { + + private final TokenProvider tokenProvider; + + private final AuthenticationManagerBuilder authenticationManagerBuilder; + + public UserJWTController(TokenProvider tokenProvider, AuthenticationManagerBuilder authenticationManagerBuilder) { + this.tokenProvider = tokenProvider; + this.authenticationManagerBuilder = authenticationManagerBuilder; + } + + @PostMapping("/authenticate") + public ResponseEntity authorize(@Valid @RequestBody LoginVM loginVM) { + UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken( + loginVM.getUsername(), + loginVM.getPassword() + ); + + Authentication authentication = authenticationManagerBuilder.getObject().authenticate(authenticationToken); + SecurityContextHolder.getContext().setAuthentication(authentication); + String jwt = tokenProvider.createToken(authentication, loginVM.isRememberMe()); + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.add(JWTFilter.AUTHORIZATION_HEADER, "Bearer " + jwt); + return new ResponseEntity<>(new JWTToken(jwt), httpHeaders, HttpStatus.OK); + } + + /** + * Object to return as body in JWT Authentication. + */ + static class JWTToken { + + private String idToken; + + JWTToken(String idToken) { + this.idToken = idToken; + } + + @JsonProperty("id_token") + String getIdToken() { + return idToken; + } + + void setIdToken(String idToken) { + this.idToken = idToken; + } + } +} diff --git a/src/main/java/org/datasurvey/web/rest/UserResource.java b/src/main/java/org/datasurvey/web/rest/UserResource.java new file mode 100644 index 0000000..c79c26f --- /dev/null +++ b/src/main/java/org/datasurvey/web/rest/UserResource.java @@ -0,0 +1,207 @@ +package org.datasurvey.web.rest; + +import java.net.URI; +import java.net.URISyntaxException; +import java.util.*; +import java.util.Collections; +import javax.validation.Valid; +import javax.validation.constraints.Pattern; +import org.datasurvey.config.Constants; +import org.datasurvey.domain.User; +import org.datasurvey.repository.UserRepository; +import org.datasurvey.security.AuthoritiesConstants; +import org.datasurvey.service.MailService; +import org.datasurvey.service.UserService; +import org.datasurvey.service.dto.AdminUserDTO; +import org.datasurvey.web.rest.errors.BadRequestAlertException; +import org.datasurvey.web.rest.errors.EmailAlreadyUsedException; +import org.datasurvey.web.rest.errors.LoginAlreadyUsedException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.support.ServletUriComponentsBuilder; +import tech.jhipster.web.util.HeaderUtil; +import tech.jhipster.web.util.PaginationUtil; +import tech.jhipster.web.util.ResponseUtil; + +/** + * REST controller for managing users. + *

+ * This class accesses the {@link User} entity, and needs to fetch its collection of authorities. + *

+ * For a normal use-case, it would be better to have an eager relationship between User and Authority, + * and send everything to the client side: there would be no View Model and DTO, a lot less code, and an outer-join + * which would be good for performance. + *

+ * We use a View Model and a DTO for 3 reasons: + *

    + *
  • We want to keep a lazy association between the user and the authorities, because people will + * quite often do relationships with the user, and we don't want them to get the authorities all + * the time for nothing (for performance reasons). This is the #1 goal: we should not impact our users' + * application because of this use-case.
  • + *
  • Not having an outer join causes n+1 requests to the database. This is not a real issue as + * we have by default a second-level cache. This means on the first HTTP call we do the n+1 requests, + * but then all authorities come from the cache, so in fact it's much better than doing an outer join + * (which will get lots of data from the database, for each HTTP call).
  • + *
  • As this manages users, for security reasons, we'd rather have a DTO layer.
  • + *
+ *

+ * Another option would be to have a specific JPA entity graph to handle this case. + */ +@RestController +@RequestMapping("/api/admin") +public class UserResource { + + private static final List ALLOWED_ORDERED_PROPERTIES = Collections.unmodifiableList( + Arrays.asList( + "id", + "login", + "firstName", + "lastName", + "email", + "activated", + "langKey", + "createdBy", + "createdDate", + "lastModifiedBy", + "lastModifiedDate" + ) + ); + + private final Logger log = LoggerFactory.getLogger(UserResource.class); + + @Value("${jhipster.clientApp.name}") + private String applicationName; + + private final UserService userService; + + private final UserRepository userRepository; + + private final MailService mailService; + + public UserResource(UserService userService, UserRepository userRepository, MailService mailService) { + this.userService = userService; + this.userRepository = userRepository; + this.mailService = mailService; + } + + /** + * {@code POST /admin/users} : Creates a new user. + *

+ * Creates a new user if the login and email are not already used, and sends an + * mail with an activation link. + * The user needs to be activated on creation. + * + * @param userDTO the user to create. + * @return the {@link ResponseEntity} with status {@code 201 (Created)} and with body the new user, or with status {@code 400 (Bad Request)} if the login or email is already in use. + * @throws URISyntaxException if the Location URI syntax is incorrect. + * @throws BadRequestAlertException {@code 400 (Bad Request)} if the login or email is already in use. + */ + @PostMapping("/users") + @PreAuthorize("hasAuthority(\"" + AuthoritiesConstants.ADMIN + "\")") + public ResponseEntity createUser(@Valid @RequestBody AdminUserDTO userDTO) throws URISyntaxException { + log.debug("REST request to save User : {}", userDTO); + + if (userDTO.getId() != null) { + throw new BadRequestAlertException("A new user cannot already have an ID", "userManagement", "idexists"); + // Lowercase the user login before comparing with database + } else if (userRepository.findOneByLogin(userDTO.getLogin().toLowerCase()).isPresent()) { + throw new LoginAlreadyUsedException(); + } else if (userRepository.findOneByEmailIgnoreCase(userDTO.getEmail()).isPresent()) { + throw new EmailAlreadyUsedException(); + } else { + User newUser = userService.createUser(userDTO); + mailService.sendCreationEmail(newUser); + return ResponseEntity + .created(new URI("/api/admin/users/" + newUser.getLogin())) + .headers(HeaderUtil.createAlert(applicationName, "userManagement.created", newUser.getLogin())) + .body(newUser); + } + } + + /** + * {@code PUT /admin/users} : Updates an existing User. + * + * @param userDTO the user to update. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the updated user. + * @throws EmailAlreadyUsedException {@code 400 (Bad Request)} if the email is already in use. + * @throws LoginAlreadyUsedException {@code 400 (Bad Request)} if the login is already in use. + */ + @PutMapping("/users") + @PreAuthorize("hasAuthority(\"" + AuthoritiesConstants.ADMIN + "\")") + public ResponseEntity updateUser(@Valid @RequestBody AdminUserDTO userDTO) { + log.debug("REST request to update User : {}", userDTO); + Optional existingUser = userRepository.findOneByEmailIgnoreCase(userDTO.getEmail()); + if (existingUser.isPresent() && (!existingUser.get().getId().equals(userDTO.getId()))) { + throw new EmailAlreadyUsedException(); + } + existingUser = userRepository.findOneByLogin(userDTO.getLogin().toLowerCase()); + if (existingUser.isPresent() && (!existingUser.get().getId().equals(userDTO.getId()))) { + throw new LoginAlreadyUsedException(); + } + Optional updatedUser = userService.updateUser(userDTO); + + return ResponseUtil.wrapOrNotFound( + updatedUser, + HeaderUtil.createAlert(applicationName, "userManagement.updated", userDTO.getLogin()) + ); + } + + /** + * {@code GET /admin/users} : get all users with all the details - calling this are only allowed for the administrators. + * + * @param pageable the pagination information. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body all users. + */ + @GetMapping("/users") + @PreAuthorize("hasAuthority(\"" + AuthoritiesConstants.ADMIN + "\")") + public ResponseEntity> getAllUsers(Pageable pageable) { + log.debug("REST request to get all User for an admin"); + if (!onlyContainsAllowedProperties(pageable)) { + return ResponseEntity.badRequest().build(); + } + + final Page page = userService.getAllManagedUsers(pageable); + HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(ServletUriComponentsBuilder.fromCurrentRequest(), page); + return new ResponseEntity<>(page.getContent(), headers, HttpStatus.OK); + } + + private boolean onlyContainsAllowedProperties(Pageable pageable) { + return pageable.getSort().stream().map(Sort.Order::getProperty).allMatch(ALLOWED_ORDERED_PROPERTIES::contains); + } + + /** + * {@code GET /admin/users/:login} : get the "login" user. + * + * @param login the login of the user to find. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the "login" user, or with status {@code 404 (Not Found)}. + */ + @GetMapping("/users/{login}") + @PreAuthorize("hasAuthority(\"" + AuthoritiesConstants.ADMIN + "\")") + public ResponseEntity getUser(@PathVariable @Pattern(regexp = Constants.LOGIN_REGEX) String login) { + log.debug("REST request to get User : {}", login); + return ResponseUtil.wrapOrNotFound(userService.getUserWithAuthoritiesByLogin(login).map(AdminUserDTO::new)); + } + + /** + * {@code DELETE /admin/users/:login} : delete the "login" User. + * + * @param login the login of the user to delete. + * @return the {@link ResponseEntity} with status {@code 204 (NO_CONTENT)}. + */ + @DeleteMapping("/users/{login}") + @PreAuthorize("hasAuthority(\"" + AuthoritiesConstants.ADMIN + "\")") + public ResponseEntity deleteUser(@PathVariable @Pattern(regexp = Constants.LOGIN_REGEX) String login) { + log.debug("REST request to delete User: {}", login); + userService.deleteUser(login); + return ResponseEntity.noContent().headers(HeaderUtil.createAlert(applicationName, "userManagement.deleted", login)).build(); + } +} diff --git a/src/main/java/org/datasurvey/web/rest/UsuarioEncuestaResource.java b/src/main/java/org/datasurvey/web/rest/UsuarioEncuestaResource.java new file mode 100644 index 0000000..814577d --- /dev/null +++ b/src/main/java/org/datasurvey/web/rest/UsuarioEncuestaResource.java @@ -0,0 +1,198 @@ +package org.datasurvey.web.rest; + +import java.net.URI; +import java.net.URISyntaxException; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import javax.validation.Valid; +import javax.validation.constraints.NotNull; +import org.datasurvey.domain.UsuarioEncuesta; +import org.datasurvey.repository.UsuarioEncuestaRepository; +import org.datasurvey.service.UsuarioEncuestaQueryService; +import org.datasurvey.service.UsuarioEncuestaService; +import org.datasurvey.service.criteria.UsuarioEncuestaCriteria; +import org.datasurvey.web.rest.errors.BadRequestAlertException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import tech.jhipster.web.util.HeaderUtil; +import tech.jhipster.web.util.ResponseUtil; + +/** + * REST controller for managing {@link org.datasurvey.domain.UsuarioEncuesta}. + */ +@RestController +@RequestMapping("/api") +public class UsuarioEncuestaResource { + + private final Logger log = LoggerFactory.getLogger(UsuarioEncuestaResource.class); + + private static final String ENTITY_NAME = "usuarioEncuesta"; + + @Value("${jhipster.clientApp.name}") + private String applicationName; + + private final UsuarioEncuestaService usuarioEncuestaService; + + private final UsuarioEncuestaRepository usuarioEncuestaRepository; + + private final UsuarioEncuestaQueryService usuarioEncuestaQueryService; + + public UsuarioEncuestaResource( + UsuarioEncuestaService usuarioEncuestaService, + UsuarioEncuestaRepository usuarioEncuestaRepository, + UsuarioEncuestaQueryService usuarioEncuestaQueryService + ) { + this.usuarioEncuestaService = usuarioEncuestaService; + this.usuarioEncuestaRepository = usuarioEncuestaRepository; + this.usuarioEncuestaQueryService = usuarioEncuestaQueryService; + } + + /** + * {@code POST /usuario-encuestas} : Create a new usuarioEncuesta. + * + * @param usuarioEncuesta the usuarioEncuesta to create. + * @return the {@link ResponseEntity} with status {@code 201 (Created)} and with body the new usuarioEncuesta, or with status {@code 400 (Bad Request)} if the usuarioEncuesta has already an ID. + * @throws URISyntaxException if the Location URI syntax is incorrect. + */ + @PostMapping("/usuario-encuestas") + public ResponseEntity createUsuarioEncuesta(@Valid @RequestBody UsuarioEncuesta usuarioEncuesta) + throws URISyntaxException { + log.debug("REST request to save UsuarioEncuesta : {}", usuarioEncuesta); + if (usuarioEncuesta.getId() != null) { + throw new BadRequestAlertException("A new usuarioEncuesta cannot already have an ID", ENTITY_NAME, "idexists"); + } + UsuarioEncuesta result = usuarioEncuestaService.save(usuarioEncuesta); + return ResponseEntity + .created(new URI("/api/usuario-encuestas/" + result.getId())) + .headers(HeaderUtil.createEntityCreationAlert(applicationName, true, ENTITY_NAME, result.getId().toString())) + .body(result); + } + + /** + * {@code PUT /usuario-encuestas/:id} : Updates an existing usuarioEncuesta. + * + * @param id the id of the usuarioEncuesta to save. + * @param usuarioEncuesta the usuarioEncuesta to update. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the updated usuarioEncuesta, + * or with status {@code 400 (Bad Request)} if the usuarioEncuesta is not valid, + * or with status {@code 500 (Internal Server Error)} if the usuarioEncuesta couldn't be updated. + * @throws URISyntaxException if the Location URI syntax is incorrect. + */ + @PutMapping("/usuario-encuestas/{id}") + public ResponseEntity updateUsuarioEncuesta( + @PathVariable(value = "id", required = false) final Long id, + @Valid @RequestBody UsuarioEncuesta usuarioEncuesta + ) throws URISyntaxException { + log.debug("REST request to update UsuarioEncuesta : {}, {}", id, usuarioEncuesta); + if (usuarioEncuesta.getId() == null) { + throw new BadRequestAlertException("Invalid id", ENTITY_NAME, "idnull"); + } + if (!Objects.equals(id, usuarioEncuesta.getId())) { + throw new BadRequestAlertException("Invalid ID", ENTITY_NAME, "idinvalid"); + } + + if (!usuarioEncuestaRepository.existsById(id)) { + throw new BadRequestAlertException("Entity not found", ENTITY_NAME, "idnotfound"); + } + + UsuarioEncuesta result = usuarioEncuestaService.save(usuarioEncuesta); + return ResponseEntity + .ok() + .headers(HeaderUtil.createEntityUpdateAlert(applicationName, true, ENTITY_NAME, usuarioEncuesta.getId().toString())) + .body(result); + } + + /** + * {@code PATCH /usuario-encuestas/:id} : Partial updates given fields of an existing usuarioEncuesta, field will ignore if it is null + * + * @param id the id of the usuarioEncuesta to save. + * @param usuarioEncuesta the usuarioEncuesta to update. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the updated usuarioEncuesta, + * or with status {@code 400 (Bad Request)} if the usuarioEncuesta is not valid, + * or with status {@code 404 (Not Found)} if the usuarioEncuesta is not found, + * or with status {@code 500 (Internal Server Error)} if the usuarioEncuesta couldn't be updated. + * @throws URISyntaxException if the Location URI syntax is incorrect. + */ + @PatchMapping(value = "/usuario-encuestas/{id}", consumes = "application/merge-patch+json") + public ResponseEntity partialUpdateUsuarioEncuesta( + @PathVariable(value = "id", required = false) final Long id, + @NotNull @RequestBody UsuarioEncuesta usuarioEncuesta + ) throws URISyntaxException { + log.debug("REST request to partial update UsuarioEncuesta partially : {}, {}", id, usuarioEncuesta); + if (usuarioEncuesta.getId() == null) { + throw new BadRequestAlertException("Invalid id", ENTITY_NAME, "idnull"); + } + if (!Objects.equals(id, usuarioEncuesta.getId())) { + throw new BadRequestAlertException("Invalid ID", ENTITY_NAME, "idinvalid"); + } + + if (!usuarioEncuestaRepository.existsById(id)) { + throw new BadRequestAlertException("Entity not found", ENTITY_NAME, "idnotfound"); + } + + Optional result = usuarioEncuestaService.partialUpdate(usuarioEncuesta); + + return ResponseUtil.wrapOrNotFound( + result, + HeaderUtil.createEntityUpdateAlert(applicationName, true, ENTITY_NAME, usuarioEncuesta.getId().toString()) + ); + } + + /** + * {@code GET /usuario-encuestas} : get all the usuarioEncuestas. + * + * @param criteria the criteria which the requested entities should match. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and the list of usuarioEncuestas in body. + */ + @GetMapping("/usuario-encuestas") + public ResponseEntity> getAllUsuarioEncuestas(UsuarioEncuestaCriteria criteria) { + log.debug("REST request to get UsuarioEncuestas by criteria: {}", criteria); + List entityList = usuarioEncuestaQueryService.findByCriteria(criteria); + return ResponseEntity.ok().body(entityList); + } + + /** + * {@code GET /usuario-encuestas/count} : count all the usuarioEncuestas. + * + * @param criteria the criteria which the requested entities should match. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and the count in body. + */ + @GetMapping("/usuario-encuestas/count") + public ResponseEntity countUsuarioEncuestas(UsuarioEncuestaCriteria criteria) { + log.debug("REST request to count UsuarioEncuestas by criteria: {}", criteria); + return ResponseEntity.ok().body(usuarioEncuestaQueryService.countByCriteria(criteria)); + } + + /** + * {@code GET /usuario-encuestas/:id} : get the "id" usuarioEncuesta. + * + * @param id the id of the usuarioEncuesta to retrieve. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the usuarioEncuesta, or with status {@code 404 (Not Found)}. + */ + @GetMapping("/usuario-encuestas/{id}") + public ResponseEntity getUsuarioEncuesta(@PathVariable Long id) { + log.debug("REST request to get UsuarioEncuesta : {}", id); + Optional usuarioEncuesta = usuarioEncuestaService.findOne(id); + return ResponseUtil.wrapOrNotFound(usuarioEncuesta); + } + + /** + * {@code DELETE /usuario-encuestas/:id} : delete the "id" usuarioEncuesta. + * + * @param id the id of the usuarioEncuesta to delete. + * @return the {@link ResponseEntity} with status {@code 204 (NO_CONTENT)}. + */ + @DeleteMapping("/usuario-encuestas/{id}") + public ResponseEntity deleteUsuarioEncuesta(@PathVariable Long id) { + log.debug("REST request to delete UsuarioEncuesta : {}", id); + usuarioEncuestaService.delete(id); + return ResponseEntity + .noContent() + .headers(HeaderUtil.createEntityDeletionAlert(applicationName, true, ENTITY_NAME, id.toString())) + .build(); + } +} diff --git a/src/main/java/org/datasurvey/web/rest/UsuarioExtraResource.java b/src/main/java/org/datasurvey/web/rest/UsuarioExtraResource.java new file mode 100644 index 0000000..9914108 --- /dev/null +++ b/src/main/java/org/datasurvey/web/rest/UsuarioExtraResource.java @@ -0,0 +1,197 @@ +package org.datasurvey.web.rest; + +import java.net.URI; +import java.net.URISyntaxException; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import javax.validation.Valid; +import javax.validation.constraints.NotNull; +import org.datasurvey.domain.UsuarioExtra; +import org.datasurvey.repository.UsuarioExtraRepository; +import org.datasurvey.service.UsuarioExtraQueryService; +import org.datasurvey.service.UsuarioExtraService; +import org.datasurvey.service.criteria.UsuarioExtraCriteria; +import org.datasurvey.web.rest.errors.BadRequestAlertException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import tech.jhipster.web.util.HeaderUtil; +import tech.jhipster.web.util.ResponseUtil; + +/** + * REST controller for managing {@link org.datasurvey.domain.UsuarioExtra}. + */ +@RestController +@RequestMapping("/api") +public class UsuarioExtraResource { + + private final Logger log = LoggerFactory.getLogger(UsuarioExtraResource.class); + + private static final String ENTITY_NAME = "usuarioExtra"; + + @Value("${jhipster.clientApp.name}") + private String applicationName; + + private final UsuarioExtraService usuarioExtraService; + + private final UsuarioExtraRepository usuarioExtraRepository; + + private final UsuarioExtraQueryService usuarioExtraQueryService; + + public UsuarioExtraResource( + UsuarioExtraService usuarioExtraService, + UsuarioExtraRepository usuarioExtraRepository, + UsuarioExtraQueryService usuarioExtraQueryService + ) { + this.usuarioExtraService = usuarioExtraService; + this.usuarioExtraRepository = usuarioExtraRepository; + this.usuarioExtraQueryService = usuarioExtraQueryService; + } + + /** + * {@code POST /usuario-extras} : Create a new usuarioExtra. + * + * @param usuarioExtra the usuarioExtra to create. + * @return the {@link ResponseEntity} with status {@code 201 (Created)} and with body the new usuarioExtra, or with status {@code 400 (Bad Request)} if the usuarioExtra has already an ID. + * @throws URISyntaxException if the Location URI syntax is incorrect. + */ + @PostMapping("/usuario-extras") + public ResponseEntity createUsuarioExtra(@Valid @RequestBody UsuarioExtra usuarioExtra) throws URISyntaxException { + log.debug("REST request to save UsuarioExtra : {}", usuarioExtra); + if (usuarioExtra.getId() != null) { + throw new BadRequestAlertException("A new usuarioExtra cannot already have an ID", ENTITY_NAME, "idexists"); + } + UsuarioExtra result = usuarioExtraService.save(usuarioExtra); + return ResponseEntity + .created(new URI("/api/usuario-extras/" + result.getId())) + .headers(HeaderUtil.createEntityCreationAlert(applicationName, true, ENTITY_NAME, result.getId().toString())) + .body(result); + } + + /** + * {@code PUT /usuario-extras/:id} : Updates an existing usuarioExtra. + * + * @param id the id of the usuarioExtra to save. + * @param usuarioExtra the usuarioExtra to update. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the updated usuarioExtra, + * or with status {@code 400 (Bad Request)} if the usuarioExtra is not valid, + * or with status {@code 500 (Internal Server Error)} if the usuarioExtra couldn't be updated. + * @throws URISyntaxException if the Location URI syntax is incorrect. + */ + @PutMapping("/usuario-extras/{id}") + public ResponseEntity updateUsuarioExtra( + @PathVariable(value = "id", required = false) final Long id, + @Valid @RequestBody UsuarioExtra usuarioExtra + ) throws URISyntaxException { + log.debug("REST request to update UsuarioExtra : {}, {}", id, usuarioExtra); + if (usuarioExtra.getId() == null) { + throw new BadRequestAlertException("Invalid id", ENTITY_NAME, "idnull"); + } + if (!Objects.equals(id, usuarioExtra.getId())) { + throw new BadRequestAlertException("Invalid ID", ENTITY_NAME, "idinvalid"); + } + + if (!usuarioExtraRepository.existsById(id)) { + throw new BadRequestAlertException("Entity not found", ENTITY_NAME, "idnotfound"); + } + + UsuarioExtra result = usuarioExtraService.save(usuarioExtra); + return ResponseEntity + .ok() + .headers(HeaderUtil.createEntityUpdateAlert(applicationName, true, ENTITY_NAME, usuarioExtra.getId().toString())) + .body(result); + } + + /** + * {@code PATCH /usuario-extras/:id} : Partial updates given fields of an existing usuarioExtra, field will ignore if it is null + * + * @param id the id of the usuarioExtra to save. + * @param usuarioExtra the usuarioExtra to update. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the updated usuarioExtra, + * or with status {@code 400 (Bad Request)} if the usuarioExtra is not valid, + * or with status {@code 404 (Not Found)} if the usuarioExtra is not found, + * or with status {@code 500 (Internal Server Error)} if the usuarioExtra couldn't be updated. + * @throws URISyntaxException if the Location URI syntax is incorrect. + */ + @PatchMapping(value = "/usuario-extras/{id}", consumes = "application/merge-patch+json") + public ResponseEntity partialUpdateUsuarioExtra( + @PathVariable(value = "id", required = false) final Long id, + @NotNull @RequestBody UsuarioExtra usuarioExtra + ) throws URISyntaxException { + log.debug("REST request to partial update UsuarioExtra partially : {}, {}", id, usuarioExtra); + if (usuarioExtra.getId() == null) { + throw new BadRequestAlertException("Invalid id", ENTITY_NAME, "idnull"); + } + if (!Objects.equals(id, usuarioExtra.getId())) { + throw new BadRequestAlertException("Invalid ID", ENTITY_NAME, "idinvalid"); + } + + if (!usuarioExtraRepository.existsById(id)) { + throw new BadRequestAlertException("Entity not found", ENTITY_NAME, "idnotfound"); + } + + Optional result = usuarioExtraService.partialUpdate(usuarioExtra); + + return ResponseUtil.wrapOrNotFound( + result, + HeaderUtil.createEntityUpdateAlert(applicationName, true, ENTITY_NAME, usuarioExtra.getId().toString()) + ); + } + + /** + * {@code GET /usuario-extras} : get all the usuarioExtras. + * + * @param criteria the criteria which the requested entities should match. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and the list of usuarioExtras in body. + */ + @GetMapping("/usuario-extras") + public ResponseEntity> getAllUsuarioExtras(UsuarioExtraCriteria criteria) { + log.debug("REST request to get UsuarioExtras by criteria: {}", criteria); + List entityList = usuarioExtraQueryService.findByCriteria(criteria); + return ResponseEntity.ok().body(entityList); + } + + /** + * {@code GET /usuario-extras/count} : count all the usuarioExtras. + * + * @param criteria the criteria which the requested entities should match. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and the count in body. + */ + @GetMapping("/usuario-extras/count") + public ResponseEntity countUsuarioExtras(UsuarioExtraCriteria criteria) { + log.debug("REST request to count UsuarioExtras by criteria: {}", criteria); + return ResponseEntity.ok().body(usuarioExtraQueryService.countByCriteria(criteria)); + } + + /** + * {@code GET /usuario-extras/:id} : get the "id" usuarioExtra. + * + * @param id the id of the usuarioExtra to retrieve. + * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the usuarioExtra, or with status {@code 404 (Not Found)}. + */ + @GetMapping("/usuario-extras/{id}") + public ResponseEntity getUsuarioExtra(@PathVariable Long id) { + log.debug("REST request to get UsuarioExtra : {}", id); + Optional usuarioExtra = usuarioExtraService.findOne(id); + return ResponseUtil.wrapOrNotFound(usuarioExtra); + } + + /** + * {@code DELETE /usuario-extras/:id} : delete the "id" usuarioExtra. + * + * @param id the id of the usuarioExtra to delete. + * @return the {@link ResponseEntity} with status {@code 204 (NO_CONTENT)}. + */ + @DeleteMapping("/usuario-extras/{id}") + public ResponseEntity deleteUsuarioExtra(@PathVariable Long id) { + log.debug("REST request to delete UsuarioExtra : {}", id); + usuarioExtraService.delete(id); + return ResponseEntity + .noContent() + .headers(HeaderUtil.createEntityDeletionAlert(applicationName, true, ENTITY_NAME, id.toString())) + .build(); + } +} diff --git a/src/main/java/org/datasurvey/web/rest/errors/BadRequestAlertException.java b/src/main/java/org/datasurvey/web/rest/errors/BadRequestAlertException.java new file mode 100644 index 0000000..ba20aec --- /dev/null +++ b/src/main/java/org/datasurvey/web/rest/errors/BadRequestAlertException.java @@ -0,0 +1,41 @@ +package org.datasurvey.web.rest.errors; + +import java.net.URI; +import java.util.HashMap; +import java.util.Map; +import org.zalando.problem.AbstractThrowableProblem; +import org.zalando.problem.Status; + +public class BadRequestAlertException extends AbstractThrowableProblem { + + private static final long serialVersionUID = 1L; + + private final String entityName; + + private final String errorKey; + + public BadRequestAlertException(String defaultMessage, String entityName, String errorKey) { + this(ErrorConstants.DEFAULT_TYPE, defaultMessage, entityName, errorKey); + } + + public BadRequestAlertException(URI type, String defaultMessage, String entityName, String errorKey) { + super(type, defaultMessage, Status.BAD_REQUEST, null, null, null, getAlertParameters(entityName, errorKey)); + this.entityName = entityName; + this.errorKey = errorKey; + } + + public String getEntityName() { + return entityName; + } + + public String getErrorKey() { + return errorKey; + } + + private static Map getAlertParameters(String entityName, String errorKey) { + Map parameters = new HashMap<>(); + parameters.put("message", "error." + errorKey); + parameters.put("params", entityName); + return parameters; + } +} diff --git a/src/main/java/org/datasurvey/web/rest/errors/EmailAlreadyUsedException.java b/src/main/java/org/datasurvey/web/rest/errors/EmailAlreadyUsedException.java new file mode 100644 index 0000000..ec10f4f --- /dev/null +++ b/src/main/java/org/datasurvey/web/rest/errors/EmailAlreadyUsedException.java @@ -0,0 +1,10 @@ +package org.datasurvey.web.rest.errors; + +public class EmailAlreadyUsedException extends BadRequestAlertException { + + private static final long serialVersionUID = 1L; + + public EmailAlreadyUsedException() { + super(ErrorConstants.EMAIL_ALREADY_USED_TYPE, "Email is already in use!", "userManagement", "emailexists"); + } +} diff --git a/src/main/java/org/datasurvey/web/rest/errors/ErrorConstants.java b/src/main/java/org/datasurvey/web/rest/errors/ErrorConstants.java new file mode 100644 index 0000000..20df98d --- /dev/null +++ b/src/main/java/org/datasurvey/web/rest/errors/ErrorConstants.java @@ -0,0 +1,17 @@ +package org.datasurvey.web.rest.errors; + +import java.net.URI; + +public final class ErrorConstants { + + public static final String ERR_CONCURRENCY_FAILURE = "error.concurrencyFailure"; + public static final String ERR_VALIDATION = "error.validation"; + public static final String PROBLEM_BASE_URL = "https://www.jhipster.tech/problem"; + public static final URI DEFAULT_TYPE = URI.create(PROBLEM_BASE_URL + "/problem-with-message"); + public static final URI CONSTRAINT_VIOLATION_TYPE = URI.create(PROBLEM_BASE_URL + "/constraint-violation"); + public static final URI INVALID_PASSWORD_TYPE = URI.create(PROBLEM_BASE_URL + "/invalid-password"); + public static final URI EMAIL_ALREADY_USED_TYPE = URI.create(PROBLEM_BASE_URL + "/email-already-used"); + public static final URI LOGIN_ALREADY_USED_TYPE = URI.create(PROBLEM_BASE_URL + "/login-already-used"); + + private ErrorConstants() {} +} diff --git a/src/main/java/org/datasurvey/web/rest/errors/ExceptionTranslator.java b/src/main/java/org/datasurvey/web/rest/errors/ExceptionTranslator.java new file mode 100644 index 0000000..6310378 --- /dev/null +++ b/src/main/java/org/datasurvey/web/rest/errors/ExceptionTranslator.java @@ -0,0 +1,223 @@ +package org.datasurvey.web.rest.errors; + +import java.net.URI; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import javax.servlet.http.HttpServletRequest; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.env.Environment; +import org.springframework.dao.ConcurrencyFailureException; +import org.springframework.dao.DataAccessException; +import org.springframework.http.ResponseEntity; +import org.springframework.http.converter.HttpMessageConversionException; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.context.request.NativeWebRequest; +import org.zalando.problem.DefaultProblem; +import org.zalando.problem.Problem; +import org.zalando.problem.ProblemBuilder; +import org.zalando.problem.Status; +import org.zalando.problem.StatusType; +import org.zalando.problem.spring.web.advice.ProblemHandling; +import org.zalando.problem.spring.web.advice.security.SecurityAdviceTrait; +import org.zalando.problem.violations.ConstraintViolationProblem; +import tech.jhipster.config.JHipsterConstants; +import tech.jhipster.web.util.HeaderUtil; + +/** + * Controller advice to translate the server side exceptions to client-friendly json structures. + * The error response follows RFC7807 - Problem Details for HTTP APIs (https://tools.ietf.org/html/rfc7807). + */ +@ControllerAdvice +public class ExceptionTranslator implements ProblemHandling, SecurityAdviceTrait { + + private static final String FIELD_ERRORS_KEY = "fieldErrors"; + private static final String MESSAGE_KEY = "message"; + private static final String PATH_KEY = "path"; + private static final String VIOLATIONS_KEY = "violations"; + + @Value("${jhipster.clientApp.name}") + private String applicationName; + + private final Environment env; + + public ExceptionTranslator(Environment env) { + this.env = env; + } + + /** + * Post-process the Problem payload to add the message key for the front-end if needed. + */ + @Override + public ResponseEntity process(@Nullable ResponseEntity entity, NativeWebRequest request) { + if (entity == null) { + return null; + } + Problem problem = entity.getBody(); + if (!(problem instanceof ConstraintViolationProblem || problem instanceof DefaultProblem)) { + return entity; + } + + HttpServletRequest nativeRequest = request.getNativeRequest(HttpServletRequest.class); + String requestUri = nativeRequest != null ? nativeRequest.getRequestURI() : StringUtils.EMPTY; + ProblemBuilder builder = Problem + .builder() + .withType(Problem.DEFAULT_TYPE.equals(problem.getType()) ? ErrorConstants.DEFAULT_TYPE : problem.getType()) + .withStatus(problem.getStatus()) + .withTitle(problem.getTitle()) + .with(PATH_KEY, requestUri); + + if (problem instanceof ConstraintViolationProblem) { + builder + .with(VIOLATIONS_KEY, ((ConstraintViolationProblem) problem).getViolations()) + .with(MESSAGE_KEY, ErrorConstants.ERR_VALIDATION); + } else { + builder.withCause(((DefaultProblem) problem).getCause()).withDetail(problem.getDetail()).withInstance(problem.getInstance()); + problem.getParameters().forEach(builder::with); + if (!problem.getParameters().containsKey(MESSAGE_KEY) && problem.getStatus() != null) { + builder.with(MESSAGE_KEY, "error.http." + problem.getStatus().getStatusCode()); + } + } + return new ResponseEntity<>(builder.build(), entity.getHeaders(), entity.getStatusCode()); + } + + @Override + public ResponseEntity handleMethodArgumentNotValid(MethodArgumentNotValidException ex, @Nonnull NativeWebRequest request) { + BindingResult result = ex.getBindingResult(); + List fieldErrors = result + .getFieldErrors() + .stream() + .map( + f -> + new FieldErrorVM( + f.getObjectName().replaceFirst("DTO$", ""), + f.getField(), + StringUtils.isNotBlank(f.getDefaultMessage()) ? f.getDefaultMessage() : f.getCode() + ) + ) + .collect(Collectors.toList()); + + Problem problem = Problem + .builder() + .withType(ErrorConstants.CONSTRAINT_VIOLATION_TYPE) + .withTitle("Method argument not valid") + .withStatus(defaultConstraintViolationStatus()) + .with(MESSAGE_KEY, ErrorConstants.ERR_VALIDATION) + .with(FIELD_ERRORS_KEY, fieldErrors) + .build(); + return create(ex, problem, request); + } + + @ExceptionHandler + public ResponseEntity handleEmailAlreadyUsedException( + org.datasurvey.service.EmailAlreadyUsedException ex, + NativeWebRequest request + ) { + EmailAlreadyUsedException problem = new EmailAlreadyUsedException(); + return create( + problem, + request, + HeaderUtil.createFailureAlert(applicationName, true, problem.getEntityName(), problem.getErrorKey(), problem.getMessage()) + ); + } + + @ExceptionHandler + public ResponseEntity handleUsernameAlreadyUsedException( + org.datasurvey.service.UsernameAlreadyUsedException ex, + NativeWebRequest request + ) { + LoginAlreadyUsedException problem = new LoginAlreadyUsedException(); + return create( + problem, + request, + HeaderUtil.createFailureAlert(applicationName, true, problem.getEntityName(), problem.getErrorKey(), problem.getMessage()) + ); + } + + @ExceptionHandler + public ResponseEntity handleInvalidPasswordException( + org.datasurvey.service.InvalidPasswordException ex, + NativeWebRequest request + ) { + return create(new InvalidPasswordException(), request); + } + + @ExceptionHandler + public ResponseEntity handleBadRequestAlertException(BadRequestAlertException ex, NativeWebRequest request) { + return create( + ex, + request, + HeaderUtil.createFailureAlert(applicationName, true, ex.getEntityName(), ex.getErrorKey(), ex.getMessage()) + ); + } + + @ExceptionHandler + public ResponseEntity handleConcurrencyFailure(ConcurrencyFailureException ex, NativeWebRequest request) { + Problem problem = Problem.builder().withStatus(Status.CONFLICT).with(MESSAGE_KEY, ErrorConstants.ERR_CONCURRENCY_FAILURE).build(); + return create(ex, problem, request); + } + + @Override + public ProblemBuilder prepare(final Throwable throwable, final StatusType status, final URI type) { + Collection activeProfiles = Arrays.asList(env.getActiveProfiles()); + + if (activeProfiles.contains(JHipsterConstants.SPRING_PROFILE_PRODUCTION)) { + if (throwable instanceof HttpMessageConversionException) { + return Problem + .builder() + .withType(type) + .withTitle(status.getReasonPhrase()) + .withStatus(status) + .withDetail("Unable to convert http message") + .withCause( + Optional.ofNullable(throwable.getCause()).filter(cause -> isCausalChainsEnabled()).map(this::toProblem).orElse(null) + ); + } + if (throwable instanceof DataAccessException) { + return Problem + .builder() + .withType(type) + .withTitle(status.getReasonPhrase()) + .withStatus(status) + .withDetail("Failure during data access") + .withCause( + Optional.ofNullable(throwable.getCause()).filter(cause -> isCausalChainsEnabled()).map(this::toProblem).orElse(null) + ); + } + if (containsPackageName(throwable.getMessage())) { + return Problem + .builder() + .withType(type) + .withTitle(status.getReasonPhrase()) + .withStatus(status) + .withDetail("Unexpected runtime exception") + .withCause( + Optional.ofNullable(throwable.getCause()).filter(cause -> isCausalChainsEnabled()).map(this::toProblem).orElse(null) + ); + } + } + + return Problem + .builder() + .withType(type) + .withTitle(status.getReasonPhrase()) + .withStatus(status) + .withDetail(throwable.getMessage()) + .withCause( + Optional.ofNullable(throwable.getCause()).filter(cause -> isCausalChainsEnabled()).map(this::toProblem).orElse(null) + ); + } + + private boolean containsPackageName(String message) { + // This list is for sure not complete + return StringUtils.containsAny(message, "org.", "java.", "net.", "javax.", "com.", "io.", "de.", "org.datasurvey"); + } +} diff --git a/src/main/java/org/datasurvey/web/rest/errors/FieldErrorVM.java b/src/main/java/org/datasurvey/web/rest/errors/FieldErrorVM.java new file mode 100644 index 0000000..2976b98 --- /dev/null +++ b/src/main/java/org/datasurvey/web/rest/errors/FieldErrorVM.java @@ -0,0 +1,32 @@ +package org.datasurvey.web.rest.errors; + +import java.io.Serializable; + +public class FieldErrorVM implements Serializable { + + private static final long serialVersionUID = 1L; + + private final String objectName; + + private final String field; + + private final String message; + + public FieldErrorVM(String dto, String field, String message) { + this.objectName = dto; + this.field = field; + this.message = message; + } + + public String getObjectName() { + return objectName; + } + + public String getField() { + return field; + } + + public String getMessage() { + return message; + } +} diff --git a/src/main/java/org/datasurvey/web/rest/errors/InvalidPasswordException.java b/src/main/java/org/datasurvey/web/rest/errors/InvalidPasswordException.java new file mode 100644 index 0000000..901e94b --- /dev/null +++ b/src/main/java/org/datasurvey/web/rest/errors/InvalidPasswordException.java @@ -0,0 +1,13 @@ +package org.datasurvey.web.rest.errors; + +import org.zalando.problem.AbstractThrowableProblem; +import org.zalando.problem.Status; + +public class InvalidPasswordException extends AbstractThrowableProblem { + + private static final long serialVersionUID = 1L; + + public InvalidPasswordException() { + super(ErrorConstants.INVALID_PASSWORD_TYPE, "Incorrect password", Status.BAD_REQUEST); + } +} diff --git a/src/main/java/org/datasurvey/web/rest/errors/LoginAlreadyUsedException.java b/src/main/java/org/datasurvey/web/rest/errors/LoginAlreadyUsedException.java new file mode 100644 index 0000000..15b6956 --- /dev/null +++ b/src/main/java/org/datasurvey/web/rest/errors/LoginAlreadyUsedException.java @@ -0,0 +1,10 @@ +package org.datasurvey.web.rest.errors; + +public class LoginAlreadyUsedException extends BadRequestAlertException { + + private static final long serialVersionUID = 1L; + + public LoginAlreadyUsedException() { + super(ErrorConstants.LOGIN_ALREADY_USED_TYPE, "Login name already used!", "userManagement", "userexists"); + } +} diff --git a/src/main/java/org/datasurvey/web/rest/errors/package-info.java b/src/main/java/org/datasurvey/web/rest/errors/package-info.java new file mode 100644 index 0000000..951a2d5 --- /dev/null +++ b/src/main/java/org/datasurvey/web/rest/errors/package-info.java @@ -0,0 +1,6 @@ +/** + * Specific errors used with Zalando's "problem-spring-web" library. + * + * More information on https://github.com/zalando/problem-spring-web + */ +package org.datasurvey.web.rest.errors; diff --git a/src/main/java/org/datasurvey/web/rest/package-info.java b/src/main/java/org/datasurvey/web/rest/package-info.java new file mode 100644 index 0000000..fd565b2 --- /dev/null +++ b/src/main/java/org/datasurvey/web/rest/package-info.java @@ -0,0 +1,4 @@ +/** + * Spring MVC REST controllers. + */ +package org.datasurvey.web.rest; diff --git a/src/main/java/org/datasurvey/web/rest/vm/KeyAndPasswordVM.java b/src/main/java/org/datasurvey/web/rest/vm/KeyAndPasswordVM.java new file mode 100644 index 0000000..69fc5df --- /dev/null +++ b/src/main/java/org/datasurvey/web/rest/vm/KeyAndPasswordVM.java @@ -0,0 +1,27 @@ +package org.datasurvey.web.rest.vm; + +/** + * View Model object for storing the user's key and password. + */ +public class KeyAndPasswordVM { + + private String key; + + private String newPassword; + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getNewPassword() { + return newPassword; + } + + public void setNewPassword(String newPassword) { + this.newPassword = newPassword; + } +} diff --git a/src/main/java/org/datasurvey/web/rest/vm/LoginVM.java b/src/main/java/org/datasurvey/web/rest/vm/LoginVM.java new file mode 100644 index 0000000..af3702c --- /dev/null +++ b/src/main/java/org/datasurvey/web/rest/vm/LoginVM.java @@ -0,0 +1,53 @@ +package org.datasurvey.web.rest.vm; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +/** + * View Model object for storing a user's credentials. + */ +public class LoginVM { + + @NotNull + @Size(min = 1, max = 50) + private String username; + + @NotNull + @Size(min = 4, max = 100) + private String password; + + private boolean rememberMe; + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public boolean isRememberMe() { + return rememberMe; + } + + public void setRememberMe(boolean rememberMe) { + this.rememberMe = rememberMe; + } + + // prettier-ignore + @Override + public String toString() { + return "LoginVM{" + + "username='" + username + '\'' + + ", rememberMe=" + rememberMe + + '}'; + } +} diff --git a/src/main/java/org/datasurvey/web/rest/vm/ManagedUserVM.java b/src/main/java/org/datasurvey/web/rest/vm/ManagedUserVM.java new file mode 100644 index 0000000..3775b3f --- /dev/null +++ b/src/main/java/org/datasurvey/web/rest/vm/ManagedUserVM.java @@ -0,0 +1,35 @@ +package org.datasurvey.web.rest.vm; + +import javax.validation.constraints.Size; +import org.datasurvey.service.dto.AdminUserDTO; + +/** + * View Model extending the AdminUserDTO, which is meant to be used in the user management UI. + */ +public class ManagedUserVM extends AdminUserDTO { + + public static final int PASSWORD_MIN_LENGTH = 4; + + public static final int PASSWORD_MAX_LENGTH = 100; + + @Size(min = PASSWORD_MIN_LENGTH, max = PASSWORD_MAX_LENGTH) + private String password; + + public ManagedUserVM() { + // Empty constructor needed for Jackson. + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + // prettier-ignore + @Override + public String toString() { + return "ManagedUserVM{" + super.toString() + "} "; + } +} diff --git a/src/main/java/org/datasurvey/web/rest/vm/package-info.java b/src/main/java/org/datasurvey/web/rest/vm/package-info.java new file mode 100644 index 0000000..4a3d2d0 --- /dev/null +++ b/src/main/java/org/datasurvey/web/rest/vm/package-info.java @@ -0,0 +1,4 @@ +/** + * View Models used by Spring MVC REST controllers. + */ +package org.datasurvey.web.rest.vm; diff --git a/src/main/java/org/datasurvey/web/websocket/ActivityService.java b/src/main/java/org/datasurvey/web/websocket/ActivityService.java new file mode 100644 index 0000000..c16292c --- /dev/null +++ b/src/main/java/org/datasurvey/web/websocket/ActivityService.java @@ -0,0 +1,46 @@ +package org.datasurvey.web.websocket; + +import static org.datasurvey.config.WebsocketConfiguration.IP_ADDRESS; + +import java.security.Principal; +import java.time.Instant; +import org.datasurvey.web.websocket.dto.ActivityDTO; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.ApplicationListener; +import org.springframework.messaging.handler.annotation.*; +import org.springframework.messaging.simp.SimpMessageSendingOperations; +import org.springframework.messaging.simp.stomp.StompHeaderAccessor; +import org.springframework.stereotype.Controller; +import org.springframework.web.socket.messaging.SessionDisconnectEvent; + +@Controller +public class ActivityService implements ApplicationListener { + + private static final Logger log = LoggerFactory.getLogger(ActivityService.class); + + private final SimpMessageSendingOperations messagingTemplate; + + public ActivityService(SimpMessageSendingOperations messagingTemplate) { + this.messagingTemplate = messagingTemplate; + } + + @MessageMapping("/topic/activity") + @SendTo("/topic/tracker") + public ActivityDTO sendActivity(@Payload ActivityDTO activityDTO, StompHeaderAccessor stompHeaderAccessor, Principal principal) { + activityDTO.setUserLogin(principal.getName()); + activityDTO.setSessionId(stompHeaderAccessor.getSessionId()); + activityDTO.setIpAddress(stompHeaderAccessor.getSessionAttributes().get(IP_ADDRESS).toString()); + activityDTO.setTime(Instant.now()); + log.debug("Sending user tracking data {}", activityDTO); + return activityDTO; + } + + @Override + public void onApplicationEvent(SessionDisconnectEvent event) { + ActivityDTO activityDTO = new ActivityDTO(); + activityDTO.setSessionId(event.getSessionId()); + activityDTO.setPage("logout"); + messagingTemplate.convertAndSend("/topic/tracker", activityDTO); + } +} diff --git a/src/main/java/org/datasurvey/web/websocket/dto/ActivityDTO.java b/src/main/java/org/datasurvey/web/websocket/dto/ActivityDTO.java new file mode 100644 index 0000000..13c829c --- /dev/null +++ b/src/main/java/org/datasurvey/web/websocket/dto/ActivityDTO.java @@ -0,0 +1,71 @@ +package org.datasurvey.web.websocket.dto; + +import java.time.Instant; + +/** + * DTO for storing a user's activity. + */ +public class ActivityDTO { + + private String sessionId; + + private String userLogin; + + private String ipAddress; + + private String page; + + private Instant time; + + public String getSessionId() { + return sessionId; + } + + public void setSessionId(String sessionId) { + this.sessionId = sessionId; + } + + public String getUserLogin() { + return userLogin; + } + + public void setUserLogin(String userLogin) { + this.userLogin = userLogin; + } + + public String getIpAddress() { + return ipAddress; + } + + public void setIpAddress(String ipAddress) { + this.ipAddress = ipAddress; + } + + public String getPage() { + return page; + } + + public void setPage(String page) { + this.page = page; + } + + public Instant getTime() { + return time; + } + + public void setTime(Instant time) { + this.time = time; + } + + // prettier-ignore + @Override + public String toString() { + return "ActivityDTO{" + + "sessionId='" + sessionId + '\'' + + ", userLogin='" + userLogin + '\'' + + ", ipAddress='" + ipAddress + '\'' + + ", page='" + page + '\'' + + ", time='" + time + '\'' + + '}'; + } +} diff --git a/src/main/java/org/datasurvey/web/websocket/dto/package-info.java b/src/main/java/org/datasurvey/web/websocket/dto/package-info.java new file mode 100644 index 0000000..9d170ea --- /dev/null +++ b/src/main/java/org/datasurvey/web/websocket/dto/package-info.java @@ -0,0 +1,4 @@ +/** + * Data Access Objects used by WebSocket services. + */ +package org.datasurvey.web.websocket.dto; diff --git a/src/main/java/org/datasurvey/web/websocket/package-info.java b/src/main/java/org/datasurvey/web/websocket/package-info.java new file mode 100644 index 0000000..602ab3e --- /dev/null +++ b/src/main/java/org/datasurvey/web/websocket/package-info.java @@ -0,0 +1,4 @@ +/** + * WebSocket services, using Spring Websocket. + */ +package org.datasurvey.web.websocket; diff --git a/src/main/resources/banner.txt b/src/main/resources/banner.txt new file mode 100644 index 0000000..e0bc55a --- /dev/null +++ b/src/main/resources/banner.txt @@ -0,0 +1,10 @@ + + ${AnsiColor.GREEN} ā–ˆā–ˆā•—${AnsiColor.RED} ā–ˆā–ˆā•— ā–ˆā–ˆā•— ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā•— ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā•— ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā•— ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā•— ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā•— ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā•— + ${AnsiColor.GREEN} ā–ˆā–ˆā•‘${AnsiColor.RED} ā–ˆā–ˆā•‘ ā–ˆā–ˆā•‘ ā•šā•ā•ā–ˆā–ˆā•”ā•ā•ā• ā–ˆā–ˆā•”ā•ā•ā•ā–ˆā–ˆā•— ā–ˆā–ˆā•”ā•ā•ā•ā•ā• ā•šā•ā•ā–ˆā–ˆā•”ā•ā•ā• ā–ˆā–ˆā•”ā•ā•ā•ā•ā•ā• ā–ˆā–ˆā•”ā•ā•ā•ā–ˆā–ˆā•— + ${AnsiColor.GREEN} ā–ˆā–ˆā•‘${AnsiColor.RED} ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā•‘ ā–ˆā–ˆā•‘ ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā•”ā• ā•šā–ˆā–ˆā–ˆā–ˆā–ˆā•— ā–ˆā–ˆā•‘ ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā•— ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā•”ā• + ${AnsiColor.GREEN}ā–ˆā–ˆā•— ā–ˆā–ˆā•‘${AnsiColor.RED} ā–ˆā–ˆā•”ā•ā•ā•ā–ˆā–ˆā•‘ ā–ˆā–ˆā•‘ ā–ˆā–ˆā•”ā•ā•ā•ā•ā• ā•šā•ā•ā•ā–ˆā–ˆā•— ā–ˆā–ˆā•‘ ā–ˆā–ˆā•”ā•ā•ā•ā• ā–ˆā–ˆā•”ā•ā•ā–ˆā–ˆā•‘ + ${AnsiColor.GREEN}ā•šā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā•”ā•${AnsiColor.RED} ā–ˆā–ˆā•‘ ā–ˆā–ˆā•‘ ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā•— ā–ˆā–ˆā•‘ ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā•”ā• ā–ˆā–ˆā•‘ ā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā–ˆā•— ā–ˆā–ˆā•‘ ā•šā–ˆā–ˆā•— + ${AnsiColor.GREEN} ā•šā•ā•ā•ā•ā•ā• ${AnsiColor.RED} ā•šā•ā• ā•šā•ā• ā•šā•ā•ā•ā•ā•ā•ā•ā• ā•šā•ā• ā•šā•ā•ā•ā•ā•ā• ā•šā•ā• ā•šā•ā•ā•ā•ā•ā•ā•ā• ā•šā•ā• ā•šā•ā• + +${AnsiColor.BRIGHT_BLUE}:: JHipster šŸ¤“ :: Running Spring Boot ${spring-boot.version} :: +:: https://www.jhipster.tech ::${AnsiColor.DEFAULT} diff --git a/src/main/resources/config/application-dev.yml b/src/main/resources/config/application-dev.yml new file mode 100644 index 0000000..8d8460b --- /dev/null +++ b/src/main/resources/config/application-dev.yml @@ -0,0 +1,115 @@ +# =================================================================== +# Spring Boot configuration for the "dev" profile. +# +# This configuration overrides the application.yml file. +# +# More information on profiles: https://www.jhipster.tech/profiles/ +# More information on configuration properties: https://www.jhipster.tech/common-application-properties/ +# =================================================================== + +# =================================================================== +# Standard Spring Boot properties. +# Full reference is available at: +# http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html +# =================================================================== + +logging: + level: + ROOT: DEBUG + tech.jhipster: DEBUG + org.hibernate.SQL: DEBUG + org.datasurvey: DEBUG + +spring: + devtools: + restart: + enabled: true + additional-exclude: static/** + livereload: + enabled: false # we use Webpack dev server + BrowserSync for livereload + jackson: + serialization: + indent-output: true + datasource: + type: com.zaxxer.hikari.HikariDataSource + url: jdbc:mysql://localhost:3306/datasurveydev?useUnicode=true&characterEncoding=utf8&useSSL=false&useLegacyDatetimeCode=false&serverTimezone=UTC&createDatabaseIfNotExist=true + username: root + password: password + hikari: + poolName: Hikari + auto-commit: false + data-source-properties: + cachePrepStmts: true + prepStmtCacheSize: 250 + prepStmtCacheSqlLimit: 2048 + useServerPrepStmts: true + jpa: + liquibase: + # Remove 'faker' if you do not want the sample data to be loaded automatically + contexts: dev, faker + mail: + host: smtp.gmail.com + port: 587 + username: ${MAIL_USERNAME} + password: ${MAIL_PASSWORD} + protocol: smtp + properties.mail.smtp: + auth: true + starttls.enable: true + ssl.trust: smtp.gmail.com + tls: true + messages: + cache-duration: PT1S # 1 second, see the ISO 8601 standard + thymeleaf: + cache: false + +server: + port: 8080 + +# =================================================================== +# JHipster specific properties +# +# Full reference is available at: https://www.jhipster.tech/common-application-properties/ +# =================================================================== + +jhipster: + cache: # Cache configuration + ehcache: # Ehcache configuration + time-to-live-seconds: 3600 # By default objects stay 1 hour in the cache + max-entries: 100 # Number of objects in each cache entry + # CORS is only enabled by default with the "dev" profile + cors: + # Allow Ionic for JHipster by default (* no longer allowed in Spring Boot 2.4+) + allowed-origins: 'http://localhost:8100,http://localhost:9000,http://localhost:4200' + allowed-methods: '*' + allowed-headers: '*' + exposed-headers: 'Authorization,Link,X-Total-Count,X-${jhipster.clientApp.name}-alert,X-${jhipster.clientApp.name}-error,X-${jhipster.clientApp.name}-params' + allow-credentials: true + max-age: 1800 + security: + authentication: + jwt: + # This token must be encoded using Base64 and be at least 256 bits long (you can type `openssl rand -base64 64` on your command line to generate a 512 bits one) + base64-secret: ZjRmZGRhNzFhNDI5OTRmYjkzZmQ0NzI5Yzc3YTYyODBkMjFjZGY1OWMwNzY5YTJkOTA1ZDY3YzE1MWEwMGRkYzg4ZTNlOGUwNTAzMzdiMWVjNDA4NjFiY2JhNTNhYzhkZjQ3N2MyMmY5YzA5ZTFiNzIzMjJjMTg4MmFlNTUyOTY= + # Token is valid 24 hours + token-validity-in-seconds: 86400 + token-validity-in-seconds-for-remember-me: 2592000 + mail: # specific JHipster mail property, for standard properties see MailProperties + base-url: http://127.0.0.1:8080 + logging: + use-json-format: false # By default, logs are not in Json format + logstash: # Forward logs to logstash over a socket, used by LoggingConfiguration + enabled: false + host: localhost + port: 5000 + queue-size: 512 +# =================================================================== +# Application specific properties +# Add your own application properties here, see the ApplicationProperties class +# to have type-safe configuration, like in the JHipsterProperties above +# +# More documentation is available at: +# https://www.jhipster.tech/common-application-properties/ +# =================================================================== + +# application: diff --git a/src/main/resources/config/application-prod.yml b/src/main/resources/config/application-prod.yml new file mode 100644 index 0000000..fdd0976 --- /dev/null +++ b/src/main/resources/config/application-prod.yml @@ -0,0 +1,136 @@ +# =================================================================== +# Spring Boot configuration for the "prod" profile. +# +# This configuration overrides the application.yml file. +# +# More information on profiles: https://www.jhipster.tech/profiles/ +# More information on configuration properties: https://www.jhipster.tech/common-application-properties/ +# =================================================================== + +# =================================================================== +# Standard Spring Boot properties. +# Full reference is available at: +# http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html +# =================================================================== + +logging: + level: + ROOT: INFO + tech.jhipster: INFO + org.datasurvey: INFO + +management: + metrics: + export: + prometheus: + enabled: false + +spring: + devtools: + restart: + enabled: false + livereload: + enabled: false + datasource: + type: com.zaxxer.hikari.HikariDataSource + url: jdbc:mysql://${DB_HOST}:3306/${DB_NAME}?useUnicode=true&characterEncoding=utf8&useSSL=true&useLegacyDatetimeCode=false&serverTimezone=UTC&createDatabaseIfNotExist=true + username: ${DB_USERNAME} + password: ${DB_PASSWORD} + hikari: + poolName: Hikari + auto-commit: false + data-source-properties: + cachePrepStmts: true + prepStmtCacheSize: 250 + prepStmtCacheSqlLimit: 2048 + useServerPrepStmts: true + jpa: + # Replace by 'prod, faker' to add the faker context and have sample data loaded in production + liquibase: + contexts: prod + mail: + host: smtp.gmail.com + port: 587 + username: ${MAIL_USERNAME} + password: ${MAIL_PASSWORD} + protocol: smtp + properties.mail.smtp: + auth: true + starttls.enable: true + ssl.trust: smtp.gmail.com + tls: true + thymeleaf: + cache: true + +# =================================================================== +# To enable TLS in production, generate a certificate using: +# keytool -genkey -alias datasurvey -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 3650 +# +# You can also use Let's Encrypt: +# https://maximilian-boehm.com/hp2121/Create-a-Java-Keystore-JKS-from-Let-s-Encrypt-Certificates.htm +# +# Then, modify the server.ssl properties so your "server" configuration looks like: +# +# server: +# port: 443 +# ssl: +# key-store: classpath:config/tls/keystore.p12 +# key-store-password: password +# key-store-type: PKCS12 +# key-alias: selfsigned +# # The ciphers suite enforce the security by deactivating some old and deprecated SSL cipher, this list was tested against SSL Labs (https://www.ssllabs.com/ssltest/) +# ciphers: TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 ,TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 ,TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 ,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_DHE_RSA_WITH_AES_128_CBC_SHA256,TLS_DHE_RSA_WITH_AES_128_CBC_SHA,TLS_DHE_RSA_WITH_AES_256_CBC_SHA256,TLS_DHE_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_128_GCM_SHA256,TLS_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA,TLS_RSA_WITH_CAMELLIA_256_CBC_SHA,TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA,TLS_RSA_WITH_CAMELLIA_128_CBC_SHA +# =================================================================== +server: + port: 8080 + shutdown: graceful # see https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-graceful-shutdown + compression: + enabled: true + mime-types: text/html,text/xml,text/plain,text/css, application/javascript, application/json + min-response-size: 1024 + +# =================================================================== +# JHipster specific properties +# +# Full reference is available at: https://www.jhipster.tech/common-application-properties/ +# =================================================================== + +jhipster: + http: + cache: # Used by the CachingHttpHeadersFilter + timeToLiveInDays: 1461 + cache: # Cache configuration + ehcache: # Ehcache configuration + time-to-live-seconds: 3600 # By default objects stay 1 hour in the cache + max-entries: 1000 # Number of objects in each cache entry + security: + authentication: + jwt: + # This token must be encoded using Base64 and be at least 256 bits long (you can type `openssl rand -base64 64` on your command line to generate a 512 bits one) + # As this is the PRODUCTION configuration, you MUST change the default key, and store it securely: + # - In the JHipster Registry (which includes a Spring Cloud Config server) + # - In a separate `application-prod.yml` file, in the same folder as your executable JAR file + # - In the `JHIPSTER_SECURITY_AUTHENTICATION_JWT_BASE64_SECRET` environment variable + base64-secret: ZjRmZGRhNzFhNDI5OTRmYjkzZmQ0NzI5Yzc3YTYyODBkMjFjZGY1OWMwNzY5YTJkOTA1ZDY3YzE1MWEwMGRkYzg4ZTNlOGUwNTAzMzdiMWVjNDA4NjFiY2JhNTNhYzhkZjQ3N2MyMmY5YzA5ZTFiNzIzMjJjMTg4MmFlNTUyOTY= + # Token is valid 24 hours + token-validity-in-seconds: 86400 + token-validity-in-seconds-for-remember-me: 2592000 + mail: # specific JHipster mail property, for standard properties see MailProperties + base-url: http://my-server-url-to-change # Modify according to your server's URL + logging: + use-json-format: false # By default, logs are not in Json format + logstash: # Forward logs to logstash over a socket, used by LoggingConfiguration + enabled: false + host: localhost + port: 5000 + queue-size: 512 +# =================================================================== +# Application specific properties +# Add your own application properties here, see the ApplicationProperties class +# to have type-safe configuration, like in the JHipsterProperties above +# +# More documentation is available at: +# https://www.jhipster.tech/common-application-properties/ +# =================================================================== + +# application: diff --git a/src/main/resources/config/application-tls.yml b/src/main/resources/config/application-tls.yml new file mode 100644 index 0000000..27c9cd8 --- /dev/null +++ b/src/main/resources/config/application-tls.yml @@ -0,0 +1,19 @@ +# =================================================================== +# Activate this profile to enable TLS and HTTP/2. +# +# JHipster has generated a self-signed certificate, which will be used to encrypt traffic. +# As your browser will not understand this certificate, you will need to import it. +# +# Another (easiest) solution with Chrome is to enable the "allow-insecure-localhost" flag +# at chrome://flags/#allow-insecure-localhost +# =================================================================== +server: + ssl: + key-store: classpath:config/tls/keystore.p12 + key-store-password: password + key-store-type: PKCS12 + key-alias: selfsigned + ciphers: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_256_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 + enabled-protocols: TLSv1.2 + http2: + enabled: true diff --git a/src/main/resources/config/application.yml b/src/main/resources/config/application.yml new file mode 100644 index 0000000..88c68f4 --- /dev/null +++ b/src/main/resources/config/application.yml @@ -0,0 +1,182 @@ +# =================================================================== +# Spring Boot configuration. +# +# This configuration will be overridden by the Spring profile you use, +# for example application-dev.yml if you use the "dev" profile. +# +# More information on profiles: https://www.jhipster.tech/profiles/ +# More information on configuration properties: https://www.jhipster.tech/common-application-properties/ +# =================================================================== + +# =================================================================== +# Standard Spring Boot properties. +# Full reference is available at: +# http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html +# =================================================================== + +management: + endpoints: + web: + base-path: /management + exposure: + include: + ['configprops', 'env', 'health', 'info', 'jhimetrics', 'logfile', 'loggers', 'prometheus', 'threaddump', 'caches', 'liquibase'] + endpoint: + health: + show-details: when_authorized + roles: 'ROLE_ADMIN' + probes: + enabled: true + jhimetrics: + enabled: true + info: + git: + mode: full + health: + group: + liveness: + include: livenessState + readiness: + include: readinessState,datasource + mail: + enabled: false # When using the MailService, configure an SMTP server and set this to true + metrics: + export: + # Prometheus is the default metrics backend + prometheus: + enabled: true + step: 60 + enable: + http: true + jvm: true + logback: true + process: true + system: true + distribution: + percentiles-histogram: + all: true + percentiles: + all: 0, 0.5, 0.75, 0.95, 0.99, 1.0 + tags: + application: ${spring.application.name} + web: + server: + request: + autotime: + enabled: true + +spring: + application: + name: DataSurvey + profiles: + # The commented value for `active` can be replaced with valid Spring profiles to load. + # Otherwise, it will be filled in by maven when building the JAR file + # Either way, it can be overridden by `--spring.profiles.active` value passed in the commandline or `-Dspring.profiles.active` set in `JAVA_OPTS` + active: #spring.profiles.active# + group: + dev: + - dev + - api-docs + # Uncomment to activate TLS for the dev profile + #- tls + jmx: + enabled: false + data: + jpa: + repositories: + bootstrap-mode: deferred + jpa: + open-in-view: false + properties: + hibernate.jdbc.time_zone: UTC + hibernate.id.new_generator_mappings: true + hibernate.connection.provider_disables_autocommit: true + hibernate.cache.use_second_level_cache: true + hibernate.cache.use_query_cache: false + hibernate.generate_statistics: false + # modify batch size as necessary + hibernate.jdbc.batch_size: 25 + hibernate.order_inserts: true + hibernate.order_updates: true + hibernate.query.fail_on_pagination_over_collection_fetch: true + hibernate.query.in_clause_parameter_padding: true + hibernate: + ddl-auto: none + naming: + physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy + implicit-strategy: org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy + messages: + basename: i18n/messages + main: + allow-bean-definition-overriding: true + task: + execution: + thread-name-prefix: data-survey-task- + pool: + core-size: 2 + max-size: 50 + queue-capacity: 10000 + scheduling: + thread-name-prefix: data-survey-scheduling- + pool: + size: 2 + thymeleaf: + mode: HTML + output: + ansi: + console-available: true + +server: + servlet: + session: + cookie: + http-only: true + +# Properties to be exposed on the /info management endpoint +info: + # Comma separated list of profiles that will trigger the ribbon to show + display-ribbon-on-profiles: 'dev' + +# =================================================================== +# JHipster specific properties +# +# Full reference is available at: https://www.jhipster.tech/common-application-properties/ +# =================================================================== + +jhipster: + clientApp: + name: 'dataSurveyApp' + # By default CORS is disabled. Uncomment to enable. + # cors: + # allowed-origins: "http://localhost:8100,http://localhost:9000" + # allowed-methods: "*" + # allowed-headers: "*" + # exposed-headers: "Authorization,Link,X-Total-Count,X-${jhipster.clientApp.name}-alert,X-${jhipster.clientApp.name}-error,X-${jhipster.clientApp.name}-params" + # allow-credentials: true + # max-age: 1800 + mail: + from: DataSurvey@localhost + api-docs: + default-include-pattern: ${server.servlet.context-path:}/api/.* + management-include-pattern: ${server.servlet.context-path:}/management/.* + title: DataSurvey API + description: DataSurvey API documentation + version: 0.0.1 + terms-of-service-url: + contact-name: + contact-url: + contact-email: + license: unlicensed + license-url: + security: + content-security-policy: "default-src 'self'; frame-src 'self' data:; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://storage.googleapis.com; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self' data:" +# =================================================================== +# Application specific properties +# Add your own application properties here, see the ApplicationProperties class +# to have type-safe configuration, like in the JHipsterProperties above +# +# More documentation is available at: +# https://www.jhipster.tech/common-application-properties/ +# =================================================================== + +# application: diff --git a/src/main/resources/config/liquibase/changelog/00000000000000_initial_schema.xml b/src/main/resources/config/liquibase/changelog/00000000000000_initial_schema.xml new file mode 100644 index 0000000..271baea --- /dev/null +++ b/src/main/resources/config/liquibase/changelog/00000000000000_initial_schema.xml @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/config/liquibase/changelog/20210703210919_added_entity_ParametroAplicacion.xml b/src/main/resources/config/liquibase/changelog/20210703210919_added_entity_ParametroAplicacion.xml new file mode 100644 index 0000000..19dcd39 --- /dev/null +++ b/src/main/resources/config/liquibase/changelog/20210703210919_added_entity_ParametroAplicacion.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/config/liquibase/changelog/20210703210920_added_entity_UsuarioExtra.xml b/src/main/resources/config/liquibase/changelog/20210703210920_added_entity_UsuarioExtra.xml new file mode 100644 index 0000000..3e3ea32 --- /dev/null +++ b/src/main/resources/config/liquibase/changelog/20210703210920_added_entity_UsuarioExtra.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/config/liquibase/changelog/20210703210920_added_entity_constraints_UsuarioExtra.xml b/src/main/resources/config/liquibase/changelog/20210703210920_added_entity_constraints_UsuarioExtra.xml new file mode 100644 index 0000000..e999de8 --- /dev/null +++ b/src/main/resources/config/liquibase/changelog/20210703210920_added_entity_constraints_UsuarioExtra.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + diff --git a/src/main/resources/config/liquibase/changelog/20210703210921_added_entity_Encuesta.xml b/src/main/resources/config/liquibase/changelog/20210703210921_added_entity_Encuesta.xml new file mode 100644 index 0000000..fd9ec65 --- /dev/null +++ b/src/main/resources/config/liquibase/changelog/20210703210921_added_entity_Encuesta.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/config/liquibase/changelog/20210703210921_added_entity_constraints_Encuesta.xml b/src/main/resources/config/liquibase/changelog/20210703210921_added_entity_constraints_Encuesta.xml new file mode 100644 index 0000000..9a10e39 --- /dev/null +++ b/src/main/resources/config/liquibase/changelog/20210703210921_added_entity_constraints_Encuesta.xml @@ -0,0 +1,23 @@ + + + + + + + + + + diff --git a/src/main/resources/config/liquibase/changelog/20210703210922_added_entity_EPreguntaAbierta.xml b/src/main/resources/config/liquibase/changelog/20210703210922_added_entity_EPreguntaAbierta.xml new file mode 100644 index 0000000..532c28e --- /dev/null +++ b/src/main/resources/config/liquibase/changelog/20210703210922_added_entity_EPreguntaAbierta.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/config/liquibase/changelog/20210703210922_added_entity_constraints_EPreguntaAbierta.xml b/src/main/resources/config/liquibase/changelog/20210703210922_added_entity_constraints_EPreguntaAbierta.xml new file mode 100644 index 0000000..8f2010d --- /dev/null +++ b/src/main/resources/config/liquibase/changelog/20210703210922_added_entity_constraints_EPreguntaAbierta.xml @@ -0,0 +1,17 @@ + + + + + + + + diff --git a/src/main/resources/config/liquibase/changelog/20210703210923_added_entity_EPreguntaAbiertaRespuesta.xml b/src/main/resources/config/liquibase/changelog/20210703210923_added_entity_EPreguntaAbiertaRespuesta.xml new file mode 100644 index 0000000..fbfedbf --- /dev/null +++ b/src/main/resources/config/liquibase/changelog/20210703210923_added_entity_EPreguntaAbiertaRespuesta.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/config/liquibase/changelog/20210703210923_added_entity_constraints_EPreguntaAbiertaRespuesta.xml b/src/main/resources/config/liquibase/changelog/20210703210923_added_entity_constraints_EPreguntaAbiertaRespuesta.xml new file mode 100644 index 0000000..787cb3f --- /dev/null +++ b/src/main/resources/config/liquibase/changelog/20210703210923_added_entity_constraints_EPreguntaAbiertaRespuesta.xml @@ -0,0 +1,17 @@ + + + + + + + + diff --git a/src/main/resources/config/liquibase/changelog/20210703210924_added_entity_EPreguntaCerrada.xml b/src/main/resources/config/liquibase/changelog/20210703210924_added_entity_EPreguntaCerrada.xml new file mode 100644 index 0000000..6d5ff7c --- /dev/null +++ b/src/main/resources/config/liquibase/changelog/20210703210924_added_entity_EPreguntaCerrada.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/config/liquibase/changelog/20210703210924_added_entity_constraints_EPreguntaCerrada.xml b/src/main/resources/config/liquibase/changelog/20210703210924_added_entity_constraints_EPreguntaCerrada.xml new file mode 100644 index 0000000..8b9a613 --- /dev/null +++ b/src/main/resources/config/liquibase/changelog/20210703210924_added_entity_constraints_EPreguntaCerrada.xml @@ -0,0 +1,17 @@ + + + + + + + + diff --git a/src/main/resources/config/liquibase/changelog/20210703210925_added_entity_EPreguntaCerradaOpcion.xml b/src/main/resources/config/liquibase/changelog/20210703210925_added_entity_EPreguntaCerradaOpcion.xml new file mode 100644 index 0000000..aa7c667 --- /dev/null +++ b/src/main/resources/config/liquibase/changelog/20210703210925_added_entity_EPreguntaCerradaOpcion.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/config/liquibase/changelog/20210703210925_added_entity_constraints_EPreguntaCerradaOpcion.xml b/src/main/resources/config/liquibase/changelog/20210703210925_added_entity_constraints_EPreguntaCerradaOpcion.xml new file mode 100644 index 0000000..282dbd2 --- /dev/null +++ b/src/main/resources/config/liquibase/changelog/20210703210925_added_entity_constraints_EPreguntaCerradaOpcion.xml @@ -0,0 +1,17 @@ + + + + + + + + diff --git a/src/main/resources/config/liquibase/changelog/20210703210926_added_entity_UsuarioEncuesta.xml b/src/main/resources/config/liquibase/changelog/20210703210926_added_entity_UsuarioEncuesta.xml new file mode 100644 index 0000000..936dce2 --- /dev/null +++ b/src/main/resources/config/liquibase/changelog/20210703210926_added_entity_UsuarioEncuesta.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/config/liquibase/changelog/20210703210926_added_entity_constraints_UsuarioEncuesta.xml b/src/main/resources/config/liquibase/changelog/20210703210926_added_entity_constraints_UsuarioEncuesta.xml new file mode 100644 index 0000000..e8c1fe8 --- /dev/null +++ b/src/main/resources/config/liquibase/changelog/20210703210926_added_entity_constraints_UsuarioEncuesta.xml @@ -0,0 +1,23 @@ + + + + + + + + + + diff --git a/src/main/resources/config/liquibase/changelog/20210703210927_added_entity_Categoria.xml b/src/main/resources/config/liquibase/changelog/20210703210927_added_entity_Categoria.xml new file mode 100644 index 0000000..7f9b580 --- /dev/null +++ b/src/main/resources/config/liquibase/changelog/20210703210927_added_entity_Categoria.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/config/liquibase/changelog/20210703210928_added_entity_Factura.xml b/src/main/resources/config/liquibase/changelog/20210703210928_added_entity_Factura.xml new file mode 100644 index 0000000..6d6e6d1 --- /dev/null +++ b/src/main/resources/config/liquibase/changelog/20210703210928_added_entity_Factura.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/config/liquibase/changelog/20210703210929_added_entity_Plantilla.xml b/src/main/resources/config/liquibase/changelog/20210703210929_added_entity_Plantilla.xml new file mode 100644 index 0000000..4bcd458 --- /dev/null +++ b/src/main/resources/config/liquibase/changelog/20210703210929_added_entity_Plantilla.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/config/liquibase/changelog/20210703210929_added_entity_constraints_Plantilla.xml b/src/main/resources/config/liquibase/changelog/20210703210929_added_entity_constraints_Plantilla.xml new file mode 100644 index 0000000..dee7c3a --- /dev/null +++ b/src/main/resources/config/liquibase/changelog/20210703210929_added_entity_constraints_Plantilla.xml @@ -0,0 +1,17 @@ + + + + + + + + diff --git a/src/main/resources/config/liquibase/changelog/20210703210930_added_entity_PPreguntaAbierta.xml b/src/main/resources/config/liquibase/changelog/20210703210930_added_entity_PPreguntaAbierta.xml new file mode 100644 index 0000000..6644b7e --- /dev/null +++ b/src/main/resources/config/liquibase/changelog/20210703210930_added_entity_PPreguntaAbierta.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/config/liquibase/changelog/20210703210930_added_entity_constraints_PPreguntaAbierta.xml b/src/main/resources/config/liquibase/changelog/20210703210930_added_entity_constraints_PPreguntaAbierta.xml new file mode 100644 index 0000000..e0dc145 --- /dev/null +++ b/src/main/resources/config/liquibase/changelog/20210703210930_added_entity_constraints_PPreguntaAbierta.xml @@ -0,0 +1,17 @@ + + + + + + + + diff --git a/src/main/resources/config/liquibase/changelog/20210703210931_added_entity_PPreguntaCerrada.xml b/src/main/resources/config/liquibase/changelog/20210703210931_added_entity_PPreguntaCerrada.xml new file mode 100644 index 0000000..5b9b868 --- /dev/null +++ b/src/main/resources/config/liquibase/changelog/20210703210931_added_entity_PPreguntaCerrada.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/config/liquibase/changelog/20210703210931_added_entity_constraints_PPreguntaCerrada.xml b/src/main/resources/config/liquibase/changelog/20210703210931_added_entity_constraints_PPreguntaCerrada.xml new file mode 100644 index 0000000..2498968 --- /dev/null +++ b/src/main/resources/config/liquibase/changelog/20210703210931_added_entity_constraints_PPreguntaCerrada.xml @@ -0,0 +1,17 @@ + + + + + + + + diff --git a/src/main/resources/config/liquibase/changelog/20210703210932_added_entity_PPreguntaCerradaOpcion.xml b/src/main/resources/config/liquibase/changelog/20210703210932_added_entity_PPreguntaCerradaOpcion.xml new file mode 100644 index 0000000..27d3a4a --- /dev/null +++ b/src/main/resources/config/liquibase/changelog/20210703210932_added_entity_PPreguntaCerradaOpcion.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/config/liquibase/changelog/20210703210932_added_entity_constraints_PPreguntaCerradaOpcion.xml b/src/main/resources/config/liquibase/changelog/20210703210932_added_entity_constraints_PPreguntaCerradaOpcion.xml new file mode 100644 index 0000000..c808f63 --- /dev/null +++ b/src/main/resources/config/liquibase/changelog/20210703210932_added_entity_constraints_PPreguntaCerradaOpcion.xml @@ -0,0 +1,17 @@ + + + + + + + + diff --git a/src/main/resources/config/liquibase/data/authority.csv b/src/main/resources/config/liquibase/data/authority.csv new file mode 100644 index 0000000..af5c6df --- /dev/null +++ b/src/main/resources/config/liquibase/data/authority.csv @@ -0,0 +1,3 @@ +name +ROLE_ADMIN +ROLE_USER diff --git a/src/main/resources/config/liquibase/data/user.csv b/src/main/resources/config/liquibase/data/user.csv new file mode 100644 index 0000000..cf83bc1 --- /dev/null +++ b/src/main/resources/config/liquibase/data/user.csv @@ -0,0 +1,3 @@ +id;login;password_hash;first_name;last_name;email;image_url;activated;lang_key;created_by;last_modified_by +1;admin;$2a$10$gSAhZrxMllrbgj/kkK9UceBPpChGWJA7SYIb1Mqo.n5aNLq1/oRrC;Administrator;Administrator;admin@localhost;;true;es;system;system +2;user;$2a$10$VEjxo0jq2YG9Rbk2HmX9S.k1uZBGYUHdUcid3g/vfiEl7lwWgOH/K;User;User;user@localhost;;true;es;system;system diff --git a/src/main/resources/config/liquibase/data/user_authority.csv b/src/main/resources/config/liquibase/data/user_authority.csv new file mode 100644 index 0000000..01dbdef --- /dev/null +++ b/src/main/resources/config/liquibase/data/user_authority.csv @@ -0,0 +1,4 @@ +user_id;authority_name +1;ROLE_ADMIN +1;ROLE_USER +2;ROLE_USER diff --git a/src/main/resources/config/liquibase/fake-data/categoria.csv b/src/main/resources/config/liquibase/fake-data/categoria.csv new file mode 100644 index 0000000..4b467e7 --- /dev/null +++ b/src/main/resources/config/liquibase/fake-data/categoria.csv @@ -0,0 +1,11 @@ +id;nombre;estado +1;protocol Buckinghamshire;INACTIVE +2;Colonia;INACTIVE +3;conjunto Ejecutivo;ACTIVE +4;embrace Bicicleta;INACTIVE +5;Hogar hacking ErgonĆ³mico;ACTIVE +6;Intranet Representante Negro;INACTIVE +7;DinĆ”nmico;INACTIVE +8;Acero;INACTIVE +9;plug-and-play AndalucĆ­a;ACTIVE +10;Vasco;INACTIVE diff --git a/src/main/resources/config/liquibase/fake-data/e_pregunta_abierta.csv b/src/main/resources/config/liquibase/fake-data/e_pregunta_abierta.csv new file mode 100644 index 0000000..f96606c --- /dev/null +++ b/src/main/resources/config/liquibase/fake-data/e_pregunta_abierta.csv @@ -0,0 +1,11 @@ +id;nombre;opcional;orden +1;invoice portals Ecuador;false;45639 +2;Dong invoice optimizada;false;32737 +3;capacitor feed Facilitador;false;97161 +4;Madrid;true;78148 +5;Especialista THX;true;27007 +6;calculating grow Ucrania;false;8248 +7;sticky AlgodĆ³n;false;14518 +8;International Infraestructura;false;14631 +9;PlĆ”stico FantĆ”stico IntegraciĆ³n;false;33067 +10;China;true;41164 diff --git a/src/main/resources/config/liquibase/fake-data/e_pregunta_abierta_respuesta.csv b/src/main/resources/config/liquibase/fake-data/e_pregunta_abierta_respuesta.csv new file mode 100644 index 0000000..d5995fb --- /dev/null +++ b/src/main/resources/config/liquibase/fake-data/e_pregunta_abierta_respuesta.csv @@ -0,0 +1,11 @@ +id;respuesta +1;discreta optical +2;compressing Bebes +3;Home PlĆ”stico +4;Identidad ErgonĆ³mico microchip +5;facilitate Queso platforms +6;Inteligente payment +7;navigate e-tailers generating +8;aƱadido Administrador +9;Verde initiatives +10;Bacon 1080p diff --git a/src/main/resources/config/liquibase/fake-data/e_pregunta_cerrada.csv b/src/main/resources/config/liquibase/fake-data/e_pregunta_cerrada.csv new file mode 100644 index 0000000..f73de51 --- /dev/null +++ b/src/main/resources/config/liquibase/fake-data/e_pregunta_cerrada.csv @@ -0,0 +1,11 @@ +id;nombre;tipo;opcional;orden +1;Amigable Metal;SINGLE;false;2824 +2;Senegal;SINGLE;false;12159 +3;Calle Seguridada Navarra;MULTIPLE;false;51099 +4;Negro Cuesta calculating;SINGLE;false;53199 +5;Cambridgeshire Account;SINGLE;true;80986 +6;Coche;SINGLE;false;77964 +7;Rojo Futuro;SINGLE;false;51691 +8;Morado;MULTIPLE;true;9492 +9;monitor Mancha;SINGLE;false;60864 +10;Mongolia PequeƱo;SINGLE;false;76481 diff --git a/src/main/resources/config/liquibase/fake-data/e_pregunta_cerrada_opcion.csv b/src/main/resources/config/liquibase/fake-data/e_pregunta_cerrada_opcion.csv new file mode 100644 index 0000000..0e501a7 --- /dev/null +++ b/src/main/resources/config/liquibase/fake-data/e_pregunta_cerrada_opcion.csv @@ -0,0 +1,11 @@ +id;nombre;orden;cantidad +1;Videojuegos leverage Gris;62045;71572 +2;Blanco;4258;99710 +3;CFA Centralizado;6681;19529 +4;RĆŗstico;77944;53453 +5;Ejecutivo Global;22352;15818 +6;bypassing cross-platform;62165;13712 +7;Web;23433;40437 +8;PrĆ”ctico;67157;57168 +9;Pizza Grupo;59271;63652 +10;metrics e-business desafĆ­o;27559;10037 diff --git a/src/main/resources/config/liquibase/fake-data/encuesta.csv b/src/main/resources/config/liquibase/fake-data/encuesta.csv new file mode 100644 index 0000000..72d7c18 --- /dev/null +++ b/src/main/resources/config/liquibase/fake-data/encuesta.csv @@ -0,0 +1,11 @@ +id;nombre;descripcion;fecha_creacion;fecha_publicacion;fecha_finalizar;fecha_finalizada;calificacion;acceso;contrasenna;estado +1;indexing Aplicaciones TĆ©cnico;connecting bandwidth Sorprendente;2021-07-03T17:38:14;2021-07-03T04:43:43;2021-07-03T10:53:18;2021-07-03T16:12:24;96158;PRIVATE;PapelerĆ­a Baleares;FINISHED +2;Estratega Coordinador;Colegio en;2021-07-03T12:37:49;2021-07-03T08:54:19;2021-07-03T04:13:00;2021-07-02T23:52:44;1280;PRIVATE;Granito;DRAFT +3;withdrawal Hormigon LeĆ³n;Metal;2021-07-03T14:37:42;2021-07-03T03:21:04;2021-07-03T09:45:08;2021-07-02T21:14:27;22993;PRIVATE;Gerente;FINISHED +4;Savings;deposit;2021-07-02T22:01:19;2021-07-03T01:56:17;2021-07-03T12:35:19;2021-07-03T14:31:32;9280;PRIVATE;mano;ACTIVE +5;benchmark;pixel Buckinghamshire;2021-07-03T15:31:24;2021-07-03T02:31:05;2021-07-03T09:20:03;2021-07-03T12:48:23;90241;PUBLIC;back-end Berkshire;ACTIVE +6;Peso Ruble Metal;Verde;2021-07-03T17:55:27;2021-07-03T18:16:20;2021-07-03T02:02:31;2021-07-03T00:25:13;41053;PUBLIC;soluciĆ³n;ACTIVE +7;architectures Bedfordshire;Azul Investment;2021-07-03T02:49:50;2021-07-03T08:20:49;2021-07-03T02:59:20;2021-07-02T21:32:44;65040;PRIVATE;Salud Subida RAM;DRAFT +8;Cambridgeshire;RSS engineer Inteligente;2021-07-03T21:06:14;2021-07-03T03:29:28;2021-07-03T15:40:04;2021-07-03T10:37:13;7791;PRIVATE;compressing;DELETED +9;Inteligente;En PCI;2021-07-03T02:13:44;2021-07-03T14:24:22;2021-07-03T04:42:34;2021-07-03T06:38:10;88262;PUBLIC;orchestrate MarroquinerĆ­a;DRAFT +10;backing Cambridgeshire;PaĆ­s;2021-07-03T15:48:09;2021-07-03T15:28:39;2021-07-03T14:15:01;2021-07-03T18:09:38;86971;PUBLIC;Centralizado Asturias;DRAFT diff --git a/src/main/resources/config/liquibase/fake-data/factura.csv b/src/main/resources/config/liquibase/fake-data/factura.csv new file mode 100644 index 0000000..1dd4107 --- /dev/null +++ b/src/main/resources/config/liquibase/fake-data/factura.csv @@ -0,0 +1,11 @@ +id;nombre_usuario;nombre_plantilla;costo;fecha +1;BEAC;red;45167;2021-07-03T06:50:21 +2;networks Berkshire disintermediate;Azul feed Violeta;18975;2021-07-03T19:46:32 +3;polĆ­tica;Sorprendente;9598;2021-07-03T01:36:05 +4;synthesize;haptic Account;79712;2021-07-03T17:47:45 +5;schemas;Loan;90587;2021-07-03T15:27:09 +6;holistic Lithuanian;Hormigon SMTP;16726;2021-07-03T09:13:08 +7;Estratega;groupware;7776;2021-07-03T18:19:56 +8;Ladrillo monitorizar;AlgodĆ³n Videojuegos;94472;2021-07-03T06:55:14 +9;Extendido;withdrawal nacional;2178;2021-07-03T13:02:55 +10;Vasco interfaz interface;navigate synthesizing Dinar;91097;2021-07-03T20:10:53 diff --git a/src/main/resources/config/liquibase/fake-data/p_pregunta_abierta.csv b/src/main/resources/config/liquibase/fake-data/p_pregunta_abierta.csv new file mode 100644 index 0000000..ea07531 --- /dev/null +++ b/src/main/resources/config/liquibase/fake-data/p_pregunta_abierta.csv @@ -0,0 +1,11 @@ +id;nombre;opcional;orden +1;streamline generate RĆŗstico;true;87286 +2;Asistente Israeli;false;10811 +3;Paradigma panel;true;27337 +4;sistemĆ”tica compress;true;7207 +5;Queso Gorro 1080p;true;41504 +6;DecoraciĆ³n Account;true;48613 +7;Comunidad Avon;true;40937 +8;Hormigon tangible;false;7478 +9;e-business;true;44541 +10;e-tailers back-end;false;44326 diff --git a/src/main/resources/config/liquibase/fake-data/p_pregunta_cerrada.csv b/src/main/resources/config/liquibase/fake-data/p_pregunta_cerrada.csv new file mode 100644 index 0000000..4c8fdfb --- /dev/null +++ b/src/main/resources/config/liquibase/fake-data/p_pregunta_cerrada.csv @@ -0,0 +1,11 @@ +id;nombre;tipo;opcional;orden +1;superestructura;SINGLE;true;26921 +2;Bedfordshire ADP;MULTIPLE;true;20690 +3;schemas Letonia synthesizing;MULTIPLE;true;27034 +4;Borders;MULTIPLE;true;16180 +5;experiences;MULTIPLE;true;24751 +6;Plaza Ladrillo Croacia;MULTIPLE;true;80077 +7;applications up;SINGLE;true;5126 +8;Riera partnerships cutting-edge;SINGLE;false;64146 +9;cero;SINGLE;false;96660 +10;bricks-and-clicks Ariary;MULTIPLE;true;9158 diff --git a/src/main/resources/config/liquibase/fake-data/p_pregunta_cerrada_opcion.csv b/src/main/resources/config/liquibase/fake-data/p_pregunta_cerrada_opcion.csv new file mode 100644 index 0000000..1e1ccbe --- /dev/null +++ b/src/main/resources/config/liquibase/fake-data/p_pregunta_cerrada_opcion.csv @@ -0,0 +1,11 @@ +id;nombre;orden +1;Metal;26192 +2;synthesize;42367 +3;Sopa;83606 +4;calculating;32472 +5;compress Raton;42410 +6;Ordenador;22836 +7;web Palladium;25913 +8;synthesizing Loan;53508 +9;Guarani payment;24474 +10;backing infraestructura transmitting;95910 diff --git a/src/main/resources/config/liquibase/fake-data/parametro_aplicacion.csv b/src/main/resources/config/liquibase/fake-data/parametro_aplicacion.csv new file mode 100644 index 0000000..ac5e6c2 --- /dev/null +++ b/src/main/resources/config/liquibase/fake-data/parametro_aplicacion.csv @@ -0,0 +1,11 @@ +id;max_dias_encuesta;min_dias_encuesta;max_cantidad_preguntas;min_cantidad_preguntas +1;53930;84065;84362;5659 +2;27976;86524;19093;25140 +3;25942;21360;33791;36183 +4;56796;90134;56434;91858 +5;43611;72636;12225;62182 +6;59881;27649;22048;4710 +7;7074;66932;44563;29754 +8;30951;88771;44427;40044 +9;53633;38048;1948;83133 +10;15208;61351;58879;67810 diff --git a/src/main/resources/config/liquibase/fake-data/plantilla.csv b/src/main/resources/config/liquibase/fake-data/plantilla.csv new file mode 100644 index 0000000..6ea20db --- /dev/null +++ b/src/main/resources/config/liquibase/fake-data/plantilla.csv @@ -0,0 +1,11 @@ +id;nombre;descripcion;fecha_creacion;fecha_publicacion_tienda;estado;precio +1;GenĆ©rico;up;2021-07-03T05:14:17;2021-07-03T02:26:13;DRAFT;32013 +2;Auto web-readiness;payment Noruega GenĆ©rico;2021-07-03T15:06:33;2021-07-03T04:47:18;DRAFT;90917 +3;ADP;Sabroso Parque Cuesta;2021-07-03T01:36:46;2021-07-03T09:48:30;DRAFT;10326 +4;Gerente;firewall hacking;2021-07-03T03:04:28;2021-07-03T19:45:20;ACTIVE;91150 +5;Gris proactive;Taiwan drive;2021-07-03T00:02:01;2021-07-02T23:01:58;DISABLED;11869 +6;Negro Pelota;experiences Ejecutivo;2021-07-03T19:15:21;2021-07-03T18:32:57;DELETED;24590 +7;payment Diverso;Salchichas Normas Pescado;2021-07-03T04:19:42;2021-07-03T00:58:19;DISABLED;76209 +8;arquitectura VĆ­a;payment;2021-07-02T23:34:09;2021-07-03T07:40:22;ACTIVE;43245 +9;datos solid PequeƱo;monetize overriding;2021-07-03T16:33:30;2021-07-03T03:44:14;ACTIVE;27820 +10;Identidad withdrawal Loan;Ladrillo DecoraciĆ³n;2021-07-03T01:20:19;2021-07-03T05:11:23;DRAFT;51114 diff --git a/src/main/resources/config/liquibase/fake-data/usuario_encuesta.csv b/src/main/resources/config/liquibase/fake-data/usuario_encuesta.csv new file mode 100644 index 0000000..e39810e --- /dev/null +++ b/src/main/resources/config/liquibase/fake-data/usuario_encuesta.csv @@ -0,0 +1,11 @@ +id;rol;estado;fecha_agregado +1;READ;ACTIVE;2021-07-03T18:45:32 +2;WRITE;ACTIVE;2021-07-03T19:36:58 +3;READ;ACTIVE;2021-07-03T00:02:00 +4;READ;ACTIVE;2021-07-02T22:21:24 +5;READ;ACTIVE;2021-07-03T00:55:08 +6;READ;PENDING;2021-07-03T15:41:39 +7;WRITE;ACTIVE;2021-07-03T05:06:52 +8;WRITE;ACTIVE;2021-07-03T20:23:16 +9;WRITE;PENDING;2021-07-03T13:53:34 +10;WRITE;PENDING;2021-07-03T04:23:57 diff --git a/src/main/resources/config/liquibase/fake-data/usuario_extra.csv b/src/main/resources/config/liquibase/fake-data/usuario_extra.csv new file mode 100644 index 0000000..19a6298 --- /dev/null +++ b/src/main/resources/config/liquibase/fake-data/usuario_extra.csv @@ -0,0 +1,11 @@ +id;nombre;icono_perfil;fecha_nacimiento;estado +1;Infraestructura Inversor;Pa'anga;2021-07-03T10:36:48;SUSPENDED +2;Director;Consultor wireless;2021-07-02T23:32:57;ACTIVE +3;RĆŗstico;OmĆ”n;2021-07-03T00:20:30;ACTIVE +4;Raton;deposit;2021-07-03T07:46:30;SUSPENDED +5;PapelerĆ­a invoice;Castilla-La;2021-07-03T19:14:48;SUSPENDED +6;CataluƱa;Riel estructura;2021-07-02T23:22:15;SUSPENDED +7;contexto LibrerĆ­a;hard;2021-07-03T20:37:33;ACTIVE +8;Morado Interacciones;Bricolaje;2021-07-03T15:06:49;ACTIVE +9;productize Jefe;monetize Rojo;2021-07-03T17:02:45;ACTIVE +10;Savings;Web Pelota SMTP;2021-07-03T19:40:32;ACTIVE diff --git a/src/main/resources/config/liquibase/master.xml b/src/main/resources/config/liquibase/master.xml new file mode 100644 index 0000000..04d9117 --- /dev/null +++ b/src/main/resources/config/liquibase/master.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/config/tls/keystore.p12 b/src/main/resources/config/tls/keystore.p12 new file mode 100644 index 0000000..21add74 Binary files /dev/null and b/src/main/resources/config/tls/keystore.p12 differ diff --git a/src/main/resources/i18n/messages.properties b/src/main/resources/i18n/messages.properties new file mode 100644 index 0000000..a9f66d4 --- /dev/null +++ b/src/main/resources/i18n/messages.properties @@ -0,0 +1,21 @@ +# Error page +error.title=Your request cannot be processed +error.subtitle=Sorry, an error has occurred. +error.status=Status: +error.message=Message: + +# Activation email +email.activation.title=DataSurvey account activation is required +email.activation.greeting=Dear {0} +email.activation.text1=Your DataSurvey account has been created, please click on the URL below to activate it: +email.activation.text2=Regards, +email.signature=DataSurvey Team. + +# Creation email +email.creation.text1=Your DataSurvey account has been created, please click on the URL below to access it: + +# Reset email +email.reset.title=DataSurvey password reset +email.reset.greeting=Dear {0} +email.reset.text1=For your DataSurvey account a password reset was requested, please click on the URL below to reset it: +email.reset.text2=Regards, diff --git a/src/main/resources/i18n/messages_es.properties b/src/main/resources/i18n/messages_es.properties new file mode 100644 index 0000000..48d7ea4 --- /dev/null +++ b/src/main/resources/i18n/messages_es.properties @@ -0,0 +1,21 @@ +# Error page +error.title=Su pedido no puede ser procesado +error.subtitle=Lo sentimos, ha ocurrido un error. +error.status=Estado: +error.message=Mensaje: + +# Activation email +email.activation.title=ActivaciĆ³n de DataSurvey +email.activation.greeting=Estimado/a {0} +email.activation.text1=Su cuenta en DataSurvey ha sido creada. Por favor, haga clic en el siguiente enlace para activarla: +email.activation.text2=Saludos, +email.signature=Equipo de DataSurvey. + +# Creation email +email.creation.text1=Su cuenta en DataSurvey ha sido creada. Por favor, haga clic en el siguiente enlace para utilizarla: + +# Reset email +email.reset.title=Reinicio de contraseƱa de DataSurvey +email.reset.greeting=Estimado/a {0} +email.reset.text1=Se ha solicitado el reinicio de la contraseƱa para su cuenta en DataSurvey. Por favor, haga clic en el siguiente enlace para reiniciarla: +email.reset.text2=Saludos, diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c6a10c7 --- /dev/null +++ b/src/main/resources/logback-spring.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + diff --git a/src/main/resources/templates/error.html b/src/main/resources/templates/error.html new file mode 100644 index 0000000..690e856 --- /dev/null +++ b/src/main/resources/templates/error.html @@ -0,0 +1,92 @@ + + + + + + Your request cannot be processed + + + +

+

Your request cannot be processed :(

+ +

Sorry, an error has occurred.

+ + Status:  ()
+ + Message: 
+
+
+ + diff --git a/src/main/resources/templates/mail/activationEmail.html b/src/main/resources/templates/mail/activationEmail.html new file mode 100644 index 0000000..0bb53a2 --- /dev/null +++ b/src/main/resources/templates/mail/activationEmail.html @@ -0,0 +1,20 @@ + + + + JHipster activation + + + + +

Dear

+

Your JHipster account has been created, please click on the URL below to activate it:

+

+ Activation link +

+

+ Regards, +
+ JHipster. +

+ + diff --git a/src/main/resources/templates/mail/creationEmail.html b/src/main/resources/templates/mail/creationEmail.html new file mode 100644 index 0000000..4e52898 --- /dev/null +++ b/src/main/resources/templates/mail/creationEmail.html @@ -0,0 +1,20 @@ + + + + JHipster creation + + + + +

Dear

+

Your JHipster account has been created, please click on the URL below to access it:

+

+ Login link +

+

+ Regards, +
+ JHipster. +

+ + diff --git a/src/main/resources/templates/mail/passwordResetEmail.html b/src/main/resources/templates/mail/passwordResetEmail.html new file mode 100644 index 0000000..290ca6d --- /dev/null +++ b/src/main/resources/templates/mail/passwordResetEmail.html @@ -0,0 +1,22 @@ + + + + JHipster password reset + + + + +

Dear

+

+ For your JHipster account a password reset was requested, please click on the URL below to reset it: +

+

+ Login link +

+

+ Regards, +
+ JHipster. +

+ + diff --git a/src/main/webapp/404.html b/src/main/webapp/404.html new file mode 100644 index 0000000..d661960 --- /dev/null +++ b/src/main/webapp/404.html @@ -0,0 +1,58 @@ + + + + + Page Not Found + + + + + +

Page Not Found

+

Sorry, but the page you were trying to view does not exist.

+ + + diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..f1611b5 --- /dev/null +++ b/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,13 @@ + + + + + html + text/html;charset=utf-8 + + + diff --git a/src/main/webapp/app/account/account.module.ts b/src/main/webapp/app/account/account.module.ts new file mode 100644 index 0000000..060a020 --- /dev/null +++ b/src/main/webapp/app/account/account.module.ts @@ -0,0 +1,26 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import { SharedModule } from 'app/shared/shared.module'; +import { PasswordStrengthBarComponent } from './password/password-strength-bar/password-strength-bar.component'; +import { RegisterComponent } from './register/register.component'; +import { ActivateComponent } from './activate/activate.component'; +import { PasswordComponent } from './password/password.component'; +import { PasswordResetInitComponent } from './password-reset/init/password-reset-init.component'; +import { PasswordResetFinishComponent } from './password-reset/finish/password-reset-finish.component'; +import { SettingsComponent } from './settings/settings.component'; +import { accountState } from './account.route'; + +@NgModule({ + imports: [SharedModule, RouterModule.forChild(accountState)], + declarations: [ + ActivateComponent, + RegisterComponent, + PasswordComponent, + PasswordStrengthBarComponent, + PasswordResetInitComponent, + PasswordResetFinishComponent, + SettingsComponent, + ], +}) +export class AccountModule {} diff --git a/src/main/webapp/app/account/account.route.ts b/src/main/webapp/app/account/account.route.ts new file mode 100644 index 0000000..1cbfb9d --- /dev/null +++ b/src/main/webapp/app/account/account.route.ts @@ -0,0 +1,17 @@ +import { Routes } from '@angular/router'; + +import { activateRoute } from './activate/activate.route'; +import { passwordRoute } from './password/password.route'; +import { passwordResetFinishRoute } from './password-reset/finish/password-reset-finish.route'; +import { passwordResetInitRoute } from './password-reset/init/password-reset-init.route'; +import { registerRoute } from './register/register.route'; +import { settingsRoute } from './settings/settings.route'; + +const ACCOUNT_ROUTES = [activateRoute, passwordRoute, passwordResetFinishRoute, passwordResetInitRoute, registerRoute, settingsRoute]; + +export const accountState: Routes = [ + { + path: '', + children: ACCOUNT_ROUTES, + }, +]; diff --git a/src/main/webapp/app/account/activate/activate.component.html b/src/main/webapp/app/account/activate/activate.component.html new file mode 100644 index 0000000..46a5b40 --- /dev/null +++ b/src/main/webapp/app/account/activate/activate.component.html @@ -0,0 +1,16 @@ +
+
+
+

Activation

+ +
+ Your user account has been activated. Please + sign in. +
+ +
+ Your user could not be activated. Please use the registration form to sign up. +
+
+
+
diff --git a/src/main/webapp/app/account/activate/activate.component.spec.ts b/src/main/webapp/app/account/activate/activate.component.spec.ts new file mode 100644 index 0000000..98e9450 --- /dev/null +++ b/src/main/webapp/app/account/activate/activate.component.spec.ts @@ -0,0 +1,73 @@ +import { TestBed, waitForAsync, tick, fakeAsync, inject } from '@angular/core/testing'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { ActivatedRoute } from '@angular/router'; +import { of, throwError } from 'rxjs'; + +import { ActivateService } from './activate.service'; +import { ActivateComponent } from './activate.component'; + +describe('Component Tests', () => { + describe('ActivateComponent', () => { + let comp: ActivateComponent; + + beforeEach( + waitForAsync(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [ActivateComponent], + providers: [ + { + provide: ActivatedRoute, + useValue: { queryParams: of({ key: 'ABC123' }) }, + }, + ], + }) + .overrideTemplate(ActivateComponent, '') + .compileComponents(); + }) + ); + + beforeEach(() => { + const fixture = TestBed.createComponent(ActivateComponent); + comp = fixture.componentInstance; + }); + + it('calls activate.get with the key from params', inject( + [ActivateService], + fakeAsync((service: ActivateService) => { + jest.spyOn(service, 'get').mockReturnValue(of()); + + comp.ngOnInit(); + tick(); + + expect(service.get).toHaveBeenCalledWith('ABC123'); + }) + )); + + it('should set set success to true upon successful activation', inject( + [ActivateService], + fakeAsync((service: ActivateService) => { + jest.spyOn(service, 'get').mockReturnValue(of({})); + + comp.ngOnInit(); + tick(); + + expect(comp.error).toBe(false); + expect(comp.success).toBe(true); + }) + )); + + it('should set set error to true upon activation failure', inject( + [ActivateService], + fakeAsync((service: ActivateService) => { + jest.spyOn(service, 'get').mockReturnValue(throwError('ERROR')); + + comp.ngOnInit(); + tick(); + + expect(comp.error).toBe(true); + expect(comp.success).toBe(false); + }) + )); + }); +}); diff --git a/src/main/webapp/app/account/activate/activate.component.ts b/src/main/webapp/app/account/activate/activate.component.ts new file mode 100644 index 0000000..0815d94 --- /dev/null +++ b/src/main/webapp/app/account/activate/activate.component.ts @@ -0,0 +1,23 @@ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { mergeMap } from 'rxjs/operators'; + +import { ActivateService } from './activate.service'; + +@Component({ + selector: 'jhi-activate', + templateUrl: './activate.component.html', +}) +export class ActivateComponent implements OnInit { + error = false; + success = false; + + constructor(private activateService: ActivateService, private route: ActivatedRoute) {} + + ngOnInit(): void { + this.route.queryParams.pipe(mergeMap(params => this.activateService.get(params.key))).subscribe( + () => (this.success = true), + () => (this.error = true) + ); + } +} diff --git a/src/main/webapp/app/account/activate/activate.route.ts b/src/main/webapp/app/account/activate/activate.route.ts new file mode 100644 index 0000000..8da1b6d --- /dev/null +++ b/src/main/webapp/app/account/activate/activate.route.ts @@ -0,0 +1,11 @@ +import { Route } from '@angular/router'; + +import { ActivateComponent } from './activate.component'; + +export const activateRoute: Route = { + path: 'activate', + component: ActivateComponent, + data: { + pageTitle: 'activate.title', + }, +}; diff --git a/src/main/webapp/app/account/activate/activate.service.ts b/src/main/webapp/app/account/activate/activate.service.ts new file mode 100644 index 0000000..d6969d5 --- /dev/null +++ b/src/main/webapp/app/account/activate/activate.service.ts @@ -0,0 +1,16 @@ +import { Injectable } from '@angular/core'; +import { HttpClient, HttpParams } from '@angular/common/http'; +import { Observable } from 'rxjs'; + +import { ApplicationConfigService } from 'app/core/config/application-config.service'; + +@Injectable({ providedIn: 'root' }) +export class ActivateService { + constructor(private http: HttpClient, private applicationConfigService: ApplicationConfigService) {} + + get(key: string): Observable<{}> { + return this.http.get(this.applicationConfigService.getEndpointFor('api/activate'), { + params: new HttpParams().set('key', key), + }); + } +} diff --git a/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.html b/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.html new file mode 100644 index 0000000..3431d36 --- /dev/null +++ b/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.html @@ -0,0 +1,137 @@ +
+
+
+

Reset password

+ +
+ The password reset key is missing. +
+ +
+ Choose a new password +
+ +
+ Your password couldn't be reset. Remember a password request is only valid for 24 hours. +
+ +
+ Your password has been reset. Please + sign in. +
+ +
+ The password and its confirmation do not match! +
+ +
+
+
+ + + +
+ + Your password is required. + + + + Your password is required to be at least 4 characters. + + + + Your password cannot be longer than 50 characters. + +
+ + +
+ +
+ + + +
+ + Your password confirmation is required. + + + + Your password confirmation is required to be at least 4 characters. + + + + Your password confirmation cannot be longer than 50 characters. + +
+
+ + +
+
+
+
+
diff --git a/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.spec.ts b/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.spec.ts new file mode 100644 index 0000000..b54978e --- /dev/null +++ b/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.spec.ts @@ -0,0 +1,100 @@ +import { ElementRef } from '@angular/core'; +import { ComponentFixture, TestBed, inject, tick, fakeAsync } from '@angular/core/testing'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { FormBuilder } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; +import { of, throwError } from 'rxjs'; + +import { PasswordResetFinishComponent } from './password-reset-finish.component'; +import { PasswordResetFinishService } from './password-reset-finish.service'; + +describe('Component Tests', () => { + describe('PasswordResetFinishComponent', () => { + let fixture: ComponentFixture; + let comp: PasswordResetFinishComponent; + + beforeEach(() => { + fixture = TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [PasswordResetFinishComponent], + providers: [ + FormBuilder, + { + provide: ActivatedRoute, + useValue: { queryParams: of({ key: 'XYZPDQ' }) }, + }, + ], + }) + .overrideTemplate(PasswordResetFinishComponent, '') + .createComponent(PasswordResetFinishComponent); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(PasswordResetFinishComponent); + comp = fixture.componentInstance; + comp.ngOnInit(); + }); + + it('should define its initial state', () => { + expect(comp.initialized).toBe(true); + expect(comp.key).toEqual('XYZPDQ'); + }); + + it('sets focus after the view has been initialized', () => { + const node = { + focus: jest.fn(), + }; + comp.newPassword = new ElementRef(node); + + comp.ngAfterViewInit(); + + expect(node.focus).toHaveBeenCalled(); + }); + + it('should ensure the two passwords entered match', () => { + comp.passwordForm.patchValue({ + newPassword: 'password', + confirmPassword: 'non-matching', + }); + + comp.finishReset(); + + expect(comp.doNotMatch).toBe(true); + }); + + it('should update success to true after resetting password', inject( + [PasswordResetFinishService], + fakeAsync((service: PasswordResetFinishService) => { + jest.spyOn(service, 'save').mockReturnValue(of({})); + comp.passwordForm.patchValue({ + newPassword: 'password', + confirmPassword: 'password', + }); + + comp.finishReset(); + tick(); + + expect(service.save).toHaveBeenCalledWith('XYZPDQ', 'password'); + expect(comp.success).toBe(true); + }) + )); + + it('should notify of generic error', inject( + [PasswordResetFinishService], + fakeAsync((service: PasswordResetFinishService) => { + jest.spyOn(service, 'save').mockReturnValue(throwError('ERROR')); + comp.passwordForm.patchValue({ + newPassword: 'password', + confirmPassword: 'password', + }); + + comp.finishReset(); + tick(); + + expect(service.save).toHaveBeenCalledWith('XYZPDQ', 'password'); + expect(comp.success).toBe(false); + expect(comp.error).toBe(true); + }) + )); + }); +}); diff --git a/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.ts b/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.ts new file mode 100644 index 0000000..a055650 --- /dev/null +++ b/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.ts @@ -0,0 +1,59 @@ +import { Component, OnInit, AfterViewInit, ElementRef, ViewChild } from '@angular/core'; +import { FormBuilder, Validators } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; + +import { PasswordResetFinishService } from './password-reset-finish.service'; + +@Component({ + selector: 'jhi-password-reset-finish', + templateUrl: './password-reset-finish.component.html', +}) +export class PasswordResetFinishComponent implements OnInit, AfterViewInit { + @ViewChild('newPassword', { static: false }) + newPassword?: ElementRef; + + initialized = false; + doNotMatch = false; + error = false; + success = false; + key = ''; + + passwordForm = this.fb.group({ + newPassword: ['', [Validators.required, Validators.minLength(4), Validators.maxLength(50)]], + confirmPassword: ['', [Validators.required, Validators.minLength(4), Validators.maxLength(50)]], + }); + + constructor(private passwordResetFinishService: PasswordResetFinishService, private route: ActivatedRoute, private fb: FormBuilder) {} + + ngOnInit(): void { + this.route.queryParams.subscribe(params => { + if (params['key']) { + this.key = params['key']; + } + this.initialized = true; + }); + } + + ngAfterViewInit(): void { + if (this.newPassword) { + this.newPassword.nativeElement.focus(); + } + } + + finishReset(): void { + this.doNotMatch = false; + this.error = false; + + const newPassword = this.passwordForm.get(['newPassword'])!.value; + const confirmPassword = this.passwordForm.get(['confirmPassword'])!.value; + + if (newPassword !== confirmPassword) { + this.doNotMatch = true; + } else { + this.passwordResetFinishService.save(this.key, newPassword).subscribe( + () => (this.success = true), + () => (this.error = true) + ); + } + } +} diff --git a/src/main/webapp/app/account/password-reset/finish/password-reset-finish.route.ts b/src/main/webapp/app/account/password-reset/finish/password-reset-finish.route.ts new file mode 100644 index 0000000..3786df7 --- /dev/null +++ b/src/main/webapp/app/account/password-reset/finish/password-reset-finish.route.ts @@ -0,0 +1,11 @@ +import { Route } from '@angular/router'; + +import { PasswordResetFinishComponent } from './password-reset-finish.component'; + +export const passwordResetFinishRoute: Route = { + path: 'reset/finish', + component: PasswordResetFinishComponent, + data: { + pageTitle: 'global.menu.account.password', + }, +}; diff --git a/src/main/webapp/app/account/password-reset/finish/password-reset-finish.service.ts b/src/main/webapp/app/account/password-reset/finish/password-reset-finish.service.ts new file mode 100644 index 0000000..1dff324 --- /dev/null +++ b/src/main/webapp/app/account/password-reset/finish/password-reset-finish.service.ts @@ -0,0 +1,14 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Observable } from 'rxjs'; + +import { ApplicationConfigService } from 'app/core/config/application-config.service'; + +@Injectable({ providedIn: 'root' }) +export class PasswordResetFinishService { + constructor(private http: HttpClient, private applicationConfigService: ApplicationConfigService) {} + + save(key: string, newPassword: string): Observable<{}> { + return this.http.post(this.applicationConfigService.getEndpointFor('api/account/reset-password/finish'), { key, newPassword }); + } +} diff --git a/src/main/webapp/app/account/password-reset/init/password-reset-init.component.html b/src/main/webapp/app/account/password-reset/init/password-reset-init.component.html new file mode 100644 index 0000000..98bb427 --- /dev/null +++ b/src/main/webapp/app/account/password-reset/init/password-reset-init.component.html @@ -0,0 +1,81 @@ +
+
+
+

Reset your password

+ + + +
+ Enter the email address you used to register. +
+ +
+ Check your emails for details on how to reset your password. +
+ +
+
+ + + +
+ + Your email is required. + + + + Your email is invalid. + + + + Your email is required to be at least 5 characters. + + + + Your email cannot be longer than 100 characters. + +
+
+ + +
+
+
+
diff --git a/src/main/webapp/app/account/password-reset/init/password-reset-init.component.spec.ts b/src/main/webapp/app/account/password-reset/init/password-reset-init.component.spec.ts new file mode 100644 index 0000000..9c26805 --- /dev/null +++ b/src/main/webapp/app/account/password-reset/init/password-reset-init.component.spec.ts @@ -0,0 +1,65 @@ +import { ElementRef } from '@angular/core'; +import { ComponentFixture, TestBed, inject } from '@angular/core/testing'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { FormBuilder } from '@angular/forms'; +import { of, throwError } from 'rxjs'; + +import { PasswordResetInitComponent } from './password-reset-init.component'; +import { PasswordResetInitService } from './password-reset-init.service'; + +describe('Component Tests', () => { + describe('PasswordResetInitComponent', () => { + let fixture: ComponentFixture; + let comp: PasswordResetInitComponent; + + beforeEach(() => { + fixture = TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [PasswordResetInitComponent], + providers: [FormBuilder], + }) + .overrideTemplate(PasswordResetInitComponent, '') + .createComponent(PasswordResetInitComponent); + comp = fixture.componentInstance; + }); + + it('sets focus after the view has been initialized', () => { + const node = { + focus: jest.fn(), + }; + comp.email = new ElementRef(node); + + comp.ngAfterViewInit(); + + expect(node.focus).toHaveBeenCalled(); + }); + + it('notifies of success upon successful requestReset', inject([PasswordResetInitService], (service: PasswordResetInitService) => { + jest.spyOn(service, 'save').mockReturnValue(of({})); + comp.resetRequestForm.patchValue({ + email: 'user@domain.com', + }); + + comp.requestReset(); + + expect(service.save).toHaveBeenCalledWith('user@domain.com'); + expect(comp.success).toBe(true); + })); + + it('no notification of success upon error response', inject([PasswordResetInitService], (service: PasswordResetInitService) => { + jest.spyOn(service, 'save').mockReturnValue( + throwError({ + status: 503, + data: 'something else', + }) + ); + comp.resetRequestForm.patchValue({ + email: 'user@domain.com', + }); + comp.requestReset(); + + expect(service.save).toHaveBeenCalledWith('user@domain.com'); + expect(comp.success).toBe(false); + })); + }); +}); diff --git a/src/main/webapp/app/account/password-reset/init/password-reset-init.component.ts b/src/main/webapp/app/account/password-reset/init/password-reset-init.component.ts new file mode 100644 index 0000000..ec99fcd --- /dev/null +++ b/src/main/webapp/app/account/password-reset/init/password-reset-init.component.ts @@ -0,0 +1,30 @@ +import { Component, AfterViewInit, ElementRef, ViewChild } from '@angular/core'; +import { FormBuilder, Validators } from '@angular/forms'; + +import { PasswordResetInitService } from './password-reset-init.service'; + +@Component({ + selector: 'jhi-password-reset-init', + templateUrl: './password-reset-init.component.html', +}) +export class PasswordResetInitComponent implements AfterViewInit { + @ViewChild('email', { static: false }) + email?: ElementRef; + + success = false; + resetRequestForm = this.fb.group({ + email: ['', [Validators.required, Validators.minLength(5), Validators.maxLength(254), Validators.email]], + }); + + constructor(private passwordResetInitService: PasswordResetInitService, private fb: FormBuilder) {} + + ngAfterViewInit(): void { + if (this.email) { + this.email.nativeElement.focus(); + } + } + + requestReset(): void { + this.passwordResetInitService.save(this.resetRequestForm.get(['email'])!.value).subscribe(() => (this.success = true)); + } +} diff --git a/src/main/webapp/app/account/password-reset/init/password-reset-init.route.ts b/src/main/webapp/app/account/password-reset/init/password-reset-init.route.ts new file mode 100644 index 0000000..6ba92a4 --- /dev/null +++ b/src/main/webapp/app/account/password-reset/init/password-reset-init.route.ts @@ -0,0 +1,11 @@ +import { Route } from '@angular/router'; + +import { PasswordResetInitComponent } from './password-reset-init.component'; + +export const passwordResetInitRoute: Route = { + path: 'reset/request', + component: PasswordResetInitComponent, + data: { + pageTitle: 'global.menu.account.password', + }, +}; diff --git a/src/main/webapp/app/account/password-reset/init/password-reset-init.service.ts b/src/main/webapp/app/account/password-reset/init/password-reset-init.service.ts new file mode 100644 index 0000000..8ff05e0 --- /dev/null +++ b/src/main/webapp/app/account/password-reset/init/password-reset-init.service.ts @@ -0,0 +1,14 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Observable } from 'rxjs'; + +import { ApplicationConfigService } from 'app/core/config/application-config.service'; + +@Injectable({ providedIn: 'root' }) +export class PasswordResetInitService { + constructor(private http: HttpClient, private applicationConfigService: ApplicationConfigService) {} + + save(mail: string): Observable<{}> { + return this.http.post(this.applicationConfigService.getEndpointFor('api/account/reset-password/init'), mail); + } +} diff --git a/src/main/webapp/app/account/password/password-strength-bar/password-strength-bar.component.html b/src/main/webapp/app/account/password/password-strength-bar/password-strength-bar.component.html new file mode 100644 index 0000000..244da08 --- /dev/null +++ b/src/main/webapp/app/account/password/password-strength-bar/password-strength-bar.component.html @@ -0,0 +1,10 @@ +
+ Password strength: +
    +
  • +
  • +
  • +
  • +
  • +
+
diff --git a/src/main/webapp/app/account/password/password-strength-bar/password-strength-bar.component.scss b/src/main/webapp/app/account/password/password-strength-bar/password-strength-bar.component.scss new file mode 100644 index 0000000..67ce468 --- /dev/null +++ b/src/main/webapp/app/account/password/password-strength-bar/password-strength-bar.component.scss @@ -0,0 +1,23 @@ +/* ========================================================================== +start Password strength bar style +========================================================================== */ +ul#strength { + display: inline; + list-style: none; + margin: 0; + margin-left: 15px; + padding: 0; + vertical-align: 2px; +} + +.point { + background: #ddd; + border-radius: 2px; + display: inline-block; + height: 5px; + margin-right: 1px; + width: 20px; + &:last-child { + margin: 0 !important; + } +} diff --git a/src/main/webapp/app/account/password/password-strength-bar/password-strength-bar.component.spec.ts b/src/main/webapp/app/account/password/password-strength-bar/password-strength-bar.component.spec.ts new file mode 100644 index 0000000..5053cec --- /dev/null +++ b/src/main/webapp/app/account/password/password-strength-bar/password-strength-bar.component.spec.ts @@ -0,0 +1,50 @@ +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; + +import { PasswordStrengthBarComponent } from './password-strength-bar.component'; + +describe('Component Tests', () => { + describe('PasswordStrengthBarComponent', () => { + let comp: PasswordStrengthBarComponent; + let fixture: ComponentFixture; + + beforeEach( + waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [PasswordStrengthBarComponent], + }) + .overrideTemplate(PasswordStrengthBarComponent, '') + .compileComponents(); + }) + ); + + beforeEach(() => { + fixture = TestBed.createComponent(PasswordStrengthBarComponent); + comp = fixture.componentInstance; + }); + + describe('PasswordStrengthBarComponents', () => { + it('should initialize with default values', () => { + expect(comp.measureStrength('')).toBe(0); + expect(comp.colors).toEqual(['#F00', '#F90', '#FF0', '#9F0', '#0F0']); + expect(comp.getColor(0).idx).toBe(1); + expect(comp.getColor(0).color).toBe(comp.colors[0]); + }); + + it('should increase strength upon password value change', () => { + expect(comp.measureStrength('')).toBe(0); + expect(comp.measureStrength('aa')).toBeGreaterThanOrEqual(comp.measureStrength('')); + expect(comp.measureStrength('aa^6')).toBeGreaterThanOrEqual(comp.measureStrength('aa')); + expect(comp.measureStrength('Aa090(**)')).toBeGreaterThanOrEqual(comp.measureStrength('aa^6')); + expect(comp.measureStrength('Aa090(**)+-07365')).toBeGreaterThanOrEqual(comp.measureStrength('Aa090(**)')); + }); + + it('should change the color based on strength', () => { + expect(comp.getColor(0).color).toBe(comp.colors[0]); + expect(comp.getColor(11).color).toBe(comp.colors[1]); + expect(comp.getColor(22).color).toBe(comp.colors[2]); + expect(comp.getColor(33).color).toBe(comp.colors[3]); + expect(comp.getColor(44).color).toBe(comp.colors[4]); + }); + }); + }); +}); diff --git a/src/main/webapp/app/account/password/password-strength-bar/password-strength-bar.component.ts b/src/main/webapp/app/account/password/password-strength-bar/password-strength-bar.component.ts new file mode 100644 index 0000000..f235ae0 --- /dev/null +++ b/src/main/webapp/app/account/password/password-strength-bar/password-strength-bar.component.ts @@ -0,0 +1,72 @@ +import { Component, ElementRef, Input, Renderer2 } from '@angular/core'; + +@Component({ + selector: 'jhi-password-strength-bar', + templateUrl: './password-strength-bar.component.html', + styleUrls: ['./password-strength-bar.component.scss'], +}) +export class PasswordStrengthBarComponent { + colors = ['#F00', '#F90', '#FF0', '#9F0', '#0F0']; + + constructor(private renderer: Renderer2, private elementRef: ElementRef) {} + + measureStrength(p: string): number { + let force = 0; + const regex = /[$-/:-?{-~!"^_`[\]]/g; // " + const lowerLetters = /[a-z]+/.test(p); + const upperLetters = /[A-Z]+/.test(p); + const numbers = /[0-9]+/.test(p); + const symbols = regex.test(p); + + const flags = [lowerLetters, upperLetters, numbers, symbols]; + const passedMatches = flags.filter((isMatchedFlag: boolean) => isMatchedFlag === true).length; + + force += 2 * p.length + (p.length >= 10 ? 1 : 0); + force += passedMatches * 10; + + // penalty (short password) + force = p.length <= 6 ? Math.min(force, 10) : force; + + // penalty (poor variety of characters) + force = passedMatches === 1 ? Math.min(force, 10) : force; + force = passedMatches === 2 ? Math.min(force, 20) : force; + force = passedMatches === 3 ? Math.min(force, 40) : force; + + return force; + } + + getColor(s: number): { idx: number; color: string } { + let idx = 0; + if (s > 10) { + if (s <= 20) { + idx = 1; + } else if (s <= 30) { + idx = 2; + } else if (s <= 40) { + idx = 3; + } else { + idx = 4; + } + } + return { idx: idx + 1, color: this.colors[idx] }; + } + + @Input() + set passwordToCheck(password: string) { + if (password) { + const c = this.getColor(this.measureStrength(password)); + const element = this.elementRef.nativeElement; + if (element.className) { + this.renderer.removeClass(element, element.className); + } + const lis = element.getElementsByTagName('li'); + for (let i = 0; i < lis.length; i++) { + if (i < c.idx) { + this.renderer.setStyle(lis[i], 'backgroundColor', c.color); + } else { + this.renderer.setStyle(lis[i], 'backgroundColor', '#DDD'); + } + } + } + } +} diff --git a/src/main/webapp/app/account/password/password.component.html b/src/main/webapp/app/account/password/password.component.html new file mode 100644 index 0000000..f831624 --- /dev/null +++ b/src/main/webapp/app/account/password/password.component.html @@ -0,0 +1,154 @@ +
+
+
+

+ Password for [{{ account.login }}] +

+ +
+ Password changed! +
+ +
+ An error has occurred! The password could not be changed. +
+ +
+ The password and its confirmation do not match! +
+ +
+
+ + + +
+ + Your password is required. + +
+
+ +
+ + + +
+ + Your password is required. + + + + Your password is required to be at least 4 characters. + + + + Your password cannot be longer than 50 characters. + +
+ + +
+ +
+ + + +
+ + Your confirmation password is required. + + + + Your confirmation password is required to be at least 4 characters. + + + + Your confirmation password cannot be longer than 50 characters. + +
+
+ + +
+
+
+
diff --git a/src/main/webapp/app/account/password/password.component.spec.ts b/src/main/webapp/app/account/password/password.component.spec.ts new file mode 100644 index 0000000..22f922f --- /dev/null +++ b/src/main/webapp/app/account/password/password.component.spec.ts @@ -0,0 +1,108 @@ +jest.mock('app/core/auth/account.service'); + +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { FormBuilder } from '@angular/forms'; +import { of, throwError } from 'rxjs'; + +import { AccountService } from 'app/core/auth/account.service'; + +import { PasswordComponent } from './password.component'; +import { PasswordService } from './password.service'; + +describe('Component Tests', () => { + describe('PasswordComponent', () => { + let comp: PasswordComponent; + let fixture: ComponentFixture; + let service: PasswordService; + + beforeEach( + waitForAsync(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [PasswordComponent], + providers: [FormBuilder, AccountService], + }) + .overrideTemplate(PasswordComponent, '') + .compileComponents(); + }) + ); + + beforeEach(() => { + fixture = TestBed.createComponent(PasswordComponent); + comp = fixture.componentInstance; + service = TestBed.inject(PasswordService); + }); + + it('should show error if passwords do not match', () => { + // GIVEN + comp.passwordForm.patchValue({ + newPassword: 'password1', + confirmPassword: 'password2', + }); + // WHEN + comp.changePassword(); + // THEN + expect(comp.doNotMatch).toBe(true); + expect(comp.error).toBe(false); + expect(comp.success).toBe(false); + }); + + it('should call Auth.changePassword when passwords match', () => { + // GIVEN + const passwordValues = { + currentPassword: 'oldPassword', + newPassword: 'myPassword', + }; + + jest.spyOn(service, 'save').mockReturnValue(of(new HttpResponse({ body: true }))); + + comp.passwordForm.patchValue({ + currentPassword: passwordValues.currentPassword, + newPassword: passwordValues.newPassword, + confirmPassword: passwordValues.newPassword, + }); + + // WHEN + comp.changePassword(); + + // THEN + expect(service.save).toHaveBeenCalledWith(passwordValues.newPassword, passwordValues.currentPassword); + }); + + it('should set success to true upon success', () => { + // GIVEN + jest.spyOn(service, 'save').mockReturnValue(of(new HttpResponse({ body: true }))); + comp.passwordForm.patchValue({ + newPassword: 'myPassword', + confirmPassword: 'myPassword', + }); + + // WHEN + comp.changePassword(); + + // THEN + expect(comp.doNotMatch).toBe(false); + expect(comp.error).toBe(false); + expect(comp.success).toBe(true); + }); + + it('should notify of error if change password fails', () => { + // GIVEN + jest.spyOn(service, 'save').mockReturnValue(throwError('ERROR')); + comp.passwordForm.patchValue({ + newPassword: 'myPassword', + confirmPassword: 'myPassword', + }); + + // WHEN + comp.changePassword(); + + // THEN + expect(comp.doNotMatch).toBe(false); + expect(comp.success).toBe(false); + expect(comp.error).toBe(true); + }); + }); +}); diff --git a/src/main/webapp/app/account/password/password.component.ts b/src/main/webapp/app/account/password/password.component.ts new file mode 100644 index 0000000..fc7bf11 --- /dev/null +++ b/src/main/webapp/app/account/password/password.component.ts @@ -0,0 +1,45 @@ +import { Component, OnInit } from '@angular/core'; +import { FormBuilder, Validators } from '@angular/forms'; +import { Observable } from 'rxjs'; + +import { AccountService } from 'app/core/auth/account.service'; +import { Account } from 'app/core/auth/account.model'; +import { PasswordService } from './password.service'; + +@Component({ + selector: 'jhi-password', + templateUrl: './password.component.html', +}) +export class PasswordComponent implements OnInit { + doNotMatch = false; + error = false; + success = false; + account$?: Observable; + passwordForm = this.fb.group({ + currentPassword: ['', [Validators.required]], + newPassword: ['', [Validators.required, Validators.minLength(4), Validators.maxLength(50)]], + confirmPassword: ['', [Validators.required, Validators.minLength(4), Validators.maxLength(50)]], + }); + + constructor(private passwordService: PasswordService, private accountService: AccountService, private fb: FormBuilder) {} + + ngOnInit(): void { + this.account$ = this.accountService.identity(); + } + + changePassword(): void { + this.error = false; + this.success = false; + this.doNotMatch = false; + + const newPassword = this.passwordForm.get(['newPassword'])!.value; + if (newPassword !== this.passwordForm.get(['confirmPassword'])!.value) { + this.doNotMatch = true; + } else { + this.passwordService.save(newPassword, this.passwordForm.get(['currentPassword'])!.value).subscribe( + () => (this.success = true), + () => (this.error = true) + ); + } + } +} diff --git a/src/main/webapp/app/account/password/password.route.ts b/src/main/webapp/app/account/password/password.route.ts new file mode 100644 index 0000000..174b54f --- /dev/null +++ b/src/main/webapp/app/account/password/password.route.ts @@ -0,0 +1,13 @@ +import { Route } from '@angular/router'; + +import { UserRouteAccessService } from 'app/core/auth/user-route-access.service'; +import { PasswordComponent } from './password.component'; + +export const passwordRoute: Route = { + path: 'password', + component: PasswordComponent, + data: { + pageTitle: 'global.menu.account.password', + }, + canActivate: [UserRouteAccessService], +}; diff --git a/src/main/webapp/app/account/password/password.service.ts b/src/main/webapp/app/account/password/password.service.ts new file mode 100644 index 0000000..337a64f --- /dev/null +++ b/src/main/webapp/app/account/password/password.service.ts @@ -0,0 +1,14 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Observable } from 'rxjs'; + +import { ApplicationConfigService } from 'app/core/config/application-config.service'; + +@Injectable({ providedIn: 'root' }) +export class PasswordService { + constructor(private http: HttpClient, private applicationConfigService: ApplicationConfigService) {} + + save(newPassword: string, currentPassword: string): Observable<{}> { + return this.http.post(this.applicationConfigService.getEndpointFor('api/account/change-password'), { currentPassword, newPassword }); + } +} diff --git a/src/main/webapp/app/account/register/register.component.html b/src/main/webapp/app/account/register/register.component.html new file mode 100644 index 0000000..dc2157b --- /dev/null +++ b/src/main/webapp/app/account/register/register.component.html @@ -0,0 +1,236 @@ +
+
+
+

Registration

+ +
+ Registration saved! Please check your email for confirmation. +
+ +
+ Registration failed! Please try again later. +
+ +
+ Login name already registered! Please choose another one. +
+ +
+ Email is already in use! Please choose another one. +
+ +
+ The password and its confirmation do not match! +
+
+
+ +
+
+
+
+ + + +
+ + Your username is required. + + + + Your username is required to be at least 1 character. + + + + Your username cannot be longer than 50 characters. + + + + Your username can only contain letters and digits. + +
+
+ +
+ + + +
+ + Your email is required. + + + + Your email is invalid. + + + + Your email is required to be at least 5 characters. + + + + Your email cannot be longer than 100 characters. + +
+
+ +
+ + + +
+ + Your password is required. + + + + Your password is required to be at least 4 characters. + + + + Your password cannot be longer than 50 characters. + +
+ + +
+ +
+ + + +
+ + Your confirmation password is required. + + + + Your confirmation password is required to be at least 4 characters. + + + + Your confirmation password cannot be longer than 50 characters. + +
+
+ + +
+ +
+ If you want to + sign in, you can try the default accounts:
- Administrator (login="admin" and password="admin")
- User (login="user" and + password="user").
+
+
+
+
diff --git a/src/main/webapp/app/account/register/register.component.spec.ts b/src/main/webapp/app/account/register/register.component.spec.ts new file mode 100644 index 0000000..0e61822 --- /dev/null +++ b/src/main/webapp/app/account/register/register.component.spec.ts @@ -0,0 +1,141 @@ +jest.mock('@ngx-translate/core'); + +import { ComponentFixture, TestBed, waitForAsync, inject, tick, fakeAsync } from '@angular/core/testing'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { FormBuilder } from '@angular/forms'; +import { of, throwError } from 'rxjs'; +import { TranslateService } from '@ngx-translate/core'; + +import { EMAIL_ALREADY_USED_TYPE, LOGIN_ALREADY_USED_TYPE } from 'app/config/error.constants'; + +import { RegisterService } from './register.service'; +import { RegisterComponent } from './register.component'; + +describe('Component Tests', () => { + describe('RegisterComponent', () => { + let fixture: ComponentFixture; + let comp: RegisterComponent; + + beforeEach( + waitForAsync(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [RegisterComponent], + providers: [FormBuilder, TranslateService], + }) + .overrideTemplate(RegisterComponent, '') + .compileComponents(); + }) + ); + + beforeEach(() => { + fixture = TestBed.createComponent(RegisterComponent); + comp = fixture.componentInstance; + }); + + it('should ensure the two passwords entered match', () => { + comp.registerForm.patchValue({ + password: 'password', + confirmPassword: 'non-matching', + }); + + comp.register(); + + expect(comp.doNotMatch).toBe(true); + }); + + it('should update success to true after creating an account', inject( + [RegisterService, TranslateService], + fakeAsync((service: RegisterService, mockLanguageService: TranslateService) => { + jest.spyOn(service, 'save').mockReturnValue(of({})); + mockLanguageService.currentLang = 'es'; + comp.registerForm.patchValue({ + password: 'password', + confirmPassword: 'password', + }); + + comp.register(); + tick(); + + expect(service.save).toHaveBeenCalledWith({ + email: '', + password: 'password', + login: '', + langKey: 'es', + }); + expect(comp.success).toBe(true); + expect(comp.errorUserExists).toBe(false); + expect(comp.errorEmailExists).toBe(false); + expect(comp.error).toBe(false); + }) + )); + + it('should notify of user existence upon 400/login already in use', inject( + [RegisterService], + fakeAsync((service: RegisterService) => { + jest.spyOn(service, 'save').mockReturnValue( + throwError({ + status: 400, + error: { type: LOGIN_ALREADY_USED_TYPE }, + }) + ); + comp.registerForm.patchValue({ + password: 'password', + confirmPassword: 'password', + }); + + comp.register(); + tick(); + + expect(comp.errorUserExists).toBe(true); + expect(comp.errorEmailExists).toBe(false); + expect(comp.error).toBe(false); + }) + )); + + it('should notify of email existence upon 400/email address already in use', inject( + [RegisterService], + fakeAsync((service: RegisterService) => { + jest.spyOn(service, 'save').mockReturnValue( + throwError({ + status: 400, + error: { type: EMAIL_ALREADY_USED_TYPE }, + }) + ); + comp.registerForm.patchValue({ + password: 'password', + confirmPassword: 'password', + }); + + comp.register(); + tick(); + + expect(comp.errorEmailExists).toBe(true); + expect(comp.errorUserExists).toBe(false); + expect(comp.error).toBe(false); + }) + )); + + it('should notify of generic error', inject( + [RegisterService], + fakeAsync((service: RegisterService) => { + jest.spyOn(service, 'save').mockReturnValue( + throwError({ + status: 503, + }) + ); + comp.registerForm.patchValue({ + password: 'password', + confirmPassword: 'password', + }); + + comp.register(); + tick(); + + expect(comp.errorUserExists).toBe(false); + expect(comp.errorEmailExists).toBe(false); + expect(comp.error).toBe(true); + }) + )); + }); +}); diff --git a/src/main/webapp/app/account/register/register.component.ts b/src/main/webapp/app/account/register/register.component.ts new file mode 100644 index 0000000..282b4d3 --- /dev/null +++ b/src/main/webapp/app/account/register/register.component.ts @@ -0,0 +1,74 @@ +import { Component, AfterViewInit, ElementRef, ViewChild } from '@angular/core'; +import { HttpErrorResponse } from '@angular/common/http'; +import { FormBuilder, Validators } from '@angular/forms'; +import { TranslateService } from '@ngx-translate/core'; + +import { EMAIL_ALREADY_USED_TYPE, LOGIN_ALREADY_USED_TYPE } from 'app/config/error.constants'; +import { RegisterService } from './register.service'; + +@Component({ + selector: 'jhi-register', + templateUrl: './register.component.html', +}) +export class RegisterComponent implements AfterViewInit { + @ViewChild('login', { static: false }) + login?: ElementRef; + + doNotMatch = false; + error = false; + errorEmailExists = false; + errorUserExists = false; + success = false; + + registerForm = this.fb.group({ + login: [ + '', + [ + Validators.required, + Validators.minLength(1), + Validators.maxLength(50), + Validators.pattern('^[a-zA-Z0-9!$&*+=?^_`{|}~.-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*$|^[_.@A-Za-z0-9-]+$'), + ], + ], + email: ['', [Validators.required, Validators.minLength(5), Validators.maxLength(254), Validators.email]], + password: ['', [Validators.required, Validators.minLength(4), Validators.maxLength(50)]], + confirmPassword: ['', [Validators.required, Validators.minLength(4), Validators.maxLength(50)]], + }); + + constructor(private translateService: TranslateService, private registerService: RegisterService, private fb: FormBuilder) {} + + ngAfterViewInit(): void { + if (this.login) { + this.login.nativeElement.focus(); + } + } + + register(): void { + this.doNotMatch = false; + this.error = false; + this.errorEmailExists = false; + this.errorUserExists = false; + + const password = this.registerForm.get(['password'])!.value; + if (password !== this.registerForm.get(['confirmPassword'])!.value) { + this.doNotMatch = true; + } else { + const login = this.registerForm.get(['login'])!.value; + const email = this.registerForm.get(['email'])!.value; + this.registerService.save({ login, email, password, langKey: this.translateService.currentLang }).subscribe( + () => (this.success = true), + response => this.processError(response) + ); + } + } + + private processError(response: HttpErrorResponse): void { + if (response.status === 400 && response.error.type === LOGIN_ALREADY_USED_TYPE) { + this.errorUserExists = true; + } else if (response.status === 400 && response.error.type === EMAIL_ALREADY_USED_TYPE) { + this.errorEmailExists = true; + } else { + this.error = true; + } + } +} diff --git a/src/main/webapp/app/account/register/register.model.ts b/src/main/webapp/app/account/register/register.model.ts new file mode 100644 index 0000000..17508b0 --- /dev/null +++ b/src/main/webapp/app/account/register/register.model.ts @@ -0,0 +1,3 @@ +export class Registration { + constructor(public login: string, public email: string, public password: string, public langKey: string) {} +} diff --git a/src/main/webapp/app/account/register/register.route.ts b/src/main/webapp/app/account/register/register.route.ts new file mode 100644 index 0000000..5252530 --- /dev/null +++ b/src/main/webapp/app/account/register/register.route.ts @@ -0,0 +1,11 @@ +import { Route } from '@angular/router'; + +import { RegisterComponent } from './register.component'; + +export const registerRoute: Route = { + path: 'register', + component: RegisterComponent, + data: { + pageTitle: 'register.title', + }, +}; diff --git a/src/main/webapp/app/account/register/register.service.ts b/src/main/webapp/app/account/register/register.service.ts new file mode 100644 index 0000000..8696564 --- /dev/null +++ b/src/main/webapp/app/account/register/register.service.ts @@ -0,0 +1,15 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Observable } from 'rxjs'; + +import { ApplicationConfigService } from 'app/core/config/application-config.service'; +import { Registration } from './register.model'; + +@Injectable({ providedIn: 'root' }) +export class RegisterService { + constructor(private http: HttpClient, private applicationConfigService: ApplicationConfigService) {} + + save(registration: Registration): Observable<{}> { + return this.http.post(this.applicationConfigService.getEndpointFor('api/register'), registration); + } +} diff --git a/src/main/webapp/app/account/settings/settings.component.html b/src/main/webapp/app/account/settings/settings.component.html new file mode 100644 index 0000000..752a136 --- /dev/null +++ b/src/main/webapp/app/account/settings/settings.component.html @@ -0,0 +1,166 @@ +
+
+
+

+ User settings for [{{ account.login }}] +

+ +
+ Settings saved! +
+ + + +
+
+ + + +
+ + Your first name is required. + + + + Your first name is required to be at least 1 character. + + + + Your first name cannot be longer than 50 characters. + +
+
+ +
+ + + +
+ + Your last name is required. + + + + Your last name is required to be at least 1 character. + + + + Your last name cannot be longer than 50 characters. + +
+
+ +
+ + + +
+ + Your email is required. + + + + Your email is invalid. + + + + Your email is required to be at least 5 characters. + + + + Your email cannot be longer than 100 characters. + +
+
+ +
+ + +
+ + +
+
+
+
diff --git a/src/main/webapp/app/account/settings/settings.component.spec.ts b/src/main/webapp/app/account/settings/settings.component.spec.ts new file mode 100644 index 0000000..257e405 --- /dev/null +++ b/src/main/webapp/app/account/settings/settings.component.spec.ts @@ -0,0 +1,96 @@ +jest.mock('@ngx-translate/core'); +jest.mock('app/core/auth/account.service'); + +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { FormBuilder } from '@angular/forms'; +import { throwError, of } from 'rxjs'; +import { TranslateService } from '@ngx-translate/core'; + +import { AccountService } from 'app/core/auth/account.service'; +import { Account } from 'app/core/auth/account.model'; + +import { SettingsComponent } from './settings.component'; + +describe('Component Tests', () => { + describe('SettingsComponent', () => { + let comp: SettingsComponent; + let fixture: ComponentFixture; + let mockAccountService: AccountService; + const account: Account = { + firstName: 'John', + lastName: 'Doe', + activated: true, + email: 'john.doe@mail.com', + langKey: 'es', + login: 'john', + authorities: [], + imageUrl: '', + }; + + beforeEach( + waitForAsync(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [SettingsComponent], + providers: [FormBuilder, TranslateService, AccountService], + }) + .overrideTemplate(SettingsComponent, '') + .compileComponents(); + }) + ); + + beforeEach(() => { + fixture = TestBed.createComponent(SettingsComponent); + comp = fixture.componentInstance; + mockAccountService = TestBed.inject(AccountService); + mockAccountService.identity = jest.fn(() => of(account)); + mockAccountService.getAuthenticationState = jest.fn(() => of(account)); + }); + + it('should send the current identity upon save', () => { + // GIVEN + mockAccountService.save = jest.fn(() => of({})); + const settingsFormValues = { + firstName: 'John', + lastName: 'Doe', + email: 'john.doe@mail.com', + langKey: 'es', + }; + + // WHEN + comp.ngOnInit(); + comp.save(); + + // THEN + expect(mockAccountService.identity).toHaveBeenCalled(); + expect(mockAccountService.save).toHaveBeenCalledWith(account); + expect(mockAccountService.authenticate).toHaveBeenCalledWith(account); + expect(comp.settingsForm.value).toEqual(settingsFormValues); + }); + + it('should notify of success upon successful save', () => { + // GIVEN + mockAccountService.save = jest.fn(() => of({})); + + // WHEN + comp.ngOnInit(); + comp.save(); + + // THEN + expect(comp.success).toBe(true); + }); + + it('should notify of error upon failed save', () => { + // GIVEN + mockAccountService.save = jest.fn(() => throwError('ERROR')); + + // WHEN + comp.ngOnInit(); + comp.save(); + + // THEN + expect(comp.success).toBe(false); + }); + }); +}); diff --git a/src/main/webapp/app/account/settings/settings.component.ts b/src/main/webapp/app/account/settings/settings.component.ts new file mode 100644 index 0000000..4740dc8 --- /dev/null +++ b/src/main/webapp/app/account/settings/settings.component.ts @@ -0,0 +1,59 @@ +import { Component, OnInit } from '@angular/core'; +import { FormBuilder, Validators } from '@angular/forms'; +import { TranslateService } from '@ngx-translate/core'; + +import { AccountService } from 'app/core/auth/account.service'; +import { Account } from 'app/core/auth/account.model'; +import { LANGUAGES } from 'app/config/language.constants'; + +@Component({ + selector: 'jhi-settings', + templateUrl: './settings.component.html', +}) +export class SettingsComponent implements OnInit { + account!: Account; + success = false; + languages = LANGUAGES; + settingsForm = this.fb.group({ + firstName: [undefined, [Validators.required, Validators.minLength(1), Validators.maxLength(50)]], + lastName: [undefined, [Validators.required, Validators.minLength(1), Validators.maxLength(50)]], + email: [undefined, [Validators.required, Validators.minLength(5), Validators.maxLength(254), Validators.email]], + langKey: [undefined], + }); + + constructor(private accountService: AccountService, private fb: FormBuilder, private translateService: TranslateService) {} + + ngOnInit(): void { + this.accountService.identity().subscribe(account => { + if (account) { + this.settingsForm.patchValue({ + firstName: account.firstName, + lastName: account.lastName, + email: account.email, + langKey: account.langKey, + }); + + this.account = account; + } + }); + } + + save(): void { + this.success = false; + + this.account.firstName = this.settingsForm.get('firstName')!.value; + this.account.lastName = this.settingsForm.get('lastName')!.value; + this.account.email = this.settingsForm.get('email')!.value; + this.account.langKey = this.settingsForm.get('langKey')!.value; + + this.accountService.save(this.account).subscribe(() => { + this.success = true; + + this.accountService.authenticate(this.account); + + if (this.account.langKey !== this.translateService.currentLang) { + this.translateService.use(this.account.langKey); + } + }); + } +} diff --git a/src/main/webapp/app/account/settings/settings.route.ts b/src/main/webapp/app/account/settings/settings.route.ts new file mode 100644 index 0000000..c940aec --- /dev/null +++ b/src/main/webapp/app/account/settings/settings.route.ts @@ -0,0 +1,13 @@ +import { Route } from '@angular/router'; + +import { UserRouteAccessService } from 'app/core/auth/user-route-access.service'; +import { SettingsComponent } from './settings.component'; + +export const settingsRoute: Route = { + path: 'settings', + component: SettingsComponent, + data: { + pageTitle: 'global.menu.account.settings', + }, + canActivate: [UserRouteAccessService], +}; diff --git a/src/main/webapp/app/admin/admin-routing.module.ts b/src/main/webapp/app/admin/admin-routing.module.ts new file mode 100644 index 0000000..2a59a05 --- /dev/null +++ b/src/main/webapp/app/admin/admin-routing.module.ts @@ -0,0 +1,44 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +/* jhipster-needle-add-admin-module-import - JHipster will add admin modules imports here */ + +@NgModule({ + imports: [ + /* jhipster-needle-add-admin-module - JHipster will add admin modules here */ + RouterModule.forChild([ + { + path: 'user-management', + loadChildren: () => import('./user-management/user-management.module').then(m => m.UserManagementModule), + data: { + pageTitle: 'userManagement.home.title', + }, + }, + { + path: 'docs', + loadChildren: () => import('./docs/docs.module').then(m => m.DocsModule), + }, + { + path: 'configuration', + loadChildren: () => import('./configuration/configuration.module').then(m => m.ConfigurationModule), + }, + { + path: 'health', + loadChildren: () => import('./health/health.module').then(m => m.HealthModule), + }, + { + path: 'logs', + loadChildren: () => import('./logs/logs.module').then(m => m.LogsModule), + }, + { + path: 'metrics', + loadChildren: () => import('./metrics/metrics.module').then(m => m.MetricsModule), + }, + { + path: 'tracker', + loadChildren: () => import('./tracker/tracker.module').then(m => m.TrackerModule), + }, + /* jhipster-needle-add-admin-route - JHipster will add admin routes here */ + ]), + ], +}) +export class AdminRoutingModule {} diff --git a/src/main/webapp/app/admin/configuration/configuration.component.html b/src/main/webapp/app/admin/configuration/configuration.component.html new file mode 100644 index 0000000..d9b91bd --- /dev/null +++ b/src/main/webapp/app/admin/configuration/configuration.component.html @@ -0,0 +1,57 @@ +
+

Configuration

+ + Filter (by prefix) + + +

Spring configuration

+ + + + + + + + + + + + + + +
+ Prefix + Properties
+ {{ bean.prefix }} + +
+
{{ property.key }}
+
+ {{ property.value | json }} +
+
+
+ +
+

+ {{ propertySource.name }} +

+ + + + + + + + + + + + + + +
PropertyValue
{{ property.key }} + {{ property.value.value }} +
+
+
diff --git a/src/main/webapp/app/admin/configuration/configuration.component.spec.ts b/src/main/webapp/app/admin/configuration/configuration.component.spec.ts new file mode 100644 index 0000000..2691405 --- /dev/null +++ b/src/main/webapp/app/admin/configuration/configuration.component.spec.ts @@ -0,0 +1,71 @@ +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { of } from 'rxjs'; + +import { ConfigurationComponent } from './configuration.component'; +import { ConfigurationService } from './configuration.service'; +import { Bean, PropertySource } from './configuration.model'; + +describe('Component Tests', () => { + describe('ConfigurationComponent', () => { + let comp: ConfigurationComponent; + let fixture: ComponentFixture; + let service: ConfigurationService; + + beforeEach( + waitForAsync(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [ConfigurationComponent], + providers: [ConfigurationService], + }) + .overrideTemplate(ConfigurationComponent, '') + .compileComponents(); + }) + ); + + beforeEach(() => { + fixture = TestBed.createComponent(ConfigurationComponent); + comp = fixture.componentInstance; + service = TestBed.inject(ConfigurationService); + }); + + describe('OnInit', () => { + it('Should call load all on init', () => { + // GIVEN + const beans: Bean[] = [ + { + prefix: 'jhipster', + properties: { + clientApp: { + name: 'jhipsterApp', + }, + }, + }, + ]; + const propertySources: PropertySource[] = [ + { + name: 'server.ports', + properties: { + 'local.server.port': { + value: '8080', + }, + }, + }, + ]; + jest.spyOn(service, 'getBeans').mockReturnValue(of(beans)); + jest.spyOn(service, 'getPropertySources').mockReturnValue(of(propertySources)); + + // WHEN + comp.ngOnInit(); + + // THEN + expect(service.getBeans).toHaveBeenCalled(); + expect(service.getPropertySources).toHaveBeenCalled(); + expect(comp.allBeans).toEqual(beans); + expect(comp.beans).toEqual(beans); + expect(comp.propertySources).toEqual(propertySources); + }); + }); + }); +}); diff --git a/src/main/webapp/app/admin/configuration/configuration.component.ts b/src/main/webapp/app/admin/configuration/configuration.component.ts new file mode 100644 index 0000000..939d1ae --- /dev/null +++ b/src/main/webapp/app/admin/configuration/configuration.component.ts @@ -0,0 +1,35 @@ +import { Component, OnInit } from '@angular/core'; + +import { ConfigurationService } from './configuration.service'; +import { Bean, PropertySource } from './configuration.model'; + +@Component({ + selector: 'jhi-configuration', + templateUrl: './configuration.component.html', +}) +export class ConfigurationComponent implements OnInit { + allBeans!: Bean[]; + beans: Bean[] = []; + beansFilter = ''; + beansAscending = true; + propertySources: PropertySource[] = []; + + constructor(private configurationService: ConfigurationService) {} + + ngOnInit(): void { + this.configurationService.getBeans().subscribe(beans => { + this.allBeans = beans; + this.filterAndSortBeans(); + }); + + this.configurationService.getPropertySources().subscribe(propertySources => (this.propertySources = propertySources)); + } + + filterAndSortBeans(): void { + const beansAscendingValue = this.beansAscending ? -1 : 1; + const beansAscendingValueReverse = this.beansAscending ? 1 : -1; + this.beans = this.allBeans + .filter(bean => !this.beansFilter || bean.prefix.toLowerCase().includes(this.beansFilter.toLowerCase())) + .sort((a, b) => (a.prefix < b.prefix ? beansAscendingValue : beansAscendingValueReverse)); + } +} diff --git a/src/main/webapp/app/admin/configuration/configuration.model.ts b/src/main/webapp/app/admin/configuration/configuration.model.ts new file mode 100644 index 0000000..6a671e0 --- /dev/null +++ b/src/main/webapp/app/admin/configuration/configuration.model.ts @@ -0,0 +1,40 @@ +export interface ConfigProps { + contexts: Contexts; +} + +export interface Contexts { + [key: string]: Context; +} + +export interface Context { + beans: Beans; + parentId?: any; +} + +export interface Beans { + [key: string]: Bean; +} + +export interface Bean { + prefix: string; + properties: any; +} + +export interface Env { + activeProfiles?: string[]; + propertySources: PropertySource[]; +} + +export interface PropertySource { + name: string; + properties: Properties; +} + +export interface Properties { + [key: string]: Property; +} + +export interface Property { + value: string; + origin?: string; +} diff --git a/src/main/webapp/app/admin/configuration/configuration.module.ts b/src/main/webapp/app/admin/configuration/configuration.module.ts new file mode 100644 index 0000000..43ade13 --- /dev/null +++ b/src/main/webapp/app/admin/configuration/configuration.module.ts @@ -0,0 +1,12 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { SharedModule } from 'app/shared/shared.module'; + +import { ConfigurationComponent } from './configuration.component'; +import { configurationRoute } from './configuration.route'; + +@NgModule({ + imports: [SharedModule, RouterModule.forChild([configurationRoute])], + declarations: [ConfigurationComponent], +}) +export class ConfigurationModule {} diff --git a/src/main/webapp/app/admin/configuration/configuration.route.ts b/src/main/webapp/app/admin/configuration/configuration.route.ts new file mode 100644 index 0000000..119e433 --- /dev/null +++ b/src/main/webapp/app/admin/configuration/configuration.route.ts @@ -0,0 +1,11 @@ +import { Route } from '@angular/router'; + +import { ConfigurationComponent } from './configuration.component'; + +export const configurationRoute: Route = { + path: '', + component: ConfigurationComponent, + data: { + pageTitle: 'configuration.title', + }, +}; diff --git a/src/main/webapp/app/admin/configuration/configuration.service.spec.ts b/src/main/webapp/app/admin/configuration/configuration.service.spec.ts new file mode 100644 index 0000000..f10fd38 --- /dev/null +++ b/src/main/webapp/app/admin/configuration/configuration.service.spec.ts @@ -0,0 +1,73 @@ +import { TestBed } from '@angular/core/testing'; +import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; + +import { ConfigurationService } from './configuration.service'; +import { Bean, ConfigProps, Env, PropertySource } from './configuration.model'; + +describe('Service Tests', () => { + describe('Logs Service', () => { + let service: ConfigurationService; + let httpMock: HttpTestingController; + let expectedResult: Bean[] | PropertySource[] | null; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + }); + + expectedResult = null; + service = TestBed.inject(ConfigurationService); + httpMock = TestBed.inject(HttpTestingController); + }); + + afterEach(() => { + httpMock.verify(); + }); + + describe('Service methods', () => { + it('should get the config', () => { + const bean: Bean = { + prefix: 'jhipster', + properties: { + clientApp: { + name: 'jhipsterApp', + }, + }, + }; + const configProps: ConfigProps = { + contexts: { + jhipster: { + beans: { + 'tech.jhipster.config.JHipsterProperties': bean, + }, + }, + }, + }; + service.getBeans().subscribe(received => (expectedResult = received)); + + const req = httpMock.expectOne({ method: 'GET' }); + req.flush(configProps); + expect(expectedResult).toEqual([bean]); + }); + + it('should get the env', () => { + const propertySources: PropertySource[] = [ + { + name: 'server.ports', + properties: { + 'local.server.port': { + value: '8080', + }, + }, + }, + ]; + const env: Env = { propertySources }; + service.getPropertySources().subscribe(received => (expectedResult = received)); + + const req = httpMock.expectOne({ method: 'GET' }); + req.flush(env); + expect(expectedResult).toEqual(propertySources); + }); + }); + }); +}); diff --git a/src/main/webapp/app/admin/configuration/configuration.service.ts b/src/main/webapp/app/admin/configuration/configuration.service.ts new file mode 100644 index 0000000..d8d3051 --- /dev/null +++ b/src/main/webapp/app/admin/configuration/configuration.service.ts @@ -0,0 +1,28 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; + +import { ApplicationConfigService } from 'app/core/config/application-config.service'; +import { Bean, Beans, ConfigProps, Env, PropertySource } from './configuration.model'; + +@Injectable({ providedIn: 'root' }) +export class ConfigurationService { + constructor(private http: HttpClient, private applicationConfigService: ApplicationConfigService) {} + + getBeans(): Observable { + return this.http.get(this.applicationConfigService.getEndpointFor('management/configprops')).pipe( + map(configProps => + Object.values( + Object.values(configProps.contexts) + .map(context => context.beans) + .reduce((allBeans: Beans, contextBeans: Beans) => ({ ...allBeans, ...contextBeans })) + ) + ) + ); + } + + getPropertySources(): Observable { + return this.http.get(this.applicationConfigService.getEndpointFor('management/env')).pipe(map(env => env.propertySources)); + } +} diff --git a/src/main/webapp/app/admin/docs/docs.component.html b/src/main/webapp/app/admin/docs/docs.component.html new file mode 100644 index 0000000..2402552 --- /dev/null +++ b/src/main/webapp/app/admin/docs/docs.component.html @@ -0,0 +1,10 @@ + diff --git a/src/main/webapp/app/admin/docs/docs.component.scss b/src/main/webapp/app/admin/docs/docs.component.scss new file mode 100644 index 0000000..541c3d7 --- /dev/null +++ b/src/main/webapp/app/admin/docs/docs.component.scss @@ -0,0 +1,6 @@ +@import '~bootstrap/scss/functions'; +@import '~bootstrap/scss/variables'; + +iframe { + background: white; +} diff --git a/src/main/webapp/app/admin/docs/docs.component.ts b/src/main/webapp/app/admin/docs/docs.component.ts new file mode 100644 index 0000000..53b4b14 --- /dev/null +++ b/src/main/webapp/app/admin/docs/docs.component.ts @@ -0,0 +1,8 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'jhi-docs', + templateUrl: './docs.component.html', + styleUrls: ['./docs.component.scss'], +}) +export class DocsComponent {} diff --git a/src/main/webapp/app/admin/docs/docs.module.ts b/src/main/webapp/app/admin/docs/docs.module.ts new file mode 100644 index 0000000..7b9bbb6 --- /dev/null +++ b/src/main/webapp/app/admin/docs/docs.module.ts @@ -0,0 +1,12 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { SharedModule } from 'app/shared/shared.module'; + +import { DocsComponent } from './docs.component'; +import { docsRoute } from './docs.route'; + +@NgModule({ + imports: [SharedModule, RouterModule.forChild([docsRoute])], + declarations: [DocsComponent], +}) +export class DocsModule {} diff --git a/src/main/webapp/app/admin/docs/docs.route.ts b/src/main/webapp/app/admin/docs/docs.route.ts new file mode 100644 index 0000000..e51770d --- /dev/null +++ b/src/main/webapp/app/admin/docs/docs.route.ts @@ -0,0 +1,11 @@ +import { Route } from '@angular/router'; + +import { DocsComponent } from './docs.component'; + +export const docsRoute: Route = { + path: '', + component: DocsComponent, + data: { + pageTitle: 'global.menu.admin.apidocs', + }, +}; diff --git a/src/main/webapp/app/admin/health/health.component.html b/src/main/webapp/app/admin/health/health.component.html new file mode 100644 index 0000000..820a9a2 --- /dev/null +++ b/src/main/webapp/app/admin/health/health.component.html @@ -0,0 +1,46 @@ +
+

+ Health Checks + + +

+ +
+ + + + + + + + + + + + + + + +
Service NameStatusDetails
+ {{ 'health.indicator.' + componentHealth.key | translate }} + + + {{ componentHealth.value!.status }} + + + + + +
+
+
diff --git a/src/main/webapp/app/admin/health/health.component.spec.ts b/src/main/webapp/app/admin/health/health.component.spec.ts new file mode 100644 index 0000000..0b3d028 --- /dev/null +++ b/src/main/webapp/app/admin/health/health.component.spec.ts @@ -0,0 +1,70 @@ +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { HttpErrorResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { of, throwError } from 'rxjs'; + +import { HealthComponent } from './health.component'; +import { HealthService } from './health.service'; +import { Health } from './health.model'; + +describe('Component Tests', () => { + describe('HealthComponent', () => { + let comp: HealthComponent; + let fixture: ComponentFixture; + let service: HealthService; + + beforeEach( + waitForAsync(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [HealthComponent], + }) + .overrideTemplate(HealthComponent, '') + .compileComponents(); + }) + ); + + beforeEach(() => { + fixture = TestBed.createComponent(HealthComponent); + comp = fixture.componentInstance; + service = TestBed.inject(HealthService); + }); + + describe('getBadgeClass', () => { + it('should get badge class', () => { + const upBadgeClass = comp.getBadgeClass('UP'); + const downBadgeClass = comp.getBadgeClass('DOWN'); + expect(upBadgeClass).toEqual('badge-success'); + expect(downBadgeClass).toEqual('badge-danger'); + }); + }); + + describe('refresh', () => { + it('should call refresh on init', () => { + // GIVEN + const health: Health = { status: 'UP', components: { mail: { status: 'UP', details: { mailDetail: 'mail' } } } }; + jest.spyOn(service, 'checkHealth').mockReturnValue(of(health)); + + // WHEN + comp.ngOnInit(); + + // THEN + expect(service.checkHealth).toHaveBeenCalled(); + expect(comp.health).toEqual(health); + }); + + it('should handle a 503 on refreshing health data', () => { + // GIVEN + const health: Health = { status: 'DOWN', components: { mail: { status: 'DOWN' } } }; + jest.spyOn(service, 'checkHealth').mockReturnValue(throwError(new HttpErrorResponse({ status: 503, error: health }))); + + // WHEN + comp.refresh(); + + // THEN + expect(service.checkHealth).toHaveBeenCalled(); + expect(comp.health).toEqual(health); + }); + }); + }); +}); diff --git a/src/main/webapp/app/admin/health/health.component.ts b/src/main/webapp/app/admin/health/health.component.ts new file mode 100644 index 0000000..a9b8a81 --- /dev/null +++ b/src/main/webapp/app/admin/health/health.component.ts @@ -0,0 +1,45 @@ +import { Component, OnInit } from '@angular/core'; +import { HttpErrorResponse } from '@angular/common/http'; +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; + +import { HealthService } from './health.service'; +import { Health, HealthDetails, HealthStatus } from './health.model'; +import { HealthModalComponent } from './modal/health-modal.component'; + +@Component({ + selector: 'jhi-health', + templateUrl: './health.component.html', +}) +export class HealthComponent implements OnInit { + health?: Health; + + constructor(private modalService: NgbModal, private healthService: HealthService) {} + + ngOnInit(): void { + this.refresh(); + } + + getBadgeClass(statusState: HealthStatus): string { + if (statusState === 'UP') { + return 'badge-success'; + } else { + return 'badge-danger'; + } + } + + refresh(): void { + this.healthService.checkHealth().subscribe( + health => (this.health = health), + (error: HttpErrorResponse) => { + if (error.status === 503) { + this.health = error.error; + } + } + ); + } + + showHealth(health: { key: string; value: HealthDetails }): void { + const modalRef = this.modalService.open(HealthModalComponent); + modalRef.componentInstance.health = health; + } +} diff --git a/src/main/webapp/app/admin/health/health.model.ts b/src/main/webapp/app/admin/health/health.model.ts new file mode 100644 index 0000000..0811289 --- /dev/null +++ b/src/main/webapp/app/admin/health/health.model.ts @@ -0,0 +1,15 @@ +export type HealthStatus = 'UP' | 'DOWN' | 'UNKNOWN' | 'OUT_OF_SERVICE'; + +export type HealthKey = 'diskSpace' | 'mail' | 'ping' | 'livenessState' | 'readinessState' | 'db'; + +export interface Health { + status: HealthStatus; + components: { + [key in HealthKey]?: HealthDetails; + }; +} + +export interface HealthDetails { + status: HealthStatus; + details?: { [key: string]: unknown }; +} diff --git a/src/main/webapp/app/admin/health/health.module.ts b/src/main/webapp/app/admin/health/health.module.ts new file mode 100644 index 0000000..f0cfd8a --- /dev/null +++ b/src/main/webapp/app/admin/health/health.module.ts @@ -0,0 +1,14 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { SharedModule } from 'app/shared/shared.module'; + +import { HealthComponent } from './health.component'; +import { HealthModalComponent } from './modal/health-modal.component'; +import { healthRoute } from './health.route'; + +@NgModule({ + imports: [SharedModule, RouterModule.forChild([healthRoute])], + declarations: [HealthComponent, HealthModalComponent], + entryComponents: [HealthModalComponent], +}) +export class HealthModule {} diff --git a/src/main/webapp/app/admin/health/health.route.ts b/src/main/webapp/app/admin/health/health.route.ts new file mode 100644 index 0000000..bd76027 --- /dev/null +++ b/src/main/webapp/app/admin/health/health.route.ts @@ -0,0 +1,11 @@ +import { Route } from '@angular/router'; + +import { HealthComponent } from './health.component'; + +export const healthRoute: Route = { + path: '', + component: HealthComponent, + data: { + pageTitle: 'health.title', + }, +}; diff --git a/src/main/webapp/app/admin/health/health.service.ts b/src/main/webapp/app/admin/health/health.service.ts new file mode 100644 index 0000000..4712a97 --- /dev/null +++ b/src/main/webapp/app/admin/health/health.service.ts @@ -0,0 +1,15 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Observable } from 'rxjs'; + +import { ApplicationConfigService } from 'app/core/config/application-config.service'; +import { Health } from './health.model'; + +@Injectable({ providedIn: 'root' }) +export class HealthService { + constructor(private http: HttpClient, private applicationConfigService: ApplicationConfigService) {} + + checkHealth(): Observable { + return this.http.get(this.applicationConfigService.getEndpointFor('management/health')); + } +} diff --git a/src/main/webapp/app/admin/health/modal/health-modal.component.html b/src/main/webapp/app/admin/health/modal/health-modal.component.html new file mode 100644 index 0000000..8dfdc42 --- /dev/null +++ b/src/main/webapp/app/admin/health/modal/health-modal.component.html @@ -0,0 +1,36 @@ + + + + + diff --git a/src/main/webapp/app/admin/health/modal/health-modal.component.spec.ts b/src/main/webapp/app/admin/health/modal/health-modal.component.spec.ts new file mode 100644 index 0000000..a8184da --- /dev/null +++ b/src/main/webapp/app/admin/health/modal/health-modal.component.spec.ts @@ -0,0 +1,116 @@ +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; + +import { HealthModalComponent } from './health-modal.component'; + +describe('Component Tests', () => { + describe('HealthModalComponent', () => { + let comp: HealthModalComponent; + let fixture: ComponentFixture; + let mockActiveModal: NgbActiveModal; + + beforeEach( + waitForAsync(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [HealthModalComponent], + providers: [NgbActiveModal], + }) + .overrideTemplate(HealthModalComponent, '') + .compileComponents(); + }) + ); + + beforeEach(() => { + fixture = TestBed.createComponent(HealthModalComponent); + comp = fixture.componentInstance; + mockActiveModal = TestBed.inject(NgbActiveModal); + }); + + describe('readableValue', () => { + it('should return stringify value', () => { + // GIVEN + comp.health = undefined; + + // WHEN + const result = comp.readableValue({ name: 'jhipster' }); + + // THEN + expect(result).toEqual('{"name":"jhipster"}'); + }); + + it('should return string value', () => { + // GIVEN + comp.health = undefined; + + // WHEN + const result = comp.readableValue('jhipster'); + + // THEN + expect(result).toEqual('jhipster'); + }); + + it('should return storage space in an human readable unit (GB)', () => { + // GIVEN + comp.health = { + key: 'diskSpace', + value: { + status: 'UP', + }, + }; + + // WHEN + const result = comp.readableValue(1073741825); + + // THEN + expect(result).toEqual('1.00 GB'); + }); + + it('should return storage space in an human readable unit (MB)', () => { + // GIVEN + comp.health = { + key: 'diskSpace', + value: { + status: 'UP', + }, + }; + + // WHEN + const result = comp.readableValue(1073741824); + + // THEN + expect(result).toEqual('1024.00 MB'); + }); + + it('should return string value', () => { + // GIVEN + comp.health = { + key: 'mail', + value: { + status: 'UP', + }, + }; + + // WHEN + const result = comp.readableValue(1234); + + // THEN + expect(result).toEqual('1234'); + }); + }); + + describe('dismiss', () => { + it('should call dismiss when dismiss modal is called', () => { + // GIVEN + const spy = jest.spyOn(mockActiveModal, 'dismiss'); + + // WHEN + comp.dismiss(); + + // THEN + expect(spy).toHaveBeenCalled(); + }); + }); + }); +}); diff --git a/src/main/webapp/app/admin/health/modal/health-modal.component.ts b/src/main/webapp/app/admin/health/modal/health-modal.component.ts new file mode 100644 index 0000000..2bd8acb --- /dev/null +++ b/src/main/webapp/app/admin/health/modal/health-modal.component.ts @@ -0,0 +1,36 @@ +import { Component } from '@angular/core'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; + +import { HealthKey, HealthDetails } from '../health.model'; + +@Component({ + selector: 'jhi-health-modal', + templateUrl: './health-modal.component.html', +}) +export class HealthModalComponent { + health?: { key: HealthKey; value: HealthDetails }; + + constructor(private activeModal: NgbActiveModal) {} + + readableValue(value: any): string { + if (this.health?.key === 'diskSpace') { + // Should display storage space in an human readable unit + const val = value / 1073741824; + if (val > 1) { + return val.toFixed(2) + ' GB'; + } else { + return (value / 1048576).toFixed(2) + ' MB'; + } + } + + if (typeof value === 'object') { + return JSON.stringify(value); + } else { + return String(value); + } + } + + dismiss(): void { + this.activeModal.dismiss(); + } +} diff --git a/src/main/webapp/app/admin/logs/log.model.ts b/src/main/webapp/app/admin/logs/log.model.ts new file mode 100644 index 0000000..83f2e15 --- /dev/null +++ b/src/main/webapp/app/admin/logs/log.model.ts @@ -0,0 +1,15 @@ +export type Level = 'TRACE' | 'DEBUG' | 'INFO' | 'WARN' | 'ERROR' | 'OFF'; + +export interface Logger { + configuredLevel: Level | null; + effectiveLevel: Level; +} + +export interface LoggersResponse { + levels: Level[]; + loggers: { [key: string]: Logger }; +} + +export class Log { + constructor(public name: string, public level: Level) {} +} diff --git a/src/main/webapp/app/admin/logs/logs.component.html b/src/main/webapp/app/admin/logs/logs.component.html new file mode 100644 index 0000000..ba24dc1 --- /dev/null +++ b/src/main/webapp/app/admin/logs/logs.component.html @@ -0,0 +1,72 @@ +
+

Logs

+ +

There are {{ loggers.length }} loggers.

+ + Filter + + + + + + + + + + + + + + +
Name Level
+ {{ logger.name | slice: 0:140 }} + + + + + + + + + + + + +
+
diff --git a/src/main/webapp/app/admin/logs/logs.component.spec.ts b/src/main/webapp/app/admin/logs/logs.component.spec.ts new file mode 100644 index 0000000..f50de02 --- /dev/null +++ b/src/main/webapp/app/admin/logs/logs.component.spec.ts @@ -0,0 +1,87 @@ +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { of } from 'rxjs'; + +import { LogsComponent } from './logs.component'; +import { LogsService } from './logs.service'; +import { Log, LoggersResponse } from './log.model'; + +describe('Component Tests', () => { + describe('LogsComponent', () => { + let comp: LogsComponent; + let fixture: ComponentFixture; + let service: LogsService; + + beforeEach( + waitForAsync(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [LogsComponent], + providers: [LogsService], + }) + .overrideTemplate(LogsComponent, '') + .compileComponents(); + }) + ); + + beforeEach(() => { + fixture = TestBed.createComponent(LogsComponent); + comp = fixture.componentInstance; + service = TestBed.inject(LogsService); + }); + + describe('OnInit', () => { + it('should set all default values correctly', () => { + expect(comp.filter).toBe(''); + expect(comp.orderProp).toBe('name'); + expect(comp.ascending).toBe(true); + }); + + it('Should call load all on init', () => { + // GIVEN + const log = new Log('main', 'WARN'); + jest.spyOn(service, 'findAll').mockReturnValue( + of({ + loggers: { + main: { + effectiveLevel: 'WARN', + }, + }, + } as unknown as LoggersResponse) + ); + + // WHEN + comp.ngOnInit(); + + // THEN + expect(service.findAll).toHaveBeenCalled(); + expect(comp.loggers?.[0]).toEqual(expect.objectContaining(log)); + }); + }); + + describe('change log level', () => { + it('should change log level correctly', () => { + // GIVEN + const log = new Log('main', 'ERROR'); + jest.spyOn(service, 'changeLevel').mockReturnValue(of({})); + jest.spyOn(service, 'findAll').mockReturnValue( + of({ + loggers: { + main: { + effectiveLevel: 'ERROR', + }, + }, + } as unknown as LoggersResponse) + ); + + // WHEN + comp.changeLevel('main', 'ERROR'); + + // THEN + expect(service.changeLevel).toHaveBeenCalled(); + expect(service.findAll).toHaveBeenCalled(); + expect(comp.loggers?.[0]).toEqual(expect.objectContaining(log)); + }); + }); + }); +}); diff --git a/src/main/webapp/app/admin/logs/logs.component.ts b/src/main/webapp/app/admin/logs/logs.component.ts new file mode 100644 index 0000000..6320acc --- /dev/null +++ b/src/main/webapp/app/admin/logs/logs.component.ts @@ -0,0 +1,48 @@ +import { Component, OnInit } from '@angular/core'; + +import { Log, LoggersResponse, Level } from './log.model'; +import { LogsService } from './logs.service'; + +@Component({ + selector: 'jhi-logs', + templateUrl: './logs.component.html', +}) +export class LogsComponent implements OnInit { + loggers?: Log[]; + filteredAndOrderedLoggers?: Log[]; + filter = ''; + orderProp: keyof Log = 'name'; + ascending = true; + + constructor(private logsService: LogsService) {} + + ngOnInit(): void { + this.findAndExtractLoggers(); + } + + changeLevel(name: string, level: Level): void { + this.logsService.changeLevel(name, level).subscribe(() => this.findAndExtractLoggers()); + } + + filterAndSort(): void { + this.filteredAndOrderedLoggers = this.loggers!.filter( + logger => !this.filter || logger.name.toLowerCase().includes(this.filter.toLowerCase()) + ).sort((a, b) => { + if (a[this.orderProp] < b[this.orderProp]) { + return this.ascending ? -1 : 1; + } else if (a[this.orderProp] > b[this.orderProp]) { + return this.ascending ? 1 : -1; + } else if (this.orderProp === 'level') { + return a.name < b.name ? -1 : 1; + } + return 0; + }); + } + + private findAndExtractLoggers(): void { + this.logsService.findAll().subscribe((response: LoggersResponse) => { + this.loggers = Object.entries(response.loggers).map(([key, logger]) => new Log(key, logger.effectiveLevel)); + this.filterAndSort(); + }); + } +} diff --git a/src/main/webapp/app/admin/logs/logs.module.ts b/src/main/webapp/app/admin/logs/logs.module.ts new file mode 100644 index 0000000..720af27 --- /dev/null +++ b/src/main/webapp/app/admin/logs/logs.module.ts @@ -0,0 +1,12 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { SharedModule } from 'app/shared/shared.module'; + +import { LogsComponent } from './logs.component'; +import { logsRoute } from './logs.route'; + +@NgModule({ + imports: [SharedModule, RouterModule.forChild([logsRoute])], + declarations: [LogsComponent], +}) +export class LogsModule {} diff --git a/src/main/webapp/app/admin/logs/logs.route.ts b/src/main/webapp/app/admin/logs/logs.route.ts new file mode 100644 index 0000000..a8ffdcd --- /dev/null +++ b/src/main/webapp/app/admin/logs/logs.route.ts @@ -0,0 +1,11 @@ +import { Route } from '@angular/router'; + +import { LogsComponent } from './logs.component'; + +export const logsRoute: Route = { + path: '', + component: LogsComponent, + data: { + pageTitle: 'logs.title', + }, +}; diff --git a/src/main/webapp/app/admin/logs/logs.service.spec.ts b/src/main/webapp/app/admin/logs/logs.service.spec.ts new file mode 100644 index 0000000..4c1e90f --- /dev/null +++ b/src/main/webapp/app/admin/logs/logs.service.spec.ts @@ -0,0 +1,33 @@ +import { TestBed } from '@angular/core/testing'; +import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; + +import { LogsService } from './logs.service'; + +describe('Service Tests', () => { + describe('Logs Service', () => { + let service: LogsService; + let httpMock: HttpTestingController; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + }); + + service = TestBed.inject(LogsService); + httpMock = TestBed.inject(HttpTestingController); + }); + + afterEach(() => { + httpMock.verify(); + }); + + describe('Service methods', () => { + it('should change log level', () => { + service.changeLevel('main', 'ERROR').subscribe(); + + const req = httpMock.expectOne({ method: 'POST' }); + expect(req.request.body).toEqual({ configuredLevel: 'ERROR' }); + }); + }); + }); +}); diff --git a/src/main/webapp/app/admin/logs/logs.service.ts b/src/main/webapp/app/admin/logs/logs.service.ts new file mode 100644 index 0000000..a6d08ed --- /dev/null +++ b/src/main/webapp/app/admin/logs/logs.service.ts @@ -0,0 +1,19 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Observable } from 'rxjs'; + +import { ApplicationConfigService } from 'app/core/config/application-config.service'; +import { LoggersResponse, Level } from './log.model'; + +@Injectable({ providedIn: 'root' }) +export class LogsService { + constructor(private http: HttpClient, private applicationConfigService: ApplicationConfigService) {} + + changeLevel(name: string, configuredLevel: Level): Observable<{}> { + return this.http.post(this.applicationConfigService.getEndpointFor('management/loggers/' + name), { configuredLevel }); + } + + findAll(): Observable { + return this.http.get(this.applicationConfigService.getEndpointFor('management/loggers')); + } +} diff --git a/src/main/webapp/app/admin/metrics/blocks/jvm-memory/jvm-memory.component.html b/src/main/webapp/app/admin/metrics/blocks/jvm-memory/jvm-memory.component.html new file mode 100644 index 0000000..61069ce --- /dev/null +++ b/src/main/webapp/app/admin/metrics/blocks/jvm-memory/jvm-memory.component.html @@ -0,0 +1,28 @@ +

Memory

+ +
+
+ + {{ entry.key }} + ({{ entry.value.used / 1048576 | number: '1.0-0' }}M / {{ entry.value.max / 1048576 | number: '1.0-0' }}M) + + +
Committed : {{ entry.value.committed / 1048576 | number: '1.0-0' }}M
+ + {{ entry.key }} {{ entry.value.used / 1048576 | number: '1.0-0' }}M + + + {{ (entry.value.used * 100) / entry.value.max | number: '1.0-0' }}% + +
+
diff --git a/src/main/webapp/app/admin/metrics/blocks/jvm-memory/jvm-memory.component.ts b/src/main/webapp/app/admin/metrics/blocks/jvm-memory/jvm-memory.component.ts new file mode 100644 index 0000000..d434b8a --- /dev/null +++ b/src/main/webapp/app/admin/metrics/blocks/jvm-memory/jvm-memory.component.ts @@ -0,0 +1,19 @@ +import { Component, Input } from '@angular/core'; + +import { JvmMetrics } from 'app/admin/metrics/metrics.model'; + +@Component({ + selector: 'jhi-jvm-memory', + templateUrl: './jvm-memory.component.html', +}) +export class JvmMemoryComponent { + /** + * object containing all jvm memory metrics + */ + @Input() jvmMemoryMetrics?: { [key: string]: JvmMetrics }; + + /** + * boolean field saying if the metrics are in the process of being updated + */ + @Input() updating?: boolean; +} diff --git a/src/main/webapp/app/admin/metrics/blocks/jvm-threads/jvm-threads.component.html b/src/main/webapp/app/admin/metrics/blocks/jvm-threads/jvm-threads.component.html new file mode 100644 index 0000000..55ecab6 --- /dev/null +++ b/src/main/webapp/app/admin/metrics/blocks/jvm-threads/jvm-threads.component.html @@ -0,0 +1,55 @@ +

Threads

+ +Runnable {{ threadStats.threadDumpRunnable }} + + + {{ (threadStats.threadDumpRunnable * 100) / threadStats.threadDumpAll | number: '1.0-0' }}% + + +Timed Waiting ({{ threadStats.threadDumpTimedWaiting }}) + + + {{ (threadStats.threadDumpTimedWaiting * 100) / threadStats.threadDumpAll | number: '1.0-0' }}% + + +Waiting ({{ threadStats.threadDumpWaiting }}) + + + {{ (threadStats.threadDumpWaiting * 100) / threadStats.threadDumpAll | number: '1.0-0' }}% + + +Blocked ({{ threadStats.threadDumpBlocked }}) + + + {{ (threadStats.threadDumpBlocked * 100) / threadStats.threadDumpAll | number: '1.0-0' }}% + + +
Total: {{ threadStats.threadDumpAll }}
+ + diff --git a/src/main/webapp/app/admin/metrics/blocks/jvm-threads/jvm-threads.component.ts b/src/main/webapp/app/admin/metrics/blocks/jvm-threads/jvm-threads.component.ts new file mode 100644 index 0000000..de98fb2 --- /dev/null +++ b/src/main/webapp/app/admin/metrics/blocks/jvm-threads/jvm-threads.component.ts @@ -0,0 +1,55 @@ +import { Component, Input } from '@angular/core'; +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; + +import { Thread, ThreadState } from 'app/admin/metrics/metrics.model'; +import { MetricsModalThreadsComponent } from '../metrics-modal-threads/metrics-modal-threads.component'; + +@Component({ + selector: 'jhi-jvm-threads', + templateUrl: './jvm-threads.component.html', +}) +export class JvmThreadsComponent { + threadStats = { + threadDumpAll: 0, + threadDumpRunnable: 0, + threadDumpTimedWaiting: 0, + threadDumpWaiting: 0, + threadDumpBlocked: 0, + }; + + @Input() + set threads(threads: Thread[] | undefined) { + this._threads = threads; + + threads?.forEach(thread => { + if (thread.threadState === ThreadState.Runnable) { + this.threadStats.threadDumpRunnable += 1; + } else if (thread.threadState === ThreadState.Waiting) { + this.threadStats.threadDumpWaiting += 1; + } else if (thread.threadState === ThreadState.TimedWaiting) { + this.threadStats.threadDumpTimedWaiting += 1; + } else if (thread.threadState === ThreadState.Blocked) { + this.threadStats.threadDumpBlocked += 1; + } + }); + + this.threadStats.threadDumpAll = + this.threadStats.threadDumpRunnable + + this.threadStats.threadDumpWaiting + + this.threadStats.threadDumpTimedWaiting + + this.threadStats.threadDumpBlocked; + } + + get threads(): Thread[] | undefined { + return this._threads; + } + + private _threads: Thread[] | undefined; + + constructor(private modalService: NgbModal) {} + + open(): void { + const modalRef = this.modalService.open(MetricsModalThreadsComponent); + modalRef.componentInstance.threads = this.threads; + } +} diff --git a/src/main/webapp/app/admin/metrics/blocks/metrics-cache/metrics-cache.component.html b/src/main/webapp/app/admin/metrics/blocks/metrics-cache/metrics-cache.component.html new file mode 100644 index 0000000..4384c58 --- /dev/null +++ b/src/main/webapp/app/admin/metrics/blocks/metrics-cache/metrics-cache.component.html @@ -0,0 +1,42 @@ +

Cache statistics

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Cache nameCache HitsCache MissesCache GetsCache PutsCache RemovalsCache EvictionsCache Hit %Cache Miss %
{{ entry.key }}{{ entry.value['cache.gets.hit'] }}{{ entry.value['cache.gets.miss'] }}{{ entry.value['cache.gets.hit'] + entry.value['cache.gets.miss'] }}{{ entry.value['cache.puts'] }}{{ entry.value['cache.removals'] }}{{ entry.value['cache.evictions'] }} + {{ + filterNaN((100 * entry.value['cache.gets.hit']) / (entry.value['cache.gets.hit'] + entry.value['cache.gets.miss'])) + | number: '1.0-4' + }} + + {{ + filterNaN((100 * entry.value['cache.gets.miss']) / (entry.value['cache.gets.hit'] + entry.value['cache.gets.miss'])) + | number: '1.0-4' + }} +
+
diff --git a/src/main/webapp/app/admin/metrics/blocks/metrics-cache/metrics-cache.component.ts b/src/main/webapp/app/admin/metrics/blocks/metrics-cache/metrics-cache.component.ts new file mode 100644 index 0000000..6d72146 --- /dev/null +++ b/src/main/webapp/app/admin/metrics/blocks/metrics-cache/metrics-cache.component.ts @@ -0,0 +1,23 @@ +import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; + +import { CacheMetrics } from 'app/admin/metrics/metrics.model'; +import { filterNaN } from 'app/core/util/operators'; + +@Component({ + selector: 'jhi-metrics-cache', + templateUrl: './metrics-cache.component.html', + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class MetricsCacheComponent { + /** + * object containing all cache related metrics + */ + @Input() cacheMetrics?: { [key: string]: CacheMetrics }; + + /** + * boolean field saying if the metrics are in the process of being updated + */ + @Input() updating?: boolean; + + filterNaN = (input: number): number => filterNaN(input); +} diff --git a/src/main/webapp/app/admin/metrics/blocks/metrics-datasource/metrics-datasource.component.html b/src/main/webapp/app/admin/metrics/blocks/metrics-datasource/metrics-datasource.component.html new file mode 100644 index 0000000..2717f65 --- /dev/null +++ b/src/main/webapp/app/admin/metrics/blocks/metrics-datasource/metrics-datasource.component.html @@ -0,0 +1,57 @@ +

DataSource statistics (time in millisecond)

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Connection Pool Usage (active: {{ datasourceMetrics.active.value }}, min: + {{ datasourceMetrics.min.value }}, max: {{ datasourceMetrics.max.value }}, idle: {{ datasourceMetrics.idle.value }}) + CountMeanMinp50p75p95p99Max
Acquire{{ datasourceMetrics.acquire.count }}{{ filterNaN(datasourceMetrics.acquire.mean) | number: '1.0-2' }}{{ datasourceMetrics.acquire['0.0'] | number: '1.0-3' }}{{ datasourceMetrics.acquire['0.5'] | number: '1.0-3' }}{{ datasourceMetrics.acquire['0.75'] | number: '1.0-3' }}{{ datasourceMetrics.acquire['0.95'] | number: '1.0-3' }}{{ datasourceMetrics.acquire['0.99'] | number: '1.0-3' }}{{ filterNaN(datasourceMetrics.acquire.max) | number: '1.0-2' }}
Creation{{ datasourceMetrics.creation.count }}{{ filterNaN(datasourceMetrics.creation.mean) | number: '1.0-2' }}{{ datasourceMetrics.creation['0.0'] | number: '1.0-3' }}{{ datasourceMetrics.creation['0.5'] | number: '1.0-3' }}{{ datasourceMetrics.creation['0.75'] | number: '1.0-3' }}{{ datasourceMetrics.creation['0.95'] | number: '1.0-3' }}{{ datasourceMetrics.creation['0.99'] | number: '1.0-3' }}{{ filterNaN(datasourceMetrics.creation.max) | number: '1.0-2' }}
Usage{{ datasourceMetrics.usage.count }}{{ filterNaN(datasourceMetrics.usage.mean) | number: '1.0-2' }}{{ datasourceMetrics.usage['0.0'] | number: '1.0-3' }}{{ datasourceMetrics.usage['0.5'] | number: '1.0-3' }}{{ datasourceMetrics.usage['0.75'] | number: '1.0-3' }}{{ datasourceMetrics.usage['0.95'] | number: '1.0-3' }}{{ datasourceMetrics.usage['0.99'] | number: '1.0-3' }}{{ filterNaN(datasourceMetrics.usage.max) | number: '1.0-2' }}
+
diff --git a/src/main/webapp/app/admin/metrics/blocks/metrics-datasource/metrics-datasource.component.ts b/src/main/webapp/app/admin/metrics/blocks/metrics-datasource/metrics-datasource.component.ts new file mode 100644 index 0000000..eefcf58 --- /dev/null +++ b/src/main/webapp/app/admin/metrics/blocks/metrics-datasource/metrics-datasource.component.ts @@ -0,0 +1,23 @@ +import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; + +import { Databases } from 'app/admin/metrics/metrics.model'; +import { filterNaN } from 'app/core/util/operators'; + +@Component({ + selector: 'jhi-metrics-datasource', + templateUrl: './metrics-datasource.component.html', + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class MetricsDatasourceComponent { + /** + * object containing all datasource related metrics + */ + @Input() datasourceMetrics?: Databases; + + /** + * boolean field saying if the metrics are in the process of being updated + */ + @Input() updating?: boolean; + + filterNaN = (input: number): number => filterNaN(input); +} diff --git a/src/main/webapp/app/admin/metrics/blocks/metrics-endpoints-requests/metrics-endpoints-requests.component.html b/src/main/webapp/app/admin/metrics/blocks/metrics-endpoints-requests/metrics-endpoints-requests.component.html new file mode 100644 index 0000000..ee6ab22 --- /dev/null +++ b/src/main/webapp/app/admin/metrics/blocks/metrics-endpoints-requests/metrics-endpoints-requests.component.html @@ -0,0 +1,24 @@ +

Endpoints requests (time in millisecond)

+ +
+ + + + + + + + + + + + + + + + + + + +
MethodEndpoint urlCountMean
{{ method.key }}{{ entry.key }}{{ method.value!.count }}{{ method.value!.mean | number: '1.0-3' }}
+
diff --git a/src/main/webapp/app/admin/metrics/blocks/metrics-endpoints-requests/metrics-endpoints-requests.component.ts b/src/main/webapp/app/admin/metrics/blocks/metrics-endpoints-requests/metrics-endpoints-requests.component.ts new file mode 100644 index 0000000..aa4ceb4 --- /dev/null +++ b/src/main/webapp/app/admin/metrics/blocks/metrics-endpoints-requests/metrics-endpoints-requests.component.ts @@ -0,0 +1,19 @@ +import { Component, Input } from '@angular/core'; + +import { Services } from 'app/admin/metrics/metrics.model'; + +@Component({ + selector: 'jhi-metrics-endpoints-requests', + templateUrl: './metrics-endpoints-requests.component.html', +}) +export class MetricsEndpointsRequestsComponent { + /** + * object containing service related metrics + */ + @Input() endpointsRequestsMetrics?: Services; + + /** + * boolean field saying if the metrics are in the process of being updated + */ + @Input() updating?: boolean; +} diff --git a/src/main/webapp/app/admin/metrics/blocks/metrics-garbagecollector/metrics-garbagecollector.component.html b/src/main/webapp/app/admin/metrics/blocks/metrics-garbagecollector/metrics-garbagecollector.component.html new file mode 100644 index 0000000..a930492 --- /dev/null +++ b/src/main/webapp/app/admin/metrics/blocks/metrics-garbagecollector/metrics-garbagecollector.component.html @@ -0,0 +1,92 @@ +

Garbage collector statistics

+ +
+
+
+ + GC Live Data Size/GC Max Data Size ({{ garbageCollectorMetrics['jvm.gc.live.data.size'] / 1048576 | number: '1.0-0' }}M / + {{ garbageCollectorMetrics['jvm.gc.max.data.size'] / 1048576 | number: '1.0-0' }}M) + + + + + {{ + (100 * garbageCollectorMetrics['jvm.gc.live.data.size']) / garbageCollectorMetrics['jvm.gc.max.data.size'] | number: '1.0-2' + }}% + + +
+
+ +
+
+ + GC Memory Promoted/GC Memory Allocated ({{ garbageCollectorMetrics['jvm.gc.memory.promoted'] / 1048576 | number: '1.0-0' }}M / + {{ garbageCollectorMetrics['jvm.gc.memory.allocated'] / 1048576 | number: '1.0-0' }}M) + + + + + {{ + (100 * garbageCollectorMetrics['jvm.gc.memory.promoted']) / garbageCollectorMetrics['jvm.gc.memory.allocated'] + | number: '1.0-2' + }}% + + +
+
+ +
+
+
Classes loaded
+
{{ garbageCollectorMetrics.classesLoaded }}
+
+
+
Classes unloaded
+
{{ garbageCollectorMetrics.classesUnloaded }}
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
CountMeanMinp50p75p95p99Max
jvm.gc.pause{{ garbageCollectorMetrics['jvm.gc.pause'].count }}{{ garbageCollectorMetrics['jvm.gc.pause'].mean | number: '1.0-3' }}{{ garbageCollectorMetrics['jvm.gc.pause']['0.0'] | number: '1.0-3' }}{{ garbageCollectorMetrics['jvm.gc.pause']['0.5'] | number: '1.0-3' }}{{ garbageCollectorMetrics['jvm.gc.pause']['0.75'] | number: '1.0-3' }}{{ garbageCollectorMetrics['jvm.gc.pause']['0.95'] | number: '1.0-3' }}{{ garbageCollectorMetrics['jvm.gc.pause']['0.99'] | number: '1.0-3' }}{{ garbageCollectorMetrics['jvm.gc.pause'].max | number: '1.0-3' }}
+
+
diff --git a/src/main/webapp/app/admin/metrics/blocks/metrics-garbagecollector/metrics-garbagecollector.component.ts b/src/main/webapp/app/admin/metrics/blocks/metrics-garbagecollector/metrics-garbagecollector.component.ts new file mode 100644 index 0000000..bbf11e0 --- /dev/null +++ b/src/main/webapp/app/admin/metrics/blocks/metrics-garbagecollector/metrics-garbagecollector.component.ts @@ -0,0 +1,19 @@ +import { Component, Input } from '@angular/core'; + +import { GarbageCollector } from 'app/admin/metrics/metrics.model'; + +@Component({ + selector: 'jhi-metrics-garbagecollector', + templateUrl: './metrics-garbagecollector.component.html', +}) +export class MetricsGarbageCollectorComponent { + /** + * object containing garbage collector related metrics + */ + @Input() garbageCollectorMetrics?: GarbageCollector; + + /** + * boolean field saying if the metrics are in the process of being updated + */ + @Input() updating?: boolean; +} diff --git a/src/main/webapp/app/admin/metrics/blocks/metrics-modal-threads/metrics-modal-threads.component.html b/src/main/webapp/app/admin/metrics/blocks/metrics-modal-threads/metrics-modal-threads.component.html new file mode 100644 index 0000000..f3dab2b --- /dev/null +++ b/src/main/webapp/app/admin/metrics/blocks/metrics-modal-threads/metrics-modal-threads.component.html @@ -0,0 +1,90 @@ + + + + diff --git a/src/main/webapp/app/admin/metrics/blocks/metrics-modal-threads/metrics-modal-threads.component.ts b/src/main/webapp/app/admin/metrics/blocks/metrics-modal-threads/metrics-modal-threads.component.ts new file mode 100644 index 0000000..895e9fc --- /dev/null +++ b/src/main/webapp/app/admin/metrics/blocks/metrics-modal-threads/metrics-modal-threads.component.ts @@ -0,0 +1,59 @@ +import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; + +import { Thread, ThreadState } from 'app/admin/metrics/metrics.model'; + +@Component({ + selector: 'jhi-thread-modal', + templateUrl: './metrics-modal-threads.component.html', + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class MetricsModalThreadsComponent implements OnInit { + ThreadState = ThreadState; + threadStateFilter?: ThreadState; + threads?: Thread[]; + threadDumpAll = 0; + threadDumpBlocked = 0; + threadDumpRunnable = 0; + threadDumpTimedWaiting = 0; + threadDumpWaiting = 0; + + constructor(private activeModal: NgbActiveModal) {} + + ngOnInit(): void { + this.threads?.forEach(thread => { + if (thread.threadState === ThreadState.Runnable) { + this.threadDumpRunnable += 1; + } else if (thread.threadState === ThreadState.Waiting) { + this.threadDumpWaiting += 1; + } else if (thread.threadState === ThreadState.TimedWaiting) { + this.threadDumpTimedWaiting += 1; + } else if (thread.threadState === ThreadState.Blocked) { + this.threadDumpBlocked += 1; + } + }); + + this.threadDumpAll = this.threadDumpRunnable + this.threadDumpWaiting + this.threadDumpTimedWaiting + this.threadDumpBlocked; + } + + getBadgeClass(threadState: ThreadState): string { + if (threadState === ThreadState.Runnable) { + return 'badge-success'; + } else if (threadState === ThreadState.Waiting) { + return 'badge-info'; + } else if (threadState === ThreadState.TimedWaiting) { + return 'badge-warning'; + } else if (threadState === ThreadState.Blocked) { + return 'badge-danger'; + } + return ''; + } + + getThreads(): Thread[] { + return this.threads?.filter(thread => !this.threadStateFilter || thread.threadState === this.threadStateFilter) ?? []; + } + + dismiss(): void { + this.activeModal.dismiss(); + } +} diff --git a/src/main/webapp/app/admin/metrics/blocks/metrics-request/metrics-request.component.html b/src/main/webapp/app/admin/metrics/blocks/metrics-request/metrics-request.component.html new file mode 100644 index 0000000..bcf256d --- /dev/null +++ b/src/main/webapp/app/admin/metrics/blocks/metrics-request/metrics-request.component.html @@ -0,0 +1,26 @@ +

HTTP requests (time in millisecond)

+ + + + + + + + + + + + + + + + + + +
CodeCountMeanMax
{{ entry.key }} + + {{ entry.value.count }} + + + {{ filterNaN(entry.value.mean) | number: '1.0-2' }} + {{ entry.value.max | number: '1.0-2' }}
diff --git a/src/main/webapp/app/admin/metrics/blocks/metrics-request/metrics-request.component.ts b/src/main/webapp/app/admin/metrics/blocks/metrics-request/metrics-request.component.ts new file mode 100644 index 0000000..6a7cbc7 --- /dev/null +++ b/src/main/webapp/app/admin/metrics/blocks/metrics-request/metrics-request.component.ts @@ -0,0 +1,23 @@ +import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; + +import { HttpServerRequests } from 'app/admin/metrics/metrics.model'; +import { filterNaN } from 'app/core/util/operators'; + +@Component({ + selector: 'jhi-metrics-request', + templateUrl: './metrics-request.component.html', + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class MetricsRequestComponent { + /** + * object containing http request related metrics + */ + @Input() requestMetrics?: HttpServerRequests; + + /** + * boolean field saying if the metrics are in the process of being updated + */ + @Input() updating?: boolean; + + filterNaN = (input: number): number => filterNaN(input); +} diff --git a/src/main/webapp/app/admin/metrics/blocks/metrics-system/metrics-system.component.html b/src/main/webapp/app/admin/metrics/blocks/metrics-system/metrics-system.component.html new file mode 100644 index 0000000..a4ade7d --- /dev/null +++ b/src/main/webapp/app/admin/metrics/blocks/metrics-system/metrics-system.component.html @@ -0,0 +1,51 @@ +

System

+ + +
+
Uptime
+
{{ convertMillisecondsToDuration(systemMetrics['process.uptime']) }}
+
+ +
+
Start time
+
{{ systemMetrics['process.start.time'] | date: 'full' }}
+
+ +
+
Process CPU usage
+
{{ 100 * systemMetrics['process.cpu.usage'] | number: '1.0-2' }} %
+
+ + + {{ 100 * systemMetrics['process.cpu.usage'] | number: '1.0-2' }} % + + +
+
System CPU usage
+
{{ 100 * systemMetrics['system.cpu.usage'] | number: '1.0-2' }} %
+
+ + + {{ 100 * systemMetrics['system.cpu.usage'] | number: '1.0-2' }} % + + +
+
System CPU count
+
{{ systemMetrics['system.cpu.count'] }}
+
+ +
+
System 1m Load average
+
{{ systemMetrics['system.load.average.1m'] | number: '1.0-2' }}
+
+ +
+
Process files max
+
{{ systemMetrics['process.files.max'] | number: '1.0-0' }}
+
+ +
+
Process files open
+
{{ systemMetrics['process.files.open'] | number: '1.0-0' }}
+
+
diff --git a/src/main/webapp/app/admin/metrics/blocks/metrics-system/metrics-system.component.ts b/src/main/webapp/app/admin/metrics/blocks/metrics-system/metrics-system.component.ts new file mode 100644 index 0000000..ac8cee7 --- /dev/null +++ b/src/main/webapp/app/admin/metrics/blocks/metrics-system/metrics-system.component.ts @@ -0,0 +1,43 @@ +import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; + +import { ProcessMetrics } from 'app/admin/metrics/metrics.model'; + +@Component({ + selector: 'jhi-metrics-system', + templateUrl: './metrics-system.component.html', + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class MetricsSystemComponent { + /** + * object containing thread related metrics + */ + @Input() systemMetrics?: ProcessMetrics; + + /** + * boolean field saying if the metrics are in the process of being updated + */ + @Input() updating?: boolean; + + convertMillisecondsToDuration(ms: number): string { + const times = { + year: 31557600000, + month: 2629746000, + day: 86400000, + hour: 3600000, + minute: 60000, + second: 1000, + }; + let timeString = ''; + for (const [key, value] of Object.entries(times)) { + if (Math.floor(ms / value) > 0) { + let plural = ''; + if (Math.floor(ms / value) > 1) { + plural = 's'; + } + timeString += Math.floor(ms / value).toString() + ' ' + key.toString() + plural + ' '; + ms = ms - value * Math.floor(ms / value); + } + } + return timeString; + } +} diff --git a/src/main/webapp/app/admin/metrics/metrics.component.html b/src/main/webapp/app/admin/metrics/metrics.component.html new file mode 100644 index 0000000..7f2401d --- /dev/null +++ b/src/main/webapp/app/admin/metrics/metrics.component.html @@ -0,0 +1,51 @@ +
+

+ Application Metrics + + +

+ +

JVM Metrics

+ +
+ + + + + +
+ + + +
Updating...
+ + + + + + + + +
diff --git a/src/main/webapp/app/admin/metrics/metrics.component.spec.ts b/src/main/webapp/app/admin/metrics/metrics.component.spec.ts new file mode 100644 index 0000000..136d803 --- /dev/null +++ b/src/main/webapp/app/admin/metrics/metrics.component.spec.ts @@ -0,0 +1,45 @@ +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { of } from 'rxjs'; + +import { MetricsComponent } from './metrics.component'; +import { MetricsService } from './metrics.service'; +import { Metrics } from './metrics.model'; + +describe('Component Tests', () => { + describe('MetricsComponent', () => { + let comp: MetricsComponent; + let fixture: ComponentFixture; + let service: MetricsService; + + beforeEach( + waitForAsync(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [MetricsComponent], + }) + .overrideTemplate(MetricsComponent, '') + .compileComponents(); + }) + ); + + beforeEach(() => { + fixture = TestBed.createComponent(MetricsComponent); + comp = fixture.componentInstance; + service = TestBed.inject(MetricsService); + }); + + describe('refresh', () => { + it('should call refresh on init', () => { + // GIVEN + jest.spyOn(service, 'getMetrics').mockReturnValue(of({} as Metrics)); + + // WHEN + comp.ngOnInit(); + + // THEN + expect(service.getMetrics).toHaveBeenCalled(); + }); + }); + }); +}); diff --git a/src/main/webapp/app/admin/metrics/metrics.component.ts b/src/main/webapp/app/admin/metrics/metrics.component.ts new file mode 100644 index 0000000..f633ee1 --- /dev/null +++ b/src/main/webapp/app/admin/metrics/metrics.component.ts @@ -0,0 +1,40 @@ +import { Component, OnInit, ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core'; +import { combineLatest } from 'rxjs'; + +import { MetricsService } from './metrics.service'; +import { Metrics, Thread } from './metrics.model'; + +@Component({ + selector: 'jhi-metrics', + templateUrl: './metrics.component.html', + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class MetricsComponent implements OnInit { + metrics?: Metrics; + threads?: Thread[]; + updatingMetrics = true; + + constructor(private metricsService: MetricsService, private changeDetector: ChangeDetectorRef) {} + + ngOnInit(): void { + this.refresh(); + } + + refresh(): void { + this.updatingMetrics = true; + combineLatest([this.metricsService.getMetrics(), this.metricsService.threadDump()]).subscribe(([metrics, threadDump]) => { + this.metrics = metrics; + this.threads = threadDump.threads; + this.updatingMetrics = false; + this.changeDetector.markForCheck(); + }); + } + + metricsKeyExists(key: keyof Metrics): boolean { + return Boolean(this.metrics?.[key]); + } + + metricsKeyExistsAndObjectNotEmpty(key: keyof Metrics): boolean { + return Boolean(this.metrics?.[key] && JSON.stringify(this.metrics[key]) !== '{}'); + } +} diff --git a/src/main/webapp/app/admin/metrics/metrics.model.ts b/src/main/webapp/app/admin/metrics/metrics.model.ts new file mode 100644 index 0000000..d9576a9 --- /dev/null +++ b/src/main/webapp/app/admin/metrics/metrics.model.ts @@ -0,0 +1,159 @@ +export interface Metrics { + jvm: { [key: string]: JvmMetrics }; + databases: Databases; + 'http.server.requests': HttpServerRequests; + cache: { [key: string]: CacheMetrics }; + garbageCollector: GarbageCollector; + services: Services; + processMetrics: ProcessMetrics; +} + +export interface JvmMetrics { + committed: number; + max: number; + used: number; +} + +export interface Databases { + min: Value; + idle: Value; + max: Value; + usage: MetricsWithPercentile; + pending: Value; + active: Value; + acquire: MetricsWithPercentile; + creation: MetricsWithPercentile; + connections: Value; +} + +export interface Value { + value: number; +} + +export interface MetricsWithPercentile { + '0.0': number; + '1.0': number; + max: number; + totalTime: number; + mean: number; + '0.5': number; + count: number; + '0.99': number; + '0.75': number; + '0.95': number; +} + +export interface HttpServerRequests { + all: { + count: number; + }; + percode: { [key: string]: MaxMeanCount }; +} + +export interface MaxMeanCount { + max: number; + mean: number; + count: number; +} + +export interface CacheMetrics { + 'cache.gets.miss': number; + 'cache.puts': number; + 'cache.gets.hit': number; + 'cache.removals': number; + 'cache.evictions': number; +} + +export interface GarbageCollector { + 'jvm.gc.max.data.size': number; + 'jvm.gc.pause': MetricsWithPercentile; + 'jvm.gc.memory.promoted': number; + 'jvm.gc.memory.allocated': number; + classesLoaded: number; + 'jvm.gc.live.data.size': number; + classesUnloaded: number; +} + +export interface Services { + [key: string]: { + [key in HttpMethod]?: MaxMeanCount; + }; +} + +export enum HttpMethod { + Post = 'POST', + Get = 'GET', + Put = 'PUT', + Patch = 'PATCH', + Delete = 'DELETE', +} + +export interface ProcessMetrics { + 'system.cpu.usage': number; + 'system.cpu.count': number; + 'system.load.average.1m'?: number; + 'process.cpu.usage': number; + 'process.files.max'?: number; + 'process.files.open'?: number; + 'process.start.time': number; + 'process.uptime': number; +} + +export interface ThreadDump { + threads: Thread[]; +} + +export interface Thread { + threadName: string; + threadId: number; + blockedTime: number; + blockedCount: number; + waitedTime: number; + waitedCount: number; + lockName: string | null; + lockOwnerId: number; + lockOwnerName: string | null; + daemon: boolean; + inNative: boolean; + suspended: boolean; + threadState: ThreadState; + priority: number; + stackTrace: StackTrace[]; + lockedMonitors: LockedMonitor[]; + lockedSynchronizers: string[]; + lockInfo: LockInfo | null; + // custom field for showing-hiding thread dump + showThreadDump?: boolean; +} + +export interface LockInfo { + className: string; + identityHashCode: number; +} + +export interface LockedMonitor { + className: string; + identityHashCode: number; + lockedStackDepth: number; + lockedStackFrame: StackTrace; +} + +export interface StackTrace { + classLoaderName: string | null; + moduleName: string | null; + moduleVersion: string | null; + methodName: string; + fileName: string; + lineNumber: number; + className: string; + nativeMethod: boolean; +} + +export enum ThreadState { + Runnable = 'RUNNABLE', + TimedWaiting = 'TIMED_WAITING', + Waiting = 'WAITING', + Blocked = 'BLOCKED', + New = 'NEW', + Terminated = 'TERMINATED', +} diff --git a/src/main/webapp/app/admin/metrics/metrics.module.ts b/src/main/webapp/app/admin/metrics/metrics.module.ts new file mode 100644 index 0000000..e96c87b --- /dev/null +++ b/src/main/webapp/app/admin/metrics/metrics.module.ts @@ -0,0 +1,32 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import { SharedModule } from 'app/shared/shared.module'; +import { MetricsComponent } from './metrics.component'; +import { metricsRoute } from './metrics.route'; +import { JvmMemoryComponent } from './blocks/jvm-memory/jvm-memory.component'; +import { JvmThreadsComponent } from './blocks/jvm-threads/jvm-threads.component'; +import { MetricsCacheComponent } from './blocks/metrics-cache/metrics-cache.component'; +import { MetricsDatasourceComponent } from './blocks/metrics-datasource/metrics-datasource.component'; +import { MetricsEndpointsRequestsComponent } from './blocks/metrics-endpoints-requests/metrics-endpoints-requests.component'; +import { MetricsGarbageCollectorComponent } from './blocks/metrics-garbagecollector/metrics-garbagecollector.component'; +import { MetricsModalThreadsComponent } from './blocks/metrics-modal-threads/metrics-modal-threads.component'; +import { MetricsRequestComponent } from './blocks/metrics-request/metrics-request.component'; +import { MetricsSystemComponent } from './blocks/metrics-system/metrics-system.component'; + +@NgModule({ + imports: [SharedModule, RouterModule.forChild([metricsRoute])], + declarations: [ + MetricsComponent, + JvmMemoryComponent, + JvmThreadsComponent, + MetricsCacheComponent, + MetricsDatasourceComponent, + MetricsEndpointsRequestsComponent, + MetricsGarbageCollectorComponent, + MetricsModalThreadsComponent, + MetricsRequestComponent, + MetricsSystemComponent, + ], +}) +export class MetricsModule {} diff --git a/src/main/webapp/app/admin/metrics/metrics.route.ts b/src/main/webapp/app/admin/metrics/metrics.route.ts new file mode 100644 index 0000000..c090cf6 --- /dev/null +++ b/src/main/webapp/app/admin/metrics/metrics.route.ts @@ -0,0 +1,11 @@ +import { Route } from '@angular/router'; + +import { MetricsComponent } from './metrics.component'; + +export const metricsRoute: Route = { + path: '', + component: MetricsComponent, + data: { + pageTitle: 'metrics.title', + }, +}; diff --git a/src/main/webapp/app/admin/metrics/metrics.service.spec.ts b/src/main/webapp/app/admin/metrics/metrics.service.spec.ts new file mode 100644 index 0000000..2f8675a --- /dev/null +++ b/src/main/webapp/app/admin/metrics/metrics.service.spec.ts @@ -0,0 +1,83 @@ +import { TestBed } from '@angular/core/testing'; +import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; + +import { MetricsService } from './metrics.service'; +import { ThreadDump, ThreadState } from './metrics.model'; + +describe('Service Tests', () => { + describe('Logs Service', () => { + let service: MetricsService; + let httpMock: HttpTestingController; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + }); + service = TestBed.inject(MetricsService); + httpMock = TestBed.inject(HttpTestingController); + }); + + afterEach(() => { + httpMock.verify(); + }); + + describe('Service methods', () => { + it('should return Metrics', () => { + let expectedResult; + const metrics = { + jvm: {}, + 'http.server.requests': {}, + cache: {}, + services: {}, + databases: {}, + garbageCollector: {}, + processMetrics: {}, + }; + + service.getMetrics().subscribe(received => { + expectedResult = received; + }); + + const req = httpMock.expectOne({ method: 'GET' }); + req.flush(metrics); + expect(expectedResult).toEqual(metrics); + }); + + it('should return Thread Dump', () => { + let expectedResult: ThreadDump | null = null; + const dump: ThreadDump = { + threads: [ + { + threadName: 'Reference Handler', + threadId: 2, + blockedTime: -1, + blockedCount: 7, + waitedTime: -1, + waitedCount: 0, + lockName: null, + lockOwnerId: -1, + lockOwnerName: null, + daemon: true, + inNative: false, + suspended: false, + threadState: ThreadState.Runnable, + priority: 10, + stackTrace: [], + lockedMonitors: [], + lockedSynchronizers: [], + lockInfo: null, + }, + ], + }; + + service.threadDump().subscribe(received => { + expectedResult = received; + }); + + const req = httpMock.expectOne({ method: 'GET' }); + req.flush(dump); + expect(expectedResult).toEqual(dump); + }); + }); + }); +}); diff --git a/src/main/webapp/app/admin/metrics/metrics.service.ts b/src/main/webapp/app/admin/metrics/metrics.service.ts new file mode 100644 index 0000000..1d27f2b --- /dev/null +++ b/src/main/webapp/app/admin/metrics/metrics.service.ts @@ -0,0 +1,19 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Observable } from 'rxjs'; + +import { ApplicationConfigService } from 'app/core/config/application-config.service'; +import { Metrics, ThreadDump } from './metrics.model'; + +@Injectable({ providedIn: 'root' }) +export class MetricsService { + constructor(private http: HttpClient, private applicationConfigService: ApplicationConfigService) {} + + getMetrics(): Observable { + return this.http.get(this.applicationConfigService.getEndpointFor('management/jhimetrics')); + } + + threadDump(): Observable { + return this.http.get(this.applicationConfigService.getEndpointFor('management/threaddump')); + } +} diff --git a/src/main/webapp/app/admin/tracker/tracker.component.html b/src/main/webapp/app/admin/tracker/tracker.component.html new file mode 100644 index 0000000..c406bef --- /dev/null +++ b/src/main/webapp/app/admin/tracker/tracker.component.html @@ -0,0 +1,25 @@ +
+

Real-time user activities

+ +
+ + + + + + + + + + + + + + + + + + +
UserIP AddressCurrent pageTime
{{ activity.userLogin }}{{ activity.ipAddress }}{{ activity.page }}{{ activity.time | date: 'yyyy-MM-dd HH:mm:ss' }}
+
+
diff --git a/src/main/webapp/app/admin/tracker/tracker.component.ts b/src/main/webapp/app/admin/tracker/tracker.component.ts new file mode 100644 index 0000000..75cfad9 --- /dev/null +++ b/src/main/webapp/app/admin/tracker/tracker.component.ts @@ -0,0 +1,49 @@ +import { Component, OnInit, OnDestroy } from '@angular/core'; +import { Subscription } from 'rxjs'; + +import { TrackerService } from 'app/core/tracker/tracker.service'; +import { TrackerActivity } from 'app/core/tracker/tracker-activity.model'; + +@Component({ + selector: 'jhi-tracker', + templateUrl: './tracker.component.html', +}) +export class TrackerComponent implements OnInit, OnDestroy { + activities: TrackerActivity[] = []; + subscription?: Subscription; + + constructor(private trackerService: TrackerService) {} + + showActivity(activity: TrackerActivity): void { + let existingActivity = false; + + for (let index = 0; index < this.activities.length; index++) { + if (this.activities[index].sessionId === activity.sessionId) { + existingActivity = true; + if (activity.page === 'logout') { + this.activities.splice(index, 1); + } else { + this.activities[index] = activity; + } + } + } + + if (!existingActivity && activity.page !== 'logout') { + this.activities.push(activity); + } + } + + ngOnInit(): void { + this.trackerService.subscribe(); + this.subscription = this.trackerService.receive().subscribe((activity: TrackerActivity) => { + this.showActivity(activity); + }); + } + + ngOnDestroy(): void { + this.trackerService.unsubscribe(); + if (this.subscription) { + this.subscription.unsubscribe(); + } + } +} diff --git a/src/main/webapp/app/admin/tracker/tracker.module.ts b/src/main/webapp/app/admin/tracker/tracker.module.ts new file mode 100644 index 0000000..b943271 --- /dev/null +++ b/src/main/webapp/app/admin/tracker/tracker.module.ts @@ -0,0 +1,12 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { SharedModule } from 'app/shared/shared.module'; + +import { TrackerComponent } from './tracker.component'; +import { trackerRoute } from './tracker.route'; + +@NgModule({ + imports: [SharedModule, RouterModule.forChild([trackerRoute])], + declarations: [TrackerComponent], +}) +export class TrackerModule {} diff --git a/src/main/webapp/app/admin/tracker/tracker.route.ts b/src/main/webapp/app/admin/tracker/tracker.route.ts new file mode 100644 index 0000000..b97ba90 --- /dev/null +++ b/src/main/webapp/app/admin/tracker/tracker.route.ts @@ -0,0 +1,11 @@ +import { Route } from '@angular/router'; + +import { TrackerComponent } from './tracker.component'; + +export const trackerRoute: Route = { + path: '', + component: TrackerComponent, + data: { + pageTitle: 'tracker.title', + }, +}; diff --git a/src/main/webapp/app/admin/user-management/delete/user-management-delete-dialog.component.html b/src/main/webapp/app/admin/user-management/delete/user-management-delete-dialog.component.html new file mode 100644 index 0000000..fa44d75 --- /dev/null +++ b/src/main/webapp/app/admin/user-management/delete/user-management-delete-dialog.component.html @@ -0,0 +1,25 @@ +
+ + + + + +
diff --git a/src/main/webapp/app/admin/user-management/delete/user-management-delete-dialog.component.spec.ts b/src/main/webapp/app/admin/user-management/delete/user-management-delete-dialog.component.spec.ts new file mode 100644 index 0000000..cb9116a --- /dev/null +++ b/src/main/webapp/app/admin/user-management/delete/user-management-delete-dialog.component.spec.ts @@ -0,0 +1,56 @@ +jest.mock('@ng-bootstrap/ng-bootstrap'); + +import { ComponentFixture, TestBed, waitForAsync, inject, fakeAsync, tick } from '@angular/core/testing'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; +import { of } from 'rxjs'; + +import { UserManagementService } from '../service/user-management.service'; + +import { UserManagementDeleteDialogComponent } from './user-management-delete-dialog.component'; + +describe('Component Tests', () => { + describe('User Management Delete Component', () => { + let comp: UserManagementDeleteDialogComponent; + let fixture: ComponentFixture; + let service: UserManagementService; + let mockActiveModal: NgbActiveModal; + + beforeEach( + waitForAsync(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [UserManagementDeleteDialogComponent], + providers: [NgbActiveModal], + }) + .overrideTemplate(UserManagementDeleteDialogComponent, '') + .compileComponents(); + }) + ); + + beforeEach(() => { + fixture = TestBed.createComponent(UserManagementDeleteDialogComponent); + comp = fixture.componentInstance; + service = TestBed.inject(UserManagementService); + mockActiveModal = TestBed.inject(NgbActiveModal); + }); + + describe('confirmDelete', () => { + it('Should call delete service on confirmDelete', inject( + [], + fakeAsync(() => { + // GIVEN + jest.spyOn(service, 'delete').mockReturnValue(of({})); + + // WHEN + comp.confirmDelete('user'); + tick(); + + // THEN + expect(service.delete).toHaveBeenCalledWith('user'); + expect(mockActiveModal.close).toHaveBeenCalledWith('deleted'); + }) + )); + }); + }); +}); diff --git a/src/main/webapp/app/admin/user-management/delete/user-management-delete-dialog.component.ts b/src/main/webapp/app/admin/user-management/delete/user-management-delete-dialog.component.ts new file mode 100644 index 0000000..87b9824 --- /dev/null +++ b/src/main/webapp/app/admin/user-management/delete/user-management-delete-dialog.component.ts @@ -0,0 +1,25 @@ +import { Component } from '@angular/core'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; + +import { User } from '../user-management.model'; +import { UserManagementService } from '../service/user-management.service'; + +@Component({ + selector: 'jhi-user-mgmt-delete-dialog', + templateUrl: './user-management-delete-dialog.component.html', +}) +export class UserManagementDeleteDialogComponent { + user?: User; + + constructor(private userService: UserManagementService, private activeModal: NgbActiveModal) {} + + cancel(): void { + this.activeModal.dismiss(); + } + + confirmDelete(login: string): void { + this.userService.delete(login).subscribe(() => { + this.activeModal.close('deleted'); + }); + } +} diff --git a/src/main/webapp/app/admin/user-management/detail/user-management-detail.component.html b/src/main/webapp/app/admin/user-management/detail/user-management-detail.component.html new file mode 100644 index 0000000..b1adc31 --- /dev/null +++ b/src/main/webapp/app/admin/user-management/detail/user-management-detail.component.html @@ -0,0 +1,56 @@ +
+
+
+

+ User [{{ user.login }}] +

+ +
+
Login
+
+ {{ user.login }} + Activated + Deactivated +
+ +
First Name
+
{{ user.firstName }}
+ +
Last Name
+
{{ user.lastName }}
+ +
Email
+
{{ user.email }}
+ +
Lang Key
+
{{ user.langKey }}
+ +
Created By
+
{{ user.createdBy }}
+ +
Created Date
+
{{ user.createdDate | date: 'dd/MM/yy HH:mm' }}
+ +
Last Modified By
+
{{ user.lastModifiedBy }}
+ +
Last Modified Date
+
{{ user.lastModifiedDate | date: 'dd/MM/yy HH:mm' }}
+ +
Profiles
+
+
    +
  • + {{ authority }} +
  • +
+
+
+ + +
+
+
diff --git a/src/main/webapp/app/admin/user-management/detail/user-management-detail.component.spec.ts b/src/main/webapp/app/admin/user-management/detail/user-management-detail.component.spec.ts new file mode 100644 index 0000000..f248e5a --- /dev/null +++ b/src/main/webapp/app/admin/user-management/detail/user-management-detail.component.spec.ts @@ -0,0 +1,60 @@ +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { ActivatedRoute } from '@angular/router'; +import { of } from 'rxjs'; + +import { Authority } from 'app/config/authority.constants'; +import { User } from '../user-management.model'; + +import { UserManagementDetailComponent } from './user-management-detail.component'; + +describe('Component Tests', () => { + describe('User Management Detail Component', () => { + let comp: UserManagementDetailComponent; + let fixture: ComponentFixture; + + beforeEach( + waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [UserManagementDetailComponent], + providers: [ + { + provide: ActivatedRoute, + useValue: { + data: of({ user: new User(123, 'user', 'first', 'last', 'first@last.com', true, 'en', [Authority.USER], 'admin') }), + }, + }, + ], + }) + .overrideTemplate(UserManagementDetailComponent, '') + .compileComponents(); + }) + ); + + beforeEach(() => { + fixture = TestBed.createComponent(UserManagementDetailComponent); + comp = fixture.componentInstance; + }); + + describe('OnInit', () => { + it('Should call load all on init', () => { + // WHEN + comp.ngOnInit(); + + // THEN + expect(comp.user).toEqual( + expect.objectContaining({ + id: 123, + login: 'user', + firstName: 'first', + lastName: 'last', + email: 'first@last.com', + activated: true, + langKey: 'en', + authorities: [Authority.USER], + createdBy: 'admin', + }) + ); + }); + }); + }); +}); diff --git a/src/main/webapp/app/admin/user-management/detail/user-management-detail.component.ts b/src/main/webapp/app/admin/user-management/detail/user-management-detail.component.ts new file mode 100644 index 0000000..31f9b3c --- /dev/null +++ b/src/main/webapp/app/admin/user-management/detail/user-management-detail.component.ts @@ -0,0 +1,20 @@ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; + +import { User } from '../user-management.model'; + +@Component({ + selector: 'jhi-user-mgmt-detail', + templateUrl: './user-management-detail.component.html', +}) +export class UserManagementDetailComponent implements OnInit { + user: User | null = null; + + constructor(private route: ActivatedRoute) {} + + ngOnInit(): void { + this.route.data.subscribe(({ user }) => { + this.user = user; + }); + } +} diff --git a/src/main/webapp/app/admin/user-management/list/user-management.component.html b/src/main/webapp/app/admin/user-management/list/user-management.component.html new file mode 100644 index 0000000..43f43a3 --- /dev/null +++ b/src/main/webapp/app/admin/user-management/list/user-management.component.html @@ -0,0 +1,124 @@ +
+

+ Users + +
+ + +
+

+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ID Login Email + Lang Key + Profiles + Created Date + + Last Modified By + + Last Modified Date +
+ {{ user.id }} + {{ user.login }}{{ user.email }} + + + {{ user.langKey }} +
+ {{ authority }} +
+
{{ user.createdDate | date: 'dd/MM/yy HH:mm' }}{{ user.lastModifiedBy }}{{ user.lastModifiedDate | date: 'dd/MM/yy HH:mm' }} +
+ + + + + +
+
+
+ +
+
+ +
+ +
+ +
+
+
diff --git a/src/main/webapp/app/admin/user-management/list/user-management.component.spec.ts b/src/main/webapp/app/admin/user-management/list/user-management.component.spec.ts new file mode 100644 index 0000000..c42a1e3 --- /dev/null +++ b/src/main/webapp/app/admin/user-management/list/user-management.component.spec.ts @@ -0,0 +1,108 @@ +jest.mock('@angular/router'); +jest.mock('app/core/auth/account.service'); + +import { ComponentFixture, TestBed, waitForAsync, inject, fakeAsync, tick } from '@angular/core/testing'; +import { HttpHeaders, HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { ActivatedRoute, Router } from '@angular/router'; +import { of } from 'rxjs'; + +import { UserManagementService } from '../service/user-management.service'; +import { User } from '../user-management.model'; +import { AccountService } from 'app/core/auth/account.service'; + +import { UserManagementComponent } from './user-management.component'; + +describe('Component Tests', () => { + describe('User Management Component', () => { + let comp: UserManagementComponent; + let fixture: ComponentFixture; + let service: UserManagementService; + let mockAccountService: AccountService; + const data = of({ + defaultSort: 'id,asc', + }); + const queryParamMap = of( + jest.requireActual('@angular/router').convertToParamMap({ + page: '1', + size: '1', + sort: 'id,desc', + }) + ); + + beforeEach( + waitForAsync(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [UserManagementComponent], + providers: [Router, { provide: ActivatedRoute, useValue: { data, queryParamMap } }, AccountService], + }) + .overrideTemplate(UserManagementComponent, '') + .compileComponents(); + }) + ); + + beforeEach(() => { + fixture = TestBed.createComponent(UserManagementComponent); + comp = fixture.componentInstance; + service = TestBed.inject(UserManagementService); + mockAccountService = TestBed.inject(AccountService); + mockAccountService.identity = jest.fn(() => of(null)); + }); + + describe('OnInit', () => { + it('Should call load all on init', inject( + [], + fakeAsync(() => { + // GIVEN + const headers = new HttpHeaders().append('link', 'link;link'); + jest.spyOn(service, 'query').mockReturnValue( + of( + new HttpResponse({ + body: [new User(123)], + headers, + }) + ) + ); + + // WHEN + comp.ngOnInit(); + tick(); // simulate async + + // THEN + expect(service.query).toHaveBeenCalled(); + expect(comp.users?.[0]).toEqual(expect.objectContaining({ id: 123 })); + }) + )); + }); + + describe('setActive', () => { + it('Should update user and call load all', inject( + [], + fakeAsync(() => { + // GIVEN + const headers = new HttpHeaders().append('link', 'link;link'); + const user = new User(123); + jest.spyOn(service, 'query').mockReturnValue( + of( + new HttpResponse({ + body: [user], + headers, + }) + ) + ); + jest.spyOn(service, 'update').mockReturnValue(of(user)); + + // WHEN + comp.setActive(user, true); + tick(); // simulate async + + // THEN + expect(service.update).toHaveBeenCalledWith({ ...user, activated: true }); + expect(service.query).toHaveBeenCalled(); + expect(comp.users?.[0]).toEqual(expect.objectContaining({ id: 123 })); + }) + )); + }); + }); +}); diff --git a/src/main/webapp/app/admin/user-management/list/user-management.component.ts b/src/main/webapp/app/admin/user-management/list/user-management.component.ts new file mode 100644 index 0000000..7eac736 --- /dev/null +++ b/src/main/webapp/app/admin/user-management/list/user-management.component.ts @@ -0,0 +1,110 @@ +import { Component, OnInit } from '@angular/core'; +import { HttpResponse, HttpHeaders } from '@angular/common/http'; +import { ActivatedRoute, Router } from '@angular/router'; +import { combineLatest } from 'rxjs'; +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; + +import { ASC, DESC, ITEMS_PER_PAGE, SORT } from 'app/config/pagination.constants'; +import { AccountService } from 'app/core/auth/account.service'; +import { Account } from 'app/core/auth/account.model'; +import { UserManagementService } from '../service/user-management.service'; +import { User } from '../user-management.model'; +import { UserManagementDeleteDialogComponent } from '../delete/user-management-delete-dialog.component'; + +@Component({ + selector: 'jhi-user-mgmt', + templateUrl: './user-management.component.html', +}) +export class UserManagementComponent implements OnInit { + currentAccount: Account | null = null; + users: User[] | null = null; + isLoading = false; + totalItems = 0; + itemsPerPage = ITEMS_PER_PAGE; + page!: number; + predicate!: string; + ascending!: boolean; + + constructor( + private userService: UserManagementService, + private accountService: AccountService, + private activatedRoute: ActivatedRoute, + private router: Router, + private modalService: NgbModal + ) {} + + ngOnInit(): void { + this.accountService.identity().subscribe(account => (this.currentAccount = account)); + this.handleNavigation(); + } + + setActive(user: User, isActivated: boolean): void { + this.userService.update({ ...user, activated: isActivated }).subscribe(() => this.loadAll()); + } + + trackIdentity(index: number, item: User): number { + return item.id!; + } + + deleteUser(user: User): void { + const modalRef = this.modalService.open(UserManagementDeleteDialogComponent, { size: 'lg', backdrop: 'static' }); + modalRef.componentInstance.user = user; + // unsubscribe not needed because closed completes on modal close + modalRef.closed.subscribe(reason => { + if (reason === 'deleted') { + this.loadAll(); + } + }); + } + + loadAll(): void { + this.isLoading = true; + this.userService + .query({ + page: this.page - 1, + size: this.itemsPerPage, + sort: this.sort(), + }) + .subscribe( + (res: HttpResponse) => { + this.isLoading = false; + this.onSuccess(res.body, res.headers); + }, + () => (this.isLoading = false) + ); + } + + transition(): void { + this.router.navigate(['./'], { + relativeTo: this.activatedRoute.parent, + queryParams: { + page: this.page, + sort: this.predicate + ',' + (this.ascending ? ASC : DESC), + }, + }); + } + + private handleNavigation(): void { + combineLatest([this.activatedRoute.data, this.activatedRoute.queryParamMap]).subscribe(([data, params]) => { + const page = params.get('page'); + this.page = page !== null ? +page : 1; + const sort = (params.get(SORT) ?? data['defaultSort']).split(','); + this.predicate = sort[0]; + this.ascending = sort[1] === ASC; + this.loadAll(); + }); + } + + private sort(): string[] { + const result = [this.predicate + ',' + (this.ascending ? ASC : DESC)]; + if (this.predicate !== 'id') { + result.push('id'); + } + return result; + } + + private onSuccess(users: User[] | null, headers: HttpHeaders): void { + this.totalItems = Number(headers.get('X-Total-Count')); + this.users = users; + } +} diff --git a/src/main/webapp/app/admin/user-management/service/user-management.service.spec.ts b/src/main/webapp/app/admin/user-management/service/user-management.service.spec.ts new file mode 100644 index 0000000..01da727 --- /dev/null +++ b/src/main/webapp/app/admin/user-management/service/user-management.service.spec.ts @@ -0,0 +1,69 @@ +import { TestBed } from '@angular/core/testing'; +import { HttpErrorResponse } from '@angular/common/http'; +import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; + +import { Authority } from 'app/config/authority.constants'; +import { User } from '../user-management.model'; + +import { UserManagementService } from './user-management.service'; + +describe('Service Tests', () => { + describe('User Service', () => { + let service: UserManagementService; + let httpMock: HttpTestingController; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + }); + + service = TestBed.inject(UserManagementService); + httpMock = TestBed.inject(HttpTestingController); + }); + + afterEach(() => { + httpMock.verify(); + }); + + describe('Service methods', () => { + it('should return User', () => { + let expectedResult: string | undefined; + + service.find('user').subscribe(received => { + expectedResult = received.login; + }); + + const req = httpMock.expectOne({ method: 'GET' }); + req.flush(new User(123, 'user')); + expect(expectedResult).toEqual('user'); + }); + + it('should return Authorities', () => { + let expectedResult: string[] = []; + + service.authorities().subscribe(authorities => { + expectedResult = authorities; + }); + const req = httpMock.expectOne({ method: 'GET' }); + + req.flush([Authority.USER, Authority.ADMIN]); + expect(expectedResult).toEqual([Authority.USER, Authority.ADMIN]); + }); + + it('should propagate not found response', () => { + let expectedResult = 0; + + service.find('user').subscribe({ + error: (error: HttpErrorResponse) => (expectedResult = error.status), + }); + + const req = httpMock.expectOne({ method: 'GET' }); + req.flush('Invalid request parameters', { + status: 404, + statusText: 'Bad Request', + }); + expect(expectedResult).toEqual(404); + }); + }); + }); +}); diff --git a/src/main/webapp/app/admin/user-management/service/user-management.service.ts b/src/main/webapp/app/admin/user-management/service/user-management.service.ts new file mode 100644 index 0000000..3c9a842 --- /dev/null +++ b/src/main/webapp/app/admin/user-management/service/user-management.service.ts @@ -0,0 +1,40 @@ +import { Injectable } from '@angular/core'; +import { HttpClient, HttpResponse } from '@angular/common/http'; +import { Observable } from 'rxjs'; + +import { ApplicationConfigService } from 'app/core/config/application-config.service'; +import { createRequestOption } from 'app/core/request/request-util'; +import { Pagination } from 'app/core/request/request.model'; +import { IUser } from '../user-management.model'; + +@Injectable({ providedIn: 'root' }) +export class UserManagementService { + private resourceUrl = this.applicationConfigService.getEndpointFor('api/admin/users'); + + constructor(private http: HttpClient, private applicationConfigService: ApplicationConfigService) {} + + create(user: IUser): Observable { + return this.http.post(this.resourceUrl, user); + } + + update(user: IUser): Observable { + return this.http.put(this.resourceUrl, user); + } + + find(login: string): Observable { + return this.http.get(`${this.resourceUrl}/${login}`); + } + + query(req?: Pagination): Observable> { + const options = createRequestOption(req); + return this.http.get(this.resourceUrl, { params: options, observe: 'response' }); + } + + delete(login: string): Observable<{}> { + return this.http.delete(`${this.resourceUrl}/${login}`); + } + + authorities(): Observable { + return this.http.get(this.applicationConfigService.getEndpointFor('api/authorities')); + } +} diff --git a/src/main/webapp/app/admin/user-management/update/user-management-update.component.html b/src/main/webapp/app/admin/user-management/update/user-management-update.component.html new file mode 100644 index 0000000..7f42972 --- /dev/null +++ b/src/main/webapp/app/admin/user-management/update/user-management-update.component.html @@ -0,0 +1,151 @@ +
+
+
+

Create or edit a User

+ +
+ + +
+ + +
+ +
+ + + +
+ + This field is required. + + + + This field cannot be longer than 50 characters. + + + + This field can only contain letters, digits and e-mail addresses. + +
+
+ +
+ + + +
+ + This field cannot be longer than 50 characters. + +
+
+ +
+ + + +
+ + This field cannot be longer than 50 characters. + +
+
+ +
+ + + +
+ + This field is required. + + + + This field cannot be longer than 100 characters. + + + + This field is required to be at least 5 characters. + + + + Your email is invalid. + +
+
+ +
+ +
+ +
+ + +
+ +
+ + +
+
+ +
+ + + +
+
+
+
diff --git a/src/main/webapp/app/admin/user-management/update/user-management-update.component.spec.ts b/src/main/webapp/app/admin/user-management/update/user-management-update.component.spec.ts new file mode 100644 index 0000000..955b917 --- /dev/null +++ b/src/main/webapp/app/admin/user-management/update/user-management-update.component.spec.ts @@ -0,0 +1,99 @@ +import { ComponentFixture, TestBed, waitForAsync, inject, fakeAsync, tick } from '@angular/core/testing'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { FormBuilder } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; +import { of } from 'rxjs'; + +import { Authority } from 'app/config/authority.constants'; +import { UserManagementService } from '../service/user-management.service'; +import { User } from '../user-management.model'; + +import { UserManagementUpdateComponent } from './user-management-update.component'; + +describe('Component Tests', () => { + describe('User Management Update Component', () => { + let comp: UserManagementUpdateComponent; + let fixture: ComponentFixture; + let service: UserManagementService; + + beforeEach( + waitForAsync(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [UserManagementUpdateComponent], + providers: [ + FormBuilder, + { + provide: ActivatedRoute, + useValue: { + data: of({ user: new User(123, 'user', 'first', 'last', 'first@last.com', true, 'en', [Authority.USER], 'admin') }), + }, + }, + ], + }) + .overrideTemplate(UserManagementUpdateComponent, '') + .compileComponents(); + }) + ); + + beforeEach(() => { + fixture = TestBed.createComponent(UserManagementUpdateComponent); + comp = fixture.componentInstance; + service = TestBed.inject(UserManagementService); + }); + + describe('OnInit', () => { + it('Should load authorities and language on init', inject( + [], + fakeAsync(() => { + // GIVEN + jest.spyOn(service, 'authorities').mockReturnValue(of(['USER'])); + + // WHEN + comp.ngOnInit(); + + // THEN + expect(service.authorities).toHaveBeenCalled(); + expect(comp.authorities).toEqual(['USER']); + }) + )); + }); + + describe('save', () => { + it('Should call update service on save for existing user', inject( + [], + fakeAsync(() => { + // GIVEN + const entity = new User(123); + jest.spyOn(service, 'update').mockReturnValue(of(entity)); + comp.user = entity; + comp.editForm.patchValue({ id: entity.id }); + // WHEN + comp.save(); + tick(); // simulate async + + // THEN + expect(service.update).toHaveBeenCalledWith(entity); + expect(comp.isSaving).toEqual(false); + }) + )); + + it('Should call create service on save for new user', inject( + [], + fakeAsync(() => { + // GIVEN + const entity = new User(); + jest.spyOn(service, 'create').mockReturnValue(of(entity)); + comp.user = entity; + // WHEN + comp.save(); + tick(); // simulate async + + // THEN + expect(service.create).toHaveBeenCalledWith(entity); + expect(comp.isSaving).toEqual(false); + }) + )); + }); + }); +}); diff --git a/src/main/webapp/app/admin/user-management/update/user-management-update.component.ts b/src/main/webapp/app/admin/user-management/update/user-management-update.component.ts new file mode 100644 index 0000000..65d3fa0 --- /dev/null +++ b/src/main/webapp/app/admin/user-management/update/user-management-update.component.ts @@ -0,0 +1,104 @@ +import { Component, OnInit } from '@angular/core'; +import { FormBuilder, Validators } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; + +import { LANGUAGES } from 'app/config/language.constants'; +import { User } from '../user-management.model'; +import { UserManagementService } from '../service/user-management.service'; + +@Component({ + selector: 'jhi-user-mgmt-update', + templateUrl: './user-management-update.component.html', +}) +export class UserManagementUpdateComponent implements OnInit { + user!: User; + languages = LANGUAGES; + authorities: string[] = []; + isSaving = false; + + editForm = this.fb.group({ + id: [], + login: [ + '', + [ + Validators.required, + Validators.minLength(1), + Validators.maxLength(50), + Validators.pattern('^[a-zA-Z0-9!$&*+=?^_`{|}~.-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*$|^[_.@A-Za-z0-9-]+$'), + ], + ], + firstName: ['', [Validators.maxLength(50)]], + lastName: ['', [Validators.maxLength(50)]], + email: ['', [Validators.minLength(5), Validators.maxLength(254), Validators.email]], + activated: [], + langKey: [], + authorities: [], + }); + + constructor(private userService: UserManagementService, private route: ActivatedRoute, private fb: FormBuilder) {} + + ngOnInit(): void { + this.route.data.subscribe(({ user }) => { + if (user) { + this.user = user; + if (this.user.id === undefined) { + this.user.activated = true; + } + this.updateForm(user); + } + }); + this.userService.authorities().subscribe(authorities => (this.authorities = authorities)); + } + + previousState(): void { + window.history.back(); + } + + save(): void { + this.isSaving = true; + this.updateUser(this.user); + if (this.user.id !== undefined) { + this.userService.update(this.user).subscribe( + () => this.onSaveSuccess(), + () => this.onSaveError() + ); + } else { + this.userService.create(this.user).subscribe( + () => this.onSaveSuccess(), + () => this.onSaveError() + ); + } + } + + private updateForm(user: User): void { + this.editForm.patchValue({ + id: user.id, + login: user.login, + firstName: user.firstName, + lastName: user.lastName, + email: user.email, + activated: user.activated, + langKey: user.langKey, + authorities: user.authorities, + }); + } + + private updateUser(user: User): void { + user.login = this.editForm.get(['login'])!.value; + user.firstName = this.editForm.get(['firstName'])!.value; + user.lastName = this.editForm.get(['lastName'])!.value; + user.email = this.editForm.get(['email'])!.value; + user.activated = this.editForm.get(['activated'])!.value; + user.langKey = this.editForm.get(['langKey'])!.value; + user.authorities = this.editForm.get(['authorities'])!.value; + } + + private onSaveSuccess(): void { + this.isSaving = false; + this.previousState(); + } + + private onSaveError(): void { + this.isSaving = false; + } +} diff --git a/src/main/webapp/app/admin/user-management/user-management.model.ts b/src/main/webapp/app/admin/user-management/user-management.model.ts new file mode 100644 index 0000000..3a1d348 --- /dev/null +++ b/src/main/webapp/app/admin/user-management/user-management.model.ts @@ -0,0 +1,31 @@ +export interface IUser { + id?: number; + login?: string; + firstName?: string | null; + lastName?: string | null; + email?: string; + activated?: boolean; + langKey?: string; + authorities?: string[]; + createdBy?: string; + createdDate?: Date; + lastModifiedBy?: string; + lastModifiedDate?: Date; +} + +export class User implements IUser { + constructor( + public id?: number, + public login?: string, + public firstName?: string | null, + public lastName?: string | null, + public email?: string, + public activated?: boolean, + public langKey?: string, + public authorities?: string[], + public createdBy?: string, + public createdDate?: Date, + public lastModifiedBy?: string, + public lastModifiedDate?: Date + ) {} +} diff --git a/src/main/webapp/app/admin/user-management/user-management.module.ts b/src/main/webapp/app/admin/user-management/user-management.module.ts new file mode 100644 index 0000000..35a7aa5 --- /dev/null +++ b/src/main/webapp/app/admin/user-management/user-management.module.ts @@ -0,0 +1,21 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import { SharedModule } from 'app/shared/shared.module'; +import { UserManagementComponent } from './list/user-management.component'; +import { UserManagementDetailComponent } from './detail/user-management-detail.component'; +import { UserManagementUpdateComponent } from './update/user-management-update.component'; +import { UserManagementDeleteDialogComponent } from './delete/user-management-delete-dialog.component'; +import { userManagementRoute } from './user-management.route'; + +@NgModule({ + imports: [SharedModule, RouterModule.forChild(userManagementRoute)], + declarations: [ + UserManagementComponent, + UserManagementDetailComponent, + UserManagementUpdateComponent, + UserManagementDeleteDialogComponent, + ], + entryComponents: [UserManagementDeleteDialogComponent], +}) +export class UserManagementModule {} diff --git a/src/main/webapp/app/admin/user-management/user-management.route.ts b/src/main/webapp/app/admin/user-management/user-management.route.ts new file mode 100644 index 0000000..3fe4d25 --- /dev/null +++ b/src/main/webapp/app/admin/user-management/user-management.route.ts @@ -0,0 +1,53 @@ +import { Injectable } from '@angular/core'; +import { Resolve, ActivatedRouteSnapshot, Routes } from '@angular/router'; +import { Observable, of } from 'rxjs'; + +import { User, IUser } from './user-management.model'; +import { UserManagementService } from './service/user-management.service'; +import { UserManagementComponent } from './list/user-management.component'; +import { UserManagementDetailComponent } from './detail/user-management-detail.component'; +import { UserManagementUpdateComponent } from './update/user-management-update.component'; + +@Injectable({ providedIn: 'root' }) +export class UserManagementResolve implements Resolve { + constructor(private service: UserManagementService) {} + + resolve(route: ActivatedRouteSnapshot): Observable { + const id = route.params['login']; + if (id) { + return this.service.find(id); + } + return of(new User()); + } +} + +export const userManagementRoute: Routes = [ + { + path: '', + component: UserManagementComponent, + data: { + defaultSort: 'id,asc', + }, + }, + { + path: ':login/view', + component: UserManagementDetailComponent, + resolve: { + user: UserManagementResolve, + }, + }, + { + path: 'new', + component: UserManagementUpdateComponent, + resolve: { + user: UserManagementResolve, + }, + }, + { + path: ':login/edit', + component: UserManagementUpdateComponent, + resolve: { + user: UserManagementResolve, + }, + }, +]; diff --git a/src/main/webapp/app/app-routing.module.ts b/src/main/webapp/app/app-routing.module.ts new file mode 100644 index 0000000..65ce0d2 --- /dev/null +++ b/src/main/webapp/app/app-routing.module.ts @@ -0,0 +1,40 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import { errorRoute } from './layouts/error/error.route'; +import { navbarRoute } from './layouts/navbar/navbar.route'; +import { DEBUG_INFO_ENABLED } from 'app/app.constants'; +import { Authority } from 'app/config/authority.constants'; + +import { UserRouteAccessService } from 'app/core/auth/user-route-access.service'; + +const LAYOUT_ROUTES = [navbarRoute, ...errorRoute]; + +@NgModule({ + imports: [ + RouterModule.forRoot( + [ + { + path: 'admin', + data: { + authorities: [Authority.ADMIN], + }, + canActivate: [UserRouteAccessService], + loadChildren: () => import('./admin/admin-routing.module').then(m => m.AdminRoutingModule), + }, + { + path: 'account', + loadChildren: () => import('./account/account.module').then(m => m.AccountModule), + }, + { + path: 'login', + loadChildren: () => import('./login/login.module').then(m => m.LoginModule), + }, + ...LAYOUT_ROUTES, + ], + { enableTracing: DEBUG_INFO_ENABLED } + ), + ], + exports: [RouterModule], +}) +export class AppRoutingModule {} diff --git a/src/main/webapp/app/app.constants.ts b/src/main/webapp/app/app.constants.ts new file mode 100644 index 0000000..3441bfc --- /dev/null +++ b/src/main/webapp/app/app.constants.ts @@ -0,0 +1,13 @@ +// These constants are injected via webpack DefinePlugin variables. +// You can add more variables in webpack.common.js or in profile specific webpack..js files. +// If you change the values in the webpack config files, you need to re run webpack to update the application + +declare const __DEBUG_INFO_ENABLED__: boolean; +declare const __TIMESTAMP__: string; +declare const __VERSION__: string; +declare const __SERVER_API_URL__: string; + +export const VERSION = __VERSION__; +export const DEBUG_INFO_ENABLED = __DEBUG_INFO_ENABLED__; +export const SERVER_API_URL = __SERVER_API_URL__; +export const TIMESTAMP = __TIMESTAMP__; diff --git a/src/main/webapp/app/app.module.ts b/src/main/webapp/app/app.module.ts new file mode 100644 index 0000000..036daec --- /dev/null +++ b/src/main/webapp/app/app.module.ts @@ -0,0 +1,82 @@ +import { NgModule, LOCALE_ID } from '@angular/core'; +import { registerLocaleData } from '@angular/common'; +import { HttpClient, HttpClientModule } from '@angular/common/http'; +import locale from '@angular/common/locales/es'; +import { BrowserModule, Title } from '@angular/platform-browser'; +import { ServiceWorkerModule } from '@angular/service-worker'; +import { FaIconLibrary } from '@fortawesome/angular-fontawesome'; +import { TranslateModule, TranslateService, TranslateLoader, MissingTranslationHandler } from '@ngx-translate/core'; +import { NgxWebstorageModule, SessionStorageService } from 'ngx-webstorage'; +import * as dayjs from 'dayjs'; +import { NgbDateAdapter, NgbDatepickerConfig } from '@ng-bootstrap/ng-bootstrap'; + +import { SERVER_API_URL } from './app.constants'; +import { ApplicationConfigService } from 'app/core/config/application-config.service'; +import './config/dayjs'; +import { SharedModule } from 'app/shared/shared.module'; +import { AppRoutingModule } from './app-routing.module'; +import { HomeModule } from './home/home.module'; +import { EntityRoutingModule } from './entities/entity-routing.module'; +// jhipster-needle-angular-add-module-import JHipster will add new module here +import { NgbDateDayjsAdapter } from './config/datepicker-adapter'; +import { fontAwesomeIcons } from './config/font-awesome-icons'; +import { httpInterceptorProviders } from 'app/core/interceptor/index'; +import { translatePartialLoader, missingTranslationHandler } from './config/translation.config'; +import { MainComponent } from './layouts/main/main.component'; +import { NavbarComponent } from './layouts/navbar/navbar.component'; +import { FooterComponent } from './layouts/footer/footer.component'; +import { PageRibbonComponent } from './layouts/profiles/page-ribbon.component'; +import { ActiveMenuDirective } from './layouts/navbar/active-menu.directive'; +import { ErrorComponent } from './layouts/error/error.component'; + +@NgModule({ + imports: [ + BrowserModule, + SharedModule, + HomeModule, + // jhipster-needle-angular-add-module JHipster will add new module here + EntityRoutingModule, + AppRoutingModule, + // Set this to true to enable service worker (PWA) + ServiceWorkerModule.register('ngsw-worker.js', { enabled: false }), + HttpClientModule, + NgxWebstorageModule.forRoot({ prefix: 'jhi', separator: '-', caseSensitive: true }), + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useFactory: translatePartialLoader, + deps: [HttpClient], + }, + missingTranslationHandler: { + provide: MissingTranslationHandler, + useFactory: missingTranslationHandler, + }, + }), + ], + providers: [ + Title, + { provide: LOCALE_ID, useValue: 'es' }, + { provide: NgbDateAdapter, useClass: NgbDateDayjsAdapter }, + httpInterceptorProviders, + ], + declarations: [MainComponent, NavbarComponent, ErrorComponent, PageRibbonComponent, ActiveMenuDirective, FooterComponent], + bootstrap: [MainComponent], +}) +export class AppModule { + constructor( + applicationConfigService: ApplicationConfigService, + iconLibrary: FaIconLibrary, + dpConfig: NgbDatepickerConfig, + translateService: TranslateService, + sessionStorageService: SessionStorageService + ) { + applicationConfigService.setEndpointPrefix(SERVER_API_URL); + registerLocaleData(locale); + iconLibrary.addIcons(...fontAwesomeIcons); + dpConfig.minDate = { year: dayjs().subtract(100, 'year').year(), month: 1, day: 1 }; + translateService.setDefaultLang('es'); + // if user have changed language and navigates away from the application and back to the application then use previously choosed language + const langKey = sessionStorageService.retrieve('locale') ?? 'es'; + translateService.use(langKey); + } +} diff --git a/src/main/webapp/app/config/authority.constants.ts b/src/main/webapp/app/config/authority.constants.ts new file mode 100644 index 0000000..1501bcf --- /dev/null +++ b/src/main/webapp/app/config/authority.constants.ts @@ -0,0 +1,4 @@ +export enum Authority { + ADMIN = 'ROLE_ADMIN', + USER = 'ROLE_USER', +} diff --git a/src/main/webapp/app/config/datepicker-adapter.ts b/src/main/webapp/app/config/datepicker-adapter.ts new file mode 100644 index 0000000..5fcc521 --- /dev/null +++ b/src/main/webapp/app/config/datepicker-adapter.ts @@ -0,0 +1,20 @@ +/** + * Angular bootstrap Date adapter + */ +import { Injectable } from '@angular/core'; +import { NgbDateAdapter, NgbDateStruct } from '@ng-bootstrap/ng-bootstrap'; +import * as dayjs from 'dayjs'; + +@Injectable() +export class NgbDateDayjsAdapter extends NgbDateAdapter { + fromModel(date: dayjs.Dayjs | null): NgbDateStruct | null { + if (date && dayjs.isDayjs(date) && date.isValid()) { + return { year: date.year(), month: date.month() + 1, day: date.date() }; + } + return null; + } + + toModel(date: NgbDateStruct | null): dayjs.Dayjs | null { + return date ? dayjs(`${date.year}-${date.month}-${date.day}`) : null; + } +} diff --git a/src/main/webapp/app/config/dayjs.ts b/src/main/webapp/app/config/dayjs.ts new file mode 100644 index 0000000..239ab71 --- /dev/null +++ b/src/main/webapp/app/config/dayjs.ts @@ -0,0 +1,12 @@ +import * as dayjs from 'dayjs'; +import * as customParseFormat from 'dayjs/plugin/customParseFormat'; +import * as duration from 'dayjs/plugin/duration'; +import * as relativeTime from 'dayjs/plugin/relativeTime'; + +// jhipster-needle-i18n-language-dayjs-imports - JHipster will import languages from dayjs here +import 'dayjs/locale/es'; + +// DAYJS CONFIGURATION +dayjs.extend(customParseFormat); +dayjs.extend(duration); +dayjs.extend(relativeTime); diff --git a/src/main/webapp/app/config/error.constants.ts b/src/main/webapp/app/config/error.constants.ts new file mode 100644 index 0000000..42d91d9 --- /dev/null +++ b/src/main/webapp/app/config/error.constants.ts @@ -0,0 +1,3 @@ +export const PROBLEM_BASE_URL = 'https://www.jhipster.tech/problem'; +export const EMAIL_ALREADY_USED_TYPE = PROBLEM_BASE_URL + '/email-already-used'; +export const LOGIN_ALREADY_USED_TYPE = PROBLEM_BASE_URL + '/login-already-used'; diff --git a/src/main/webapp/app/config/font-awesome-icons.ts b/src/main/webapp/app/config/font-awesome-icons.ts new file mode 100644 index 0000000..7fcf169 --- /dev/null +++ b/src/main/webapp/app/config/font-awesome-icons.ts @@ -0,0 +1,83 @@ +import { + faArrowLeft, + faAsterisk, + faBan, + faBars, + faBell, + faBook, + faCalendarAlt, + faCheck, + faCloud, + faCogs, + faDatabase, + faEye, + faFlag, + faHeart, + faHome, + faList, + faLock, + faPencilAlt, + faPlus, + faRoad, + faSave, + faSearch, + faSignOutAlt, + faSignInAlt, + faSort, + faSortDown, + faSortUp, + faSync, + faTachometerAlt, + faTasks, + faThList, + faTimes, + faTrashAlt, + faUser, + faUserPlus, + faUsers, + faUsersCog, + faWrench, + // jhipster-needle-add-icon-import +} from '@fortawesome/free-solid-svg-icons'; + +export const fontAwesomeIcons = [ + faArrowLeft, + faAsterisk, + faBan, + faBars, + faBell, + faBook, + faCalendarAlt, + faCheck, + faCloud, + faCogs, + faDatabase, + faEye, + faFlag, + faHeart, + faHome, + faList, + faLock, + faPencilAlt, + faPlus, + faRoad, + faSave, + faSearch, + faSignOutAlt, + faSignInAlt, + faSort, + faSortDown, + faSortUp, + faSync, + faTachometerAlt, + faTasks, + faThList, + faTimes, + faTrashAlt, + faUser, + faUserPlus, + faUsers, + faUsersCog, + faWrench, + // jhipster-needle-add-icon-import +]; diff --git a/src/main/webapp/app/config/input.constants.ts b/src/main/webapp/app/config/input.constants.ts new file mode 100644 index 0000000..1e3978a --- /dev/null +++ b/src/main/webapp/app/config/input.constants.ts @@ -0,0 +1,2 @@ +export const DATE_FORMAT = 'YYYY-MM-DD'; +export const DATE_TIME_FORMAT = 'YYYY-MM-DDTHH:mm'; diff --git a/src/main/webapp/app/config/language.constants.ts b/src/main/webapp/app/config/language.constants.ts new file mode 100644 index 0000000..59e66d2 --- /dev/null +++ b/src/main/webapp/app/config/language.constants.ts @@ -0,0 +1,8 @@ +/* + Languages codes are ISO_639-1 codes, see http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes + They are written in English to avoid character encoding issues (not a perfect solution) +*/ +export const LANGUAGES: string[] = [ + 'es', + // jhipster-needle-i18n-language-constant - JHipster will add/remove languages in this array +]; diff --git a/src/main/webapp/app/config/pagination.constants.ts b/src/main/webapp/app/config/pagination.constants.ts new file mode 100644 index 0000000..d1fa55c --- /dev/null +++ b/src/main/webapp/app/config/pagination.constants.ts @@ -0,0 +1,4 @@ +export const ITEMS_PER_PAGE = 20; +export const ASC = 'asc'; +export const DESC = 'desc'; +export const SORT = 'sort'; diff --git a/src/main/webapp/app/config/translation.config.ts b/src/main/webapp/app/config/translation.config.ts new file mode 100644 index 0000000..bd932f7 --- /dev/null +++ b/src/main/webapp/app/config/translation.config.ts @@ -0,0 +1,21 @@ +import { HttpClient } from '@angular/common/http'; +import { MissingTranslationHandler, MissingTranslationHandlerParams, TranslateLoader } from '@ngx-translate/core'; +import { TranslateHttpLoader } from '@ngx-translate/http-loader'; +import { TIMESTAMP } from '../app.constants'; + +export const translationNotFoundMessage = 'translation-not-found'; + +export class MissingTranslationHandlerImpl implements MissingTranslationHandler { + handle(params: MissingTranslationHandlerParams): string { + const key = params.key; + return `${translationNotFoundMessage}[${key}]`; + } +} + +export function translatePartialLoader(http: HttpClient): TranslateLoader { + return new TranslateHttpLoader(http, 'i18n/', `.json?buildTimestamp=${TIMESTAMP}`); +} + +export function missingTranslationHandler(): MissingTranslationHandler { + return new MissingTranslationHandlerImpl(); +} diff --git a/src/main/webapp/app/config/uib-pagination.config.ts b/src/main/webapp/app/config/uib-pagination.config.ts new file mode 100644 index 0000000..ecabe16 --- /dev/null +++ b/src/main/webapp/app/config/uib-pagination.config.ts @@ -0,0 +1,14 @@ +import { Injectable } from '@angular/core'; +import { NgbPaginationConfig } from '@ng-bootstrap/ng-bootstrap'; + +import { ITEMS_PER_PAGE } from 'app/config/pagination.constants'; + +@Injectable({ providedIn: 'root' }) +export class PaginationConfig { + constructor(config: NgbPaginationConfig) { + config.boundaryLinks = true; + config.maxSize = 5; + config.pageSize = ITEMS_PER_PAGE; + config.size = 'sm'; + } +} diff --git a/src/main/webapp/app/core/auth/account.model.ts b/src/main/webapp/app/core/auth/account.model.ts new file mode 100644 index 0000000..22e083c --- /dev/null +++ b/src/main/webapp/app/core/auth/account.model.ts @@ -0,0 +1,12 @@ +export class Account { + constructor( + public activated: boolean, + public authorities: string[], + public email: string, + public firstName: string | null, + public langKey: string, + public lastName: string | null, + public login: string, + public imageUrl: string | null + ) {} +} diff --git a/src/main/webapp/app/core/auth/account.service.spec.ts b/src/main/webapp/app/core/auth/account.service.spec.ts new file mode 100644 index 0000000..aec7c97 --- /dev/null +++ b/src/main/webapp/app/core/auth/account.service.spec.ts @@ -0,0 +1,249 @@ +jest.mock('@angular/router'); +jest.mock('@ngx-translate/core'); +jest.mock('app/core/auth/state-storage.service'); +jest.mock('app/core/tracker/tracker.service'); + +import { Router } from '@angular/router'; +import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; +import { TestBed } from '@angular/core/testing'; +import { TranslateService } from '@ngx-translate/core'; +import { NgxWebstorageModule, SessionStorageService } from 'ngx-webstorage'; + +import { Account } from 'app/core/auth/account.model'; +import { Authority } from 'app/config/authority.constants'; +import { StateStorageService } from 'app/core/auth/state-storage.service'; +import { TrackerService } from 'app/core/tracker/tracker.service'; +import { ApplicationConfigService } from 'app/core/config/application-config.service'; + +import { AccountService } from './account.service'; + +function accountWithAuthorities(authorities: string[]): Account { + return { + activated: true, + authorities, + email: '', + firstName: '', + langKey: '', + lastName: '', + login: '', + imageUrl: '', + }; +} + +describe('Service Tests', () => { + describe('Account Service', () => { + let service: AccountService; + let applicationConfigService: ApplicationConfigService; + let httpMock: HttpTestingController; + let mockStorageService: StateStorageService; + let mockRouter: Router; + let mockTrackerService: TrackerService; + let mockTranslateService: TranslateService; + let sessionStorageService: SessionStorageService; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule, NgxWebstorageModule.forRoot()], + providers: [TranslateService, TrackerService, StateStorageService, Router], + }); + + service = TestBed.inject(AccountService); + applicationConfigService = TestBed.inject(ApplicationConfigService); + httpMock = TestBed.inject(HttpTestingController); + mockStorageService = TestBed.inject(StateStorageService); + mockRouter = TestBed.inject(Router); + mockTrackerService = TestBed.inject(TrackerService); + mockTranslateService = TestBed.inject(TranslateService); + sessionStorageService = TestBed.inject(SessionStorageService); + }); + + afterEach(() => { + httpMock.verify(); + }); + + describe('save', () => { + it('should call account saving endpoint with correct values', () => { + // GIVEN + const account = accountWithAuthorities([]); + + // WHEN + service.save(account).subscribe(); + const testRequest = httpMock.expectOne({ method: 'POST', url: applicationConfigService.getEndpointFor('api/account') }); + testRequest.flush({}); + + // THEN + expect(testRequest.request.body).toEqual(account); + }); + }); + + describe('authenticate', () => { + it('authenticationState should emit null if input is null', () => { + // GIVEN + let userIdentity: Account | null = accountWithAuthorities([]); + service.getAuthenticationState().subscribe(account => (userIdentity = account)); + + // WHEN + service.authenticate(null); + + // THEN + expect(userIdentity).toBeNull(); + expect(service.isAuthenticated()).toBe(false); + expect(mockTrackerService.disconnect).toHaveBeenCalled(); + expect(mockTrackerService.connect).not.toHaveBeenCalled(); + }); + + it('authenticationState should emit the same account as was in input parameter', () => { + // GIVEN + const expectedResult = accountWithAuthorities([]); + let userIdentity: Account | null = null; + service.getAuthenticationState().subscribe(account => (userIdentity = account)); + + // WHEN + service.authenticate(expectedResult); + + // THEN + expect(userIdentity).toEqual(expectedResult); + expect(service.isAuthenticated()).toBe(true); + expect(mockTrackerService.connect).toHaveBeenCalled(); + expect(mockTrackerService.disconnect).not.toHaveBeenCalled(); + }); + }); + + describe('identity', () => { + it('should call /account only once if not logged out after first authentication and should call /account again if user has logged out', () => { + // Given the user is authenticated + service.identity().subscribe(); + httpMock.expectOne({ method: 'GET' }).flush({}); + + // When I call + service.identity().subscribe(); + + // Then there is no second request + httpMock.expectNone({ method: 'GET' }); + + // When I log out + service.authenticate(null); + // and then call + service.identity().subscribe(); + + // Then there is a new request + httpMock.expectOne({ method: 'GET' }); + }); + + describe('should change the language on authentication if necessary', () => { + it('should change language if user has not changed language manually', () => { + // GIVEN + sessionStorageService.retrieve = jest.fn(key => (key === 'locale' ? undefined : 'otherSessionStorageValue')); + + // WHEN + service.identity().subscribe(); + httpMock.expectOne({ method: 'GET' }).flush({ ...accountWithAuthorities([]), langKey: 'accountLang' }); + + // THEN + expect(mockTranslateService.use).toHaveBeenCalledWith('accountLang'); + }); + + it('should not change language if user has changed language manually', () => { + // GIVEN + sessionStorageService.retrieve = jest.fn(key => (key === 'locale' ? 'sessionLang' : undefined)); + + // WHEN + service.identity().subscribe(); + httpMock.expectOne({ method: 'GET' }).flush({ ...accountWithAuthorities([]), langKey: 'accountLang' }); + + // THEN + expect(mockTranslateService.use).not.toHaveBeenCalled(); + }); + }); + + describe('navigateToStoredUrl', () => { + it('should navigate to the previous stored url post successful authentication', () => { + // GIVEN + mockStorageService.getUrl = jest.fn(() => 'admin/users?page=0'); + + // WHEN + service.identity().subscribe(); + httpMock.expectOne({ method: 'GET' }).flush({}); + + // THEN + expect(mockStorageService.getUrl).toHaveBeenCalledTimes(1); + expect(mockStorageService.clearUrl).toHaveBeenCalledTimes(1); + expect(mockRouter.navigateByUrl).toHaveBeenCalledWith('admin/users?page=0'); + }); + + it('should not navigate to the previous stored url when authentication fails', () => { + // WHEN + service.identity().subscribe(); + httpMock.expectOne({ method: 'GET' }).error(new ErrorEvent('')); + + // THEN + expect(mockStorageService.getUrl).not.toHaveBeenCalled(); + expect(mockStorageService.clearUrl).not.toHaveBeenCalled(); + expect(mockRouter.navigateByUrl).not.toHaveBeenCalled(); + }); + + it('should not navigate to the previous stored url when no such url exists post successful authentication', () => { + // GIVEN + mockStorageService.getUrl = jest.fn(() => null); + + // WHEN + service.identity().subscribe(); + httpMock.expectOne({ method: 'GET' }).flush({}); + + // THEN + expect(mockStorageService.getUrl).toHaveBeenCalledTimes(1); + expect(mockStorageService.clearUrl).not.toHaveBeenCalled(); + expect(mockRouter.navigateByUrl).not.toHaveBeenCalled(); + }); + }); + }); + + describe('hasAnyAuthority', () => { + describe('hasAnyAuthority string parameter', () => { + it('should return false if user is not logged', () => { + const hasAuthority = service.hasAnyAuthority(Authority.USER); + expect(hasAuthority).toBe(false); + }); + + it('should return false if user is logged and has not authority', () => { + service.authenticate(accountWithAuthorities([Authority.USER])); + + const hasAuthority = service.hasAnyAuthority(Authority.ADMIN); + + expect(hasAuthority).toBe(false); + }); + + it('should return true if user is logged and has authority', () => { + service.authenticate(accountWithAuthorities([Authority.USER])); + + const hasAuthority = service.hasAnyAuthority(Authority.USER); + + expect(hasAuthority).toBe(true); + }); + }); + + describe('hasAnyAuthority array parameter', () => { + it('should return false if user is not logged', () => { + const hasAuthority = service.hasAnyAuthority([Authority.USER]); + expect(hasAuthority).toBeFalsy(); + }); + + it('should return false if user is logged and has not authority', () => { + service.authenticate(accountWithAuthorities([Authority.USER])); + + const hasAuthority = service.hasAnyAuthority([Authority.ADMIN]); + + expect(hasAuthority).toBe(false); + }); + + it('should return true if user is logged and has authority', () => { + service.authenticate(accountWithAuthorities([Authority.USER])); + + const hasAuthority = service.hasAnyAuthority([Authority.USER, Authority.ADMIN]); + + expect(hasAuthority).toBe(true); + }); + }); + }); + }); +}); diff --git a/src/main/webapp/app/core/auth/account.service.ts b/src/main/webapp/app/core/auth/account.service.ts new file mode 100644 index 0000000..324c77e --- /dev/null +++ b/src/main/webapp/app/core/auth/account.service.ts @@ -0,0 +1,99 @@ +import { Injectable } from '@angular/core'; +import { Router } from '@angular/router'; +import { HttpClient } from '@angular/common/http'; +import { TranslateService } from '@ngx-translate/core'; +import { SessionStorageService } from 'ngx-webstorage'; +import { Observable, ReplaySubject, of } from 'rxjs'; +import { shareReplay, tap, catchError } from 'rxjs/operators'; + +import { StateStorageService } from 'app/core/auth/state-storage.service'; +import { ApplicationConfigService } from '../config/application-config.service'; +import { Account } from 'app/core/auth/account.model'; +import { TrackerService } from '../tracker/tracker.service'; + +@Injectable({ providedIn: 'root' }) +export class AccountService { + private userIdentity: Account | null = null; + private authenticationState = new ReplaySubject(1); + private accountCache$?: Observable; + + constructor( + private translateService: TranslateService, + private sessionStorageService: SessionStorageService, + private http: HttpClient, + private trackerService: TrackerService, + private stateStorageService: StateStorageService, + private router: Router, + private applicationConfigService: ApplicationConfigService + ) {} + + save(account: Account): Observable<{}> { + return this.http.post(this.applicationConfigService.getEndpointFor('api/account'), account); + } + + authenticate(identity: Account | null): void { + this.userIdentity = identity; + this.authenticationState.next(this.userIdentity); + if (identity) { + this.trackerService.connect(); + } else { + this.trackerService.disconnect(); + } + } + + hasAnyAuthority(authorities: string[] | string): boolean { + if (!this.userIdentity) { + return false; + } + if (!Array.isArray(authorities)) { + authorities = [authorities]; + } + return this.userIdentity.authorities.some((authority: string) => authorities.includes(authority)); + } + + identity(force?: boolean): Observable { + if (!this.accountCache$ || force || !this.isAuthenticated()) { + this.accountCache$ = this.fetch().pipe( + catchError(() => of(null)), + tap((account: Account | null) => { + this.authenticate(account); + + // After retrieve the account info, the language will be changed to + // the user's preferred language configured in the account setting + // unless user have choosed other language in the current session + if (!this.sessionStorageService.retrieve('locale') && account) { + this.translateService.use(account.langKey); + } + + if (account) { + this.navigateToStoredUrl(); + } + }), + shareReplay() + ); + } + return this.accountCache$; + } + + isAuthenticated(): boolean { + return this.userIdentity !== null; + } + + getAuthenticationState(): Observable { + return this.authenticationState.asObservable(); + } + + private fetch(): Observable { + return this.http.get(this.applicationConfigService.getEndpointFor('api/account')); + } + + private navigateToStoredUrl(): void { + // previousState can be set in the authExpiredInterceptor and in the userRouteAccessService + // if login is successful, go to stored previousState and clear previousState + const previousUrl = this.stateStorageService.getUrl(); + if (previousUrl) { + this.stateStorageService.clearUrl(); + this.router.navigateByUrl(previousUrl); + } + } +} diff --git a/src/main/webapp/app/core/auth/auth-jwt.service.spec.ts b/src/main/webapp/app/core/auth/auth-jwt.service.spec.ts new file mode 100644 index 0000000..c11953c --- /dev/null +++ b/src/main/webapp/app/core/auth/auth-jwt.service.spec.ts @@ -0,0 +1,88 @@ +import { TestBed } from '@angular/core/testing'; +import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; +import { AuthServerProvider } from 'app/core/auth/auth-jwt.service'; +import { LocalStorageService, NgxWebstorageModule, SessionStorageService } from 'ngx-webstorage'; + +describe('Auth JWT', () => { + let service: AuthServerProvider; + let localStorageService: LocalStorageService; + let sessionStorageService: SessionStorageService; + let httpMock: HttpTestingController; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule, NgxWebstorageModule.forRoot()], + }); + + httpMock = TestBed.inject(HttpTestingController); + service = TestBed.inject(AuthServerProvider); + localStorageService = TestBed.inject(LocalStorageService); + sessionStorageService = TestBed.inject(SessionStorageService); + }); + + describe('Get Token', () => { + it('should return empty token if not found in local storage nor session storage', () => { + const result = service.getToken(); + expect(result).toEqual(''); + }); + + it('should return token from session storage if local storage is empty', () => { + sessionStorageService.retrieve = jest.fn().mockReturnValue('sessionStorageToken'); + const result = service.getToken(); + expect(result).toEqual('sessionStorageToken'); + }); + + it('should return token from localstorage storage', () => { + localStorageService.retrieve = jest.fn().mockReturnValue('localStorageToken'); + const result = service.getToken(); + expect(result).toEqual('localStorageToken'); + }); + }); + + describe('Login', () => { + it('should clear session storage and save in local storage when rememberMe is true', () => { + // GIVEN + localStorageService.store = jest.fn(); + sessionStorageService.clear = jest.fn(); + + // WHEN + service.login({ username: 'John', password: '123', rememberMe: true }).subscribe(); + httpMock.expectOne('api/authenticate').flush({ id_token: '1' }); + + // THEN + httpMock.verify(); + expect(localStorageService.store).toHaveBeenCalledWith('authenticationToken', '1'); + expect(sessionStorageService.clear).toHaveBeenCalled(); + }); + + it('should clear local storage and save in session storage when rememberMe is false', () => { + // GIVEN + sessionStorageService.store = jest.fn(); + localStorageService.clear = jest.fn(); + + // WHEN + service.login({ username: 'John', password: '123', rememberMe: false }).subscribe(); + httpMock.expectOne('api/authenticate').flush({ id_token: '1' }); + + // THEN + httpMock.verify(); + expect(sessionStorageService.store).toHaveBeenCalledWith('authenticationToken', '1'); + expect(localStorageService.clear).toHaveBeenCalled(); + }); + }); + + describe('Logout', () => { + it('should clear storage', () => { + // GIVEN + sessionStorageService.clear = jest.fn(); + localStorageService.clear = jest.fn(); + + // WHEN + service.logout().subscribe(); + + // THEN + expect(localStorageService.clear).toHaveBeenCalled(); + expect(sessionStorageService.clear).toHaveBeenCalled(); + }); + }); +}); diff --git a/src/main/webapp/app/core/auth/auth-jwt.service.ts b/src/main/webapp/app/core/auth/auth-jwt.service.ts new file mode 100644 index 0000000..2316a18 --- /dev/null +++ b/src/main/webapp/app/core/auth/auth-jwt.service.ts @@ -0,0 +1,53 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { LocalStorageService, SessionStorageService } from 'ngx-webstorage'; + +import { ApplicationConfigService } from '../config/application-config.service'; +import { Login } from 'app/login/login.model'; + +type JwtToken = { + id_token: string; +}; + +@Injectable({ providedIn: 'root' }) +export class AuthServerProvider { + constructor( + private http: HttpClient, + private localStorageService: LocalStorageService, + private sessionStorageService: SessionStorageService, + private applicationConfigService: ApplicationConfigService + ) {} + + getToken(): string { + const tokenInLocalStorage: string | null = this.localStorageService.retrieve('authenticationToken'); + const tokenInSessionStorage: string | null = this.sessionStorageService.retrieve('authenticationToken'); + return tokenInLocalStorage ?? tokenInSessionStorage ?? ''; + } + + login(credentials: Login): Observable { + return this.http + .post(this.applicationConfigService.getEndpointFor('api/authenticate'), credentials) + .pipe(map(response => this.authenticateSuccess(response, credentials.rememberMe))); + } + + logout(): Observable { + return new Observable(observer => { + this.localStorageService.clear('authenticationToken'); + this.sessionStorageService.clear('authenticationToken'); + observer.complete(); + }); + } + + private authenticateSuccess(response: JwtToken, rememberMe: boolean): void { + const jwt = response.id_token; + if (rememberMe) { + this.localStorageService.store('authenticationToken', jwt); + this.sessionStorageService.clear('authenticationToken'); + } else { + this.sessionStorageService.store('authenticationToken', jwt); + this.localStorageService.clear('authenticationToken'); + } + } +} diff --git a/src/main/webapp/app/core/auth/state-storage.service.ts b/src/main/webapp/app/core/auth/state-storage.service.ts new file mode 100644 index 0000000..e058d7d --- /dev/null +++ b/src/main/webapp/app/core/auth/state-storage.service.ts @@ -0,0 +1,21 @@ +import { Injectable } from '@angular/core'; +import { SessionStorageService } from 'ngx-webstorage'; + +@Injectable({ providedIn: 'root' }) +export class StateStorageService { + private previousUrlKey = 'previousUrl'; + + constructor(private sessionStorageService: SessionStorageService) {} + + storeUrl(url: string): void { + this.sessionStorageService.store(this.previousUrlKey, url); + } + + getUrl(): string | null { + return this.sessionStorageService.retrieve(this.previousUrlKey) as string | null; + } + + clearUrl(): void { + this.sessionStorageService.clear(this.previousUrlKey); + } +} diff --git a/src/main/webapp/app/core/auth/user-route-access.service.ts b/src/main/webapp/app/core/auth/user-route-access.service.ts new file mode 100644 index 0000000..6bb4716 --- /dev/null +++ b/src/main/webapp/app/core/auth/user-route-access.service.ts @@ -0,0 +1,36 @@ +import { Injectable, isDevMode } from '@angular/core'; +import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from '@angular/router'; +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; + +import { AccountService } from 'app/core/auth/account.service'; +import { StateStorageService } from './state-storage.service'; + +@Injectable({ providedIn: 'root' }) +export class UserRouteAccessService implements CanActivate { + constructor(private router: Router, private accountService: AccountService, private stateStorageService: StateStorageService) {} + + canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { + return this.accountService.identity().pipe( + map(account => { + if (account) { + const authorities = route.data['authorities']; + + if (!authorities || authorities.length === 0 || this.accountService.hasAnyAuthority(authorities)) { + return true; + } + + if (isDevMode()) { + console.error('User has not any of required authorities: ', authorities); + } + this.router.navigate(['accessdenied']); + return false; + } + + this.stateStorageService.storeUrl(state.url); + this.router.navigate(['/login']); + return false; + }) + ); + } +} diff --git a/src/main/webapp/app/core/config/application-config.service.spec.ts b/src/main/webapp/app/core/config/application-config.service.spec.ts new file mode 100644 index 0000000..4451c9b --- /dev/null +++ b/src/main/webapp/app/core/config/application-config.service.spec.ts @@ -0,0 +1,40 @@ +import { TestBed } from '@angular/core/testing'; + +import { ApplicationConfigService } from './application-config.service'; + +describe('ApplicationConfigService', () => { + let service: ApplicationConfigService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(ApplicationConfigService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); + + describe('without prefix', () => { + it('should return correctly', () => { + expect(service.getEndpointFor('api')).toEqual('api'); + }); + + it('should return correctly when passing microservice', () => { + expect(service.getEndpointFor('api', 'microservice')).toEqual('services/microservice/api'); + }); + }); + + describe('with prefix', () => { + beforeEach(() => { + service.setEndpointPrefix('prefix/'); + }); + + it('should return correctly', () => { + expect(service.getEndpointFor('api')).toEqual('prefix/api'); + }); + + it('should return correctly when passing microservice', () => { + expect(service.getEndpointFor('api', 'microservice')).toEqual('prefix/services/microservice/api'); + }); + }); +}); diff --git a/src/main/webapp/app/core/config/application-config.service.ts b/src/main/webapp/app/core/config/application-config.service.ts new file mode 100644 index 0000000..f646321 --- /dev/null +++ b/src/main/webapp/app/core/config/application-config.service.ts @@ -0,0 +1,19 @@ +import { Injectable } from '@angular/core'; + +@Injectable({ + providedIn: 'root', +}) +export class ApplicationConfigService { + private endpointPrefix = ''; + + setEndpointPrefix(endpointPrefix: string): void { + this.endpointPrefix = endpointPrefix; + } + + getEndpointFor(api: string, microservice?: string): string { + if (microservice) { + return `${this.endpointPrefix}services/${microservice}/${api}`; + } + return `${this.endpointPrefix}${api}`; + } +} diff --git a/src/main/webapp/app/core/interceptor/auth-expired.interceptor.ts b/src/main/webapp/app/core/interceptor/auth-expired.interceptor.ts new file mode 100644 index 0000000..bdc8e8a --- /dev/null +++ b/src/main/webapp/app/core/interceptor/auth-expired.interceptor.ts @@ -0,0 +1,33 @@ +import { Injectable } from '@angular/core'; +import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent, HttpErrorResponse } from '@angular/common/http'; +import { Observable } from 'rxjs'; +import { tap } from 'rxjs/operators'; +import { Router } from '@angular/router'; + +import { LoginService } from 'app/login/login.service'; +import { StateStorageService } from 'app/core/auth/state-storage.service'; +import { AccountService } from 'app/core/auth/account.service'; + +@Injectable() +export class AuthExpiredInterceptor implements HttpInterceptor { + constructor( + private loginService: LoginService, + private stateStorageService: StateStorageService, + private router: Router, + private accountService: AccountService + ) {} + + intercept(request: HttpRequest, next: HttpHandler): Observable> { + return next.handle(request).pipe( + tap({ + error: (err: HttpErrorResponse) => { + if (err.status === 401 && err.url && !err.url.includes('api/account') && this.accountService.isAuthenticated()) { + this.stateStorageService.storeUrl(this.router.routerState.snapshot.url); + this.loginService.logout(); + this.router.navigate(['/login']); + } + }, + }) + ); + } +} diff --git a/src/main/webapp/app/core/interceptor/auth.interceptor.ts b/src/main/webapp/app/core/interceptor/auth.interceptor.ts new file mode 100644 index 0000000..81b639a --- /dev/null +++ b/src/main/webapp/app/core/interceptor/auth.interceptor.ts @@ -0,0 +1,33 @@ +import { Injectable } from '@angular/core'; +import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent } from '@angular/common/http'; +import { Observable } from 'rxjs'; +import { LocalStorageService, SessionStorageService } from 'ngx-webstorage'; + +import { ApplicationConfigService } from '../config/application-config.service'; + +@Injectable() +export class AuthInterceptor implements HttpInterceptor { + constructor( + private localStorageService: LocalStorageService, + private sessionStorageService: SessionStorageService, + private applicationConfigService: ApplicationConfigService + ) {} + + intercept(request: HttpRequest, next: HttpHandler): Observable> { + const serverApiUrl = this.applicationConfigService.getEndpointFor(''); + if (!request.url || (request.url.startsWith('http') && !(serverApiUrl && request.url.startsWith(serverApiUrl)))) { + return next.handle(request); + } + + const token: string | null = + this.localStorageService.retrieve('authenticationToken') ?? this.sessionStorageService.retrieve('authenticationToken'); + if (token) { + request = request.clone({ + setHeaders: { + Authorization: `Bearer ${token}`, + }, + }); + } + return next.handle(request); + } +} diff --git a/src/main/webapp/app/core/interceptor/error-handler.interceptor.ts b/src/main/webapp/app/core/interceptor/error-handler.interceptor.ts new file mode 100644 index 0000000..f2a2d66 --- /dev/null +++ b/src/main/webapp/app/core/interceptor/error-handler.interceptor.ts @@ -0,0 +1,23 @@ +import { Injectable } from '@angular/core'; +import { HttpInterceptor, HttpRequest, HttpErrorResponse, HttpHandler, HttpEvent } from '@angular/common/http'; +import { Observable } from 'rxjs'; +import { tap } from 'rxjs/operators'; + +import { EventManager, EventWithContent } from 'app/core/util/event-manager.service'; + +@Injectable() +export class ErrorHandlerInterceptor implements HttpInterceptor { + constructor(private eventManager: EventManager) {} + + intercept(request: HttpRequest, next: HttpHandler): Observable> { + return next.handle(request).pipe( + tap({ + error: (err: HttpErrorResponse) => { + if (!(err.status === 401 && (err.message === '' || err.url?.includes('api/account')))) { + this.eventManager.broadcast(new EventWithContent('dataSurveyApp.httpError', err)); + } + }, + }) + ); + } +} diff --git a/src/main/webapp/app/core/interceptor/index.ts b/src/main/webapp/app/core/interceptor/index.ts new file mode 100644 index 0000000..f7e72e3 --- /dev/null +++ b/src/main/webapp/app/core/interceptor/index.ts @@ -0,0 +1,29 @@ +import { HTTP_INTERCEPTORS } from '@angular/common/http'; + +import { AuthInterceptor } from 'app/core/interceptor/auth.interceptor'; +import { AuthExpiredInterceptor } from 'app/core/interceptor/auth-expired.interceptor'; +import { ErrorHandlerInterceptor } from 'app/core/interceptor/error-handler.interceptor'; +import { NotificationInterceptor } from 'app/core/interceptor/notification.interceptor'; + +export const httpInterceptorProviders = [ + { + provide: HTTP_INTERCEPTORS, + useClass: AuthInterceptor, + multi: true, + }, + { + provide: HTTP_INTERCEPTORS, + useClass: AuthExpiredInterceptor, + multi: true, + }, + { + provide: HTTP_INTERCEPTORS, + useClass: ErrorHandlerInterceptor, + multi: true, + }, + { + provide: HTTP_INTERCEPTORS, + useClass: NotificationInterceptor, + multi: true, + }, +]; diff --git a/src/main/webapp/app/core/interceptor/notification.interceptor.ts b/src/main/webapp/app/core/interceptor/notification.interceptor.ts new file mode 100644 index 0000000..513132f --- /dev/null +++ b/src/main/webapp/app/core/interceptor/notification.interceptor.ts @@ -0,0 +1,38 @@ +import { HttpInterceptor, HttpRequest, HttpResponse, HttpHandler, HttpEvent } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { Observable } from 'rxjs'; +import { tap } from 'rxjs/operators'; + +import { AlertService } from 'app/core/util/alert.service'; + +@Injectable() +export class NotificationInterceptor implements HttpInterceptor { + constructor(private alertService: AlertService) {} + + intercept(request: HttpRequest, next: HttpHandler): Observable> { + return next.handle(request).pipe( + tap((event: HttpEvent) => { + if (event instanceof HttpResponse) { + let alert: string | null = null; + let alertParams: string | null = null; + + for (const headerKey of event.headers.keys()) { + if (headerKey.toLowerCase().endsWith('app-alert')) { + alert = event.headers.get(headerKey); + } else if (headerKey.toLowerCase().endsWith('app-params')) { + alertParams = decodeURIComponent(event.headers.get(headerKey)!.replace(/\+/g, ' ')); + } + } + + if (alert) { + this.alertService.addAlert({ + type: 'success', + translationKey: alert, + translationParams: { param: alertParams }, + }); + } + } + }) + ); + } +} diff --git a/src/main/webapp/app/core/request/request-util.ts b/src/main/webapp/app/core/request/request-util.ts new file mode 100644 index 0000000..7df81be --- /dev/null +++ b/src/main/webapp/app/core/request/request-util.ts @@ -0,0 +1,21 @@ +import { HttpParams } from '@angular/common/http'; + +export const createRequestOption = (req?: any): HttpParams => { + let options: HttpParams = new HttpParams(); + + if (req) { + Object.keys(req).forEach(key => { + if (key !== 'sort') { + options = options.set(key, req[key]); + } + }); + + if (req.sort) { + req.sort.forEach((val: string) => { + options = options.append('sort', val); + }); + } + } + + return options; +}; diff --git a/src/main/webapp/app/core/request/request.model.ts b/src/main/webapp/app/core/request/request.model.ts new file mode 100644 index 0000000..5de2b69 --- /dev/null +++ b/src/main/webapp/app/core/request/request.model.ts @@ -0,0 +1,11 @@ +export interface Pagination { + page: number; + size: number; + sort: string[]; +} + +export interface Search { + query: string; +} + +export interface SearchWithPagination extends Search, Pagination {} diff --git a/src/main/webapp/app/core/tracker/tracker-activity.model.ts b/src/main/webapp/app/core/tracker/tracker-activity.model.ts new file mode 100644 index 0000000..a7c984f --- /dev/null +++ b/src/main/webapp/app/core/tracker/tracker-activity.model.ts @@ -0,0 +1,3 @@ +export class TrackerActivity { + constructor(public sessionId: string, public userLogin: string, public ipAddress: string, public page: string, public time: string) {} +} diff --git a/src/main/webapp/app/core/tracker/tracker.service.ts b/src/main/webapp/app/core/tracker/tracker.service.ts new file mode 100644 index 0000000..2a5c184 --- /dev/null +++ b/src/main/webapp/app/core/tracker/tracker.service.ts @@ -0,0 +1,106 @@ +import { Injectable } from '@angular/core'; +import { Location } from '@angular/common'; +import { Router, NavigationEnd, Event } from '@angular/router'; +import { Subscription, ReplaySubject, Subject } from 'rxjs'; +import { filter } from 'rxjs/operators'; +import * as SockJS from 'sockjs-client'; +import * as Stomp from 'webstomp-client'; + +import { AuthServerProvider } from 'app/core/auth/auth-jwt.service'; +import { TrackerActivity } from './tracker-activity.model'; + +@Injectable({ providedIn: 'root' }) +export class TrackerService { + private stompClient: Stomp.Client | null = null; + private routerSubscription: Subscription | null = null; + private connectionSubject: ReplaySubject = new ReplaySubject(1); + private connectionSubscription: Subscription | null = null; + private stompSubscription: Stomp.Subscription | null = null; + private listenerSubject: Subject = new Subject(); + + constructor(private router: Router, private authServerProvider: AuthServerProvider, private location: Location) {} + + connect(): void { + if (this.stompClient?.connected) { + return; + } + + // building absolute path so that websocket doesn't fail when deploying with a context path + let url = '/websocket/tracker'; + url = this.location.prepareExternalUrl(url); + const authToken = this.authServerProvider.getToken(); + if (authToken) { + url += '?access_token=' + authToken; + } + const socket: WebSocket = new SockJS(url); + this.stompClient = Stomp.over(socket, { protocols: ['v12.stomp'] }); + const headers: Stomp.ConnectionHeaders = {}; + this.stompClient.connect(headers, () => { + this.connectionSubject.next(); + + this.sendActivity(); + + this.routerSubscription = this.router.events + .pipe(filter((event: Event) => event instanceof NavigationEnd)) + .subscribe(() => this.sendActivity()); + }); + } + + disconnect(): void { + this.unsubscribe(); + + this.connectionSubject = new ReplaySubject(1); + + if (this.routerSubscription) { + this.routerSubscription.unsubscribe(); + this.routerSubscription = null; + } + + if (this.stompClient) { + if (this.stompClient.connected) { + this.stompClient.disconnect(); + } + this.stompClient = null; + } + } + + receive(): Subject { + return this.listenerSubject; + } + + subscribe(): void { + if (this.connectionSubscription) { + return; + } + + this.connectionSubscription = this.connectionSubject.subscribe(() => { + if (this.stompClient) { + this.stompSubscription = this.stompClient.subscribe('/topic/tracker', (data: Stomp.Message) => { + this.listenerSubject.next(JSON.parse(data.body)); + }); + } + }); + } + + unsubscribe(): void { + if (this.stompSubscription) { + this.stompSubscription.unsubscribe(); + this.stompSubscription = null; + } + + if (this.connectionSubscription) { + this.connectionSubscription.unsubscribe(); + this.connectionSubscription = null; + } + } + + private sendActivity(): void { + if (this.stompClient?.connected) { + this.stompClient.send( + '/topic/activity', // destination + JSON.stringify({ page: this.router.routerState.snapshot.url }), // body + {} // header + ); + } + } +} diff --git a/src/main/webapp/app/core/util/alert.service.spec.ts b/src/main/webapp/app/core/util/alert.service.spec.ts new file mode 100644 index 0000000..934188c --- /dev/null +++ b/src/main/webapp/app/core/util/alert.service.spec.ts @@ -0,0 +1,285 @@ +import { inject, TestBed } from '@angular/core/testing'; +import { TranslateModule, TranslateService, MissingTranslationHandler } from '@ngx-translate/core'; +import { missingTranslationHandler } from '../../config/translation.config'; + +import { Alert, AlertService } from './alert.service'; + +describe('Alert service test', () => { + describe('Alert Service Test', () => { + let extAlerts: Alert[]; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [ + TranslateModule.forRoot({ + missingTranslationHandler: { + provide: MissingTranslationHandler, + useFactory: missingTranslationHandler, + }, + }), + ], + }); + const translateService = TestBed.inject(TranslateService); + translateService.setDefaultLang('en'); + jest.useFakeTimers(); + extAlerts = []; + }); + + it('should produce a proper alert object and fetch it', inject([AlertService], (service: AlertService) => { + expect( + service.addAlert({ + type: 'success', + message: 'Hello Jhipster', + timeout: 3000, + toast: true, + position: 'top left', + }) + ).toEqual( + expect.objectContaining({ + type: 'success', + message: 'Hello Jhipster', + id: 0, + timeout: 3000, + toast: true, + position: 'top left', + } as Alert) + ); + + expect(service.get().length).toBe(1); + expect(service.get()[0]).toEqual( + expect.objectContaining({ + type: 'success', + message: 'Hello Jhipster', + id: 0, + timeout: 3000, + toast: true, + position: 'top left', + } as Alert) + ); + })); + + it('should produce a proper alert object and add it to external alert objects array', inject( + [AlertService], + (service: AlertService) => { + expect( + service.addAlert( + { + type: 'success', + message: 'Hello Jhipster', + timeout: 3000, + toast: true, + position: 'top left', + }, + extAlerts + ) + ).toEqual( + expect.objectContaining({ + type: 'success', + message: 'Hello Jhipster', + id: 0, + timeout: 3000, + toast: true, + position: 'top left', + } as Alert) + ); + + expect(extAlerts.length).toBe(1); + expect(extAlerts[0]).toEqual( + expect.objectContaining({ + type: 'success', + message: 'Hello Jhipster', + id: 0, + timeout: 3000, + toast: true, + position: 'top left', + } as Alert) + ); + } + )); + + it('should produce an alert object with correct id', inject([AlertService], (service: AlertService) => { + service.addAlert({ type: 'info', message: 'Hello Jhipster info' }); + expect(service.addAlert({ type: 'success', message: 'Hello Jhipster success' })).toEqual( + expect.objectContaining({ + type: 'success', + message: 'Hello Jhipster success', + id: 1, + } as Alert) + ); + + expect(service.get().length).toBe(2); + expect(service.get()[1]).toEqual( + expect.objectContaining({ + type: 'success', + message: 'Hello Jhipster success', + id: 1, + } as Alert) + ); + })); + + it('should close an alert correctly', inject([AlertService], (service: AlertService) => { + const alert0 = service.addAlert({ type: 'info', message: 'Hello Jhipster info' }); + const alert1 = service.addAlert({ type: 'info', message: 'Hello Jhipster info 2' }); + const alert2 = service.addAlert({ type: 'success', message: 'Hello Jhipster success' }); + expect(alert2).toEqual( + expect.objectContaining({ + type: 'success', + message: 'Hello Jhipster success', + id: 2, + } as Alert) + ); + + expect(service.get().length).toBe(3); + alert1.close?.(service.get()); + expect(service.get().length).toBe(2); + expect(service.get()[1]).not.toEqual( + expect.objectContaining({ + type: 'info', + message: 'Hello Jhipster info 2', + id: 1, + } as Alert) + ); + alert2.close?.(service.get()); + expect(service.get().length).toBe(1); + expect(service.get()[0]).not.toEqual( + expect.objectContaining({ + type: 'success', + message: 'Hello Jhipster success', + id: 2, + } as Alert) + ); + alert0.close?.(service.get()); + expect(service.get().length).toBe(0); + })); + + it('should close an alert on timeout correctly', inject([AlertService], (service: AlertService) => { + service.addAlert({ type: 'info', message: 'Hello Jhipster info' }); + + expect(service.get().length).toBe(1); + + jest.advanceTimersByTime(6000); + + expect(service.get().length).toBe(0); + })); + + it('should clear alerts', inject([AlertService], (service: AlertService) => { + service.addAlert({ type: 'info', message: 'Hello Jhipster info' }); + service.addAlert({ type: 'danger', message: 'Hello Jhipster info' }); + service.addAlert({ type: 'success', message: 'Hello Jhipster info' }); + expect(service.get().length).toBe(3); + service.clear(); + expect(service.get().length).toBe(0); + })); + + it('should produce a scoped alert', inject([AlertService], (service: AlertService) => { + expect( + service.addAlert( + { + type: 'success', + message: 'Hello Jhipster', + timeout: 3000, + toast: true, + position: 'top left', + }, + [] + ) + ).toEqual( + expect.objectContaining({ + type: 'success', + message: 'Hello Jhipster', + id: 0, + timeout: 3000, + toast: true, + position: 'top left', + } as Alert) + ); + + expect(service.get().length).toBe(0); + })); + + it('should produce a success message', inject([AlertService], (service: AlertService) => { + expect(service.addAlert({ type: 'success', message: 'Hello Jhipster' })).toEqual( + expect.objectContaining({ + type: 'success', + message: 'Hello Jhipster', + } as Alert) + ); + })); + + it('should produce a success message with custom position', inject([AlertService], (service: AlertService) => { + expect(service.addAlert({ type: 'success', message: 'Hello Jhipster', position: 'bottom left' })).toEqual( + expect.objectContaining({ + type: 'success', + message: 'Hello Jhipster', + position: 'bottom left', + } as Alert) + ); + })); + + it('should produce a error message', inject([AlertService], (service: AlertService) => { + expect(service.addAlert({ type: 'danger', message: 'Hello Jhipster' })).toEqual( + expect.objectContaining({ + type: 'danger', + message: 'Hello Jhipster', + } as Alert) + ); + })); + + it('should produce a warning message', inject([AlertService], (service: AlertService) => { + expect(service.addAlert({ type: 'warning', message: 'Hello Jhipster' })).toEqual( + expect.objectContaining({ + type: 'warning', + message: 'Hello Jhipster', + } as Alert) + ); + })); + + it('should produce a info message', inject([AlertService], (service: AlertService) => { + expect(service.addAlert({ type: 'info', message: 'Hello Jhipster' })).toEqual( + expect.objectContaining({ + type: 'info', + message: 'Hello Jhipster', + } as Alert) + ); + })); + + it('should produce a info message with translated message if key exists', inject( + [AlertService, TranslateService], + (service: AlertService, translateService: TranslateService) => { + translateService.setTranslation('en', { + 'hello.jhipster': 'Translated message', + }); + expect(service.addAlert({ type: 'info', message: 'Hello Jhipster', translationKey: 'hello.jhipster' })).toEqual( + expect.objectContaining({ + type: 'info', + message: 'Translated message', + } as Alert) + ); + } + )); + + it('should produce a info message with provided message if key does not exists', inject( + [AlertService, TranslateService], + (service: AlertService) => { + expect(service.addAlert({ type: 'info', message: 'Hello Jhipster', translationKey: 'hello.jhipster' })).toEqual( + expect.objectContaining({ + type: 'info', + message: 'Hello Jhipster', + } as Alert) + ); + } + )); + + it('should produce a info message with provided key if transltion key does not exist in translations and message is not provided', inject( + [AlertService, TranslateService], + (service: AlertService) => { + expect(service.addAlert({ type: 'info', translationKey: 'hello.jhipster' })).toEqual( + expect.objectContaining({ + type: 'info', + message: 'hello.jhipster', + } as Alert) + ); + } + )); + }); +}); diff --git a/src/main/webapp/app/core/util/alert.service.ts b/src/main/webapp/app/core/util/alert.service.ts new file mode 100644 index 0000000..4469bd6 --- /dev/null +++ b/src/main/webapp/app/core/util/alert.service.ts @@ -0,0 +1,95 @@ +import { Injectable, SecurityContext, NgZone } from '@angular/core'; +import { DomSanitizer } from '@angular/platform-browser'; +import { TranslateService } from '@ngx-translate/core'; + +import { translationNotFoundMessage } from 'app/config/translation.config'; + +export type AlertType = 'success' | 'danger' | 'warning' | 'info'; + +export interface Alert { + id?: number; + type: AlertType; + message?: string; + translationKey?: string; + translationParams?: { [key: string]: unknown }; + timeout?: number; + toast?: boolean; + position?: string; + close?: (alerts: Alert[]) => void; +} + +@Injectable({ + providedIn: 'root', +}) +export class AlertService { + timeout = 5000; + toast = false; + position = 'top right'; + + // unique id for each alert. Starts from 0. + private alertId = 0; + private alerts: Alert[] = []; + + constructor(private sanitizer: DomSanitizer, private ngZone: NgZone, private translateService: TranslateService) {} + + clear(): void { + this.alerts = []; + } + + get(): Alert[] { + return this.alerts; + } + + /** + * Adds alert to alerts array and returns added alert. + * @param alert Alert to add. If `timeout`, `toast` or `position` is missing then applying default value. + * If `translateKey` is available then it's translation else `message` is used for showing. + * @param extAlerts If missing then adding `alert` to `AlertService` internal array and alerts can be retrieved by `get()`. + * Else adding `alert` to `extAlerts`. + * @returns Added alert + */ + addAlert(alert: Alert, extAlerts?: Alert[]): Alert { + alert.id = this.alertId++; + + if (alert.translationKey) { + const translatedMessage = this.translateService.instant(alert.translationKey, alert.translationParams); + // if translation key exists + if (translatedMessage !== `${translationNotFoundMessage}[${alert.translationKey}]`) { + alert.message = translatedMessage; + } else if (!alert.message) { + alert.message = alert.translationKey; + } + } + + alert.message = this.sanitizer.sanitize(SecurityContext.HTML, alert.message ?? '') ?? ''; + alert.timeout = alert.timeout ?? this.timeout; + alert.toast = alert.toast ?? this.toast; + alert.position = alert.position ?? this.position; + alert.close = (alertsArray: Alert[]) => this.closeAlert(alert.id!, alertsArray); + + (extAlerts ?? this.alerts).push(alert); + + if (alert.timeout > 0) { + // Workaround protractor waiting for setTimeout. + // Reference https://www.protractortest.org/#/timeouts + this.ngZone.runOutsideAngular(() => { + setTimeout(() => { + this.ngZone.run(() => { + this.closeAlert(alert.id!, extAlerts ?? this.alerts); + }); + }, alert.timeout); + }); + } + + return alert; + } + + private closeAlert(alertId: number, extAlerts?: Alert[]): void { + const alerts = extAlerts ?? this.alerts; + const alertIndex = alerts.map(alert => alert.id).indexOf(alertId); + // if found alert then remove + if (alertIndex >= 0) { + alerts.splice(alertIndex, 1); + } + } +} diff --git a/src/main/webapp/app/core/util/data-util.service.spec.ts b/src/main/webapp/app/core/util/data-util.service.spec.ts new file mode 100644 index 0000000..9f5ae4b --- /dev/null +++ b/src/main/webapp/app/core/util/data-util.service.spec.ts @@ -0,0 +1,33 @@ +import { TestBed } from '@angular/core/testing'; + +import { DataUtils } from './data-util.service'; + +describe('Data Utils Service Test', () => { + let service: DataUtils; + + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [DataUtils], + }); + service = TestBed.inject(DataUtils); + }); + + describe('byteSize', () => { + it('should return the bytesize of the text', () => { + expect(service.byteSize('Hello JHipster')).toBe(`10.5 bytes`); + }); + }); + + describe('openFile', () => { + it('should open the file in the new window', () => { + const newWindow = { ...window }; + newWindow.document.write = jest.fn(); + window.open = jest.fn(() => newWindow); + // 'JHipster' in base64 is 'SkhpcHN0ZXI=' + const data = 'SkhpcHN0ZXI='; + const contentType = 'text/plain'; + service.openFile(data, contentType); + expect(newWindow.document.write).toHaveBeenCalledWith(expect.stringContaining('src="data:text/plain;base64,SkhpcHN0ZXI="')); + }); + }); +}); diff --git a/src/main/webapp/app/core/util/data-util.service.ts b/src/main/webapp/app/core/util/data-util.service.ts new file mode 100644 index 0000000..a96fbd5 --- /dev/null +++ b/src/main/webapp/app/core/util/data-util.service.ts @@ -0,0 +1,137 @@ +import { Injectable } from '@angular/core'; +import { FormGroup } from '@angular/forms'; +import { Observable, Observer } from 'rxjs'; + +export type FileLoadErrorType = 'not.image' | 'could.not.extract'; + +export interface FileLoadError { + message: string; + key: FileLoadErrorType; + params?: any; +} + +/** + * An utility service for data. + */ +@Injectable({ + providedIn: 'root', +}) +export class DataUtils { + /** + * Method to find the byte size of the string provides + */ + byteSize(base64String: string): string { + return this.formatAsBytes(this.size(base64String)); + } + + /** + * Method to open file + */ + openFile(data: string, contentType: string | null | undefined): void { + contentType = contentType ?? ''; + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + if (window.navigator.msSaveOrOpenBlob) { + // To support IE + const byteCharacters = atob(data); + const byteNumbers = new Array(byteCharacters.length); + for (let i = 0; i < byteCharacters.length; i++) { + byteNumbers[i] = byteCharacters.charCodeAt(i); + } + const byteArray = new Uint8Array(byteNumbers); + const blob = new Blob([byteArray], { + type: contentType, + }); + window.navigator.msSaveOrOpenBlob(blob); + } else { + // Other browsers + const fileURL = `data:${contentType};base64,${data}`; + const win = window.open(); + win?.document.write( + '' + ); + } + } + + /** + * Sets the base 64 data & file type of the 1st file on the event (event.target.files[0]) in the passed entity object + * and returns an observable. + * + * @param event the object containing the file (at event.target.files[0]) + * @param editForm the form group where the input field is located + * @param field the field name to set the file's 'base 64 data' on + * @param isImage boolean representing if the file represented by the event is an image + * @returns an observable that loads file to form field and completes if sussessful + * or returns error as FileLoadError on failure + */ + loadFileToForm(event: Event, editForm: FormGroup, field: string, isImage: boolean): Observable { + return new Observable((observer: Observer) => { + const eventTarget: HTMLInputElement | null = event.target as HTMLInputElement | null; + if (eventTarget?.files?.[0]) { + const file: File = eventTarget.files[0]; + if (isImage && !file.type.startsWith('image/')) { + const error: FileLoadError = { + message: `File was expected to be an image but was found to be '${file.type}'`, + key: 'not.image', + params: { fileType: file.type }, + }; + observer.error(error); + } else { + const fieldContentType: string = field + 'ContentType'; + this.toBase64(file, (base64Data: string) => { + editForm.patchValue({ + [field]: base64Data, + [fieldContentType]: file.type, + }); + observer.next(); + observer.complete(); + }); + } + } else { + const error: FileLoadError = { + message: 'Could not extract file', + key: 'could.not.extract', + params: { event }, + }; + observer.error(error); + } + }); + } + + /** + * Method to convert the file to base64 + */ + private toBase64(file: File, callback: (base64Data: string) => void): void { + const fileReader: FileReader = new FileReader(); + fileReader.onload = (e: ProgressEvent) => { + if (typeof e.target?.result === 'string') { + const base64Data: string = e.target.result.substr(e.target.result.indexOf('base64,') + 'base64,'.length); + callback(base64Data); + } + }; + fileReader.readAsDataURL(file); + } + + private endsWith(suffix: string, str: string): boolean { + return str.includes(suffix, str.length - suffix.length); + } + + private paddingSize(value: string): number { + if (this.endsWith('==', value)) { + return 2; + } + if (this.endsWith('=', value)) { + return 1; + } + return 0; + } + + private size(value: string): number { + return (value.length / 4) * 3 - this.paddingSize(value); + } + + private formatAsBytes(size: number): string { + return size.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ' ') + ' bytes'; + } +} diff --git a/src/main/webapp/app/core/util/event-manager.service.spec.ts b/src/main/webapp/app/core/util/event-manager.service.spec.ts new file mode 100644 index 0000000..910009c --- /dev/null +++ b/src/main/webapp/app/core/util/event-manager.service.spec.ts @@ -0,0 +1,84 @@ +import { inject, TestBed } from '@angular/core/testing'; + +import { EventManager, EventWithContent } from './event-manager.service'; + +describe('Event Manager tests', () => { + describe('EventWithContent', () => { + it('should create correctly EventWithContent', () => { + // WHEN + const eventWithContent = new EventWithContent('name', 'content'); + + // THEN + expect(eventWithContent).toEqual({ name: 'name', content: 'content' }); + }); + }); + + describe('EventManager', () => { + let recievedEvent: EventWithContent | string | null; + + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [EventManager], + }); + recievedEvent = null; + }); + + it('should not fail when nosubscriber and broadcasting', inject([EventManager], (eventManager: EventManager) => { + expect(eventManager.observer).toBeUndefined(); + eventManager.broadcast({ name: 'modifier', content: 'modified something' }); + })); + + it('should create an observable and callback when broadcasted EventWithContent', inject( + [EventManager], + (eventManager: EventManager) => { + // GIVEN + eventManager.subscribe('modifier', (event: EventWithContent | string) => (recievedEvent = event)); + + // WHEN + eventManager.broadcast({ name: 'unrelatedModifier', content: 'unreleated modification' }); + // THEN + expect(recievedEvent).toBeNull(); + + // WHEN + eventManager.broadcast({ name: 'modifier', content: 'modified something' }); + // THEN + expect(recievedEvent).toEqual({ name: 'modifier', content: 'modified something' }); + } + )); + + it('should create an observable and callback when broadcasted string', inject([EventManager], (eventManager: EventManager) => { + // GIVEN + eventManager.subscribe('modifier', (event: EventWithContent | string) => (recievedEvent = event)); + + // WHEN + eventManager.broadcast('unrelatedModifier'); + // THEN + expect(recievedEvent).toBeNull(); + + // WHEN + eventManager.broadcast('modifier'); + // THEN + expect(recievedEvent).toEqual('modifier'); + })); + + it('should subscribe to multiple events', inject([EventManager], (eventManager: EventManager) => { + // GIVEN + eventManager.subscribe(['modifier', 'modifier2'], (event: EventWithContent | string) => (recievedEvent = event)); + + // WHEN + eventManager.broadcast('unrelatedModifier'); + // THEN + expect(recievedEvent).toBeNull(); + + // WHEN + eventManager.broadcast({ name: 'modifier', content: 'modified something' }); + // THEN + expect(recievedEvent).toEqual({ name: 'modifier', content: 'modified something' }); + + // WHEN + eventManager.broadcast('modifier2'); + // THEN + expect(recievedEvent).toEqual('modifier2'); + })); + }); +}); diff --git a/src/main/webapp/app/core/util/event-manager.service.ts b/src/main/webapp/app/core/util/event-manager.service.ts new file mode 100644 index 0000000..1730369 --- /dev/null +++ b/src/main/webapp/app/core/util/event-manager.service.ts @@ -0,0 +1,63 @@ +import { Injectable } from '@angular/core'; +import { Observable, Observer, Subscription } from 'rxjs'; +import { filter, share } from 'rxjs/operators'; + +export class EventWithContent { + constructor(public name: string, public content: T) {} +} + +/** + * An utility class to manage RX events + */ +@Injectable({ + providedIn: 'root', +}) +export class EventManager { + observable: Observable | string>; + observer?: Observer | string>; + + constructor() { + this.observable = new Observable((observer: Observer | string>) => { + this.observer = observer; + }).pipe(share()); + } + + /** + * Method to broadcast the event to observer + */ + broadcast(event: EventWithContent | string): void { + if (this.observer) { + this.observer.next(event); + } + } + + /** + * Method to subscribe to an event with callback + * @param eventNames Single event name or array of event names to what subscribe + * @param callback Callback to run when the event occurs + */ + subscribe(eventNames: string | string[], callback: (event: EventWithContent | string) => void): Subscription { + if (typeof eventNames === 'string') { + eventNames = [eventNames]; + } + return this.observable + .pipe( + filter((event: EventWithContent | string) => { + for (const eventName of eventNames) { + if ((typeof event === 'string' && event === eventName) || (typeof event !== 'string' && event.name === eventName)) { + return true; + } + } + return false; + }) + ) + .subscribe(callback); + } + + /** + * Method to unsubscribe the subscription + */ + destroy(subscriber: Subscription): void { + subscriber.unsubscribe(); + } +} diff --git a/src/main/webapp/app/core/util/operators.spec.ts b/src/main/webapp/app/core/util/operators.spec.ts new file mode 100644 index 0000000..429647c --- /dev/null +++ b/src/main/webapp/app/core/util/operators.spec.ts @@ -0,0 +1,18 @@ +import { filterNaN, isPresent } from './operators'; + +describe('Operators Test', () => { + describe('isPresent', () => { + it('should remove null and undefined values', () => { + expect([1, null, undefined].filter(isPresent)).toEqual([1]); + }); + }); + + describe('filterNaN', () => { + it('should return 0 for NaN', () => { + expect(filterNaN(NaN)).toBe(0); + }); + it('should return number for a number', () => { + expect(filterNaN(12345)).toBe(12345); + }); + }); +}); diff --git a/src/main/webapp/app/core/util/operators.ts b/src/main/webapp/app/core/util/operators.ts new file mode 100644 index 0000000..c224592 --- /dev/null +++ b/src/main/webapp/app/core/util/operators.ts @@ -0,0 +1,9 @@ +/* + * Function used to workaround https://github.com/microsoft/TypeScript/issues/16069 + * es2019 alternative `const filteredArr = myArr.flatMap((x) => x ? x : []);` + */ +export function isPresent(t: T | undefined | null | void): t is T { + return t !== undefined && t !== null; +} + +export const filterNaN = (input: number): number => (isNaN(input) ? 0 : input); diff --git a/src/main/webapp/app/core/util/parse-links.service.spec.ts b/src/main/webapp/app/core/util/parse-links.service.spec.ts new file mode 100644 index 0000000..40b6c75 --- /dev/null +++ b/src/main/webapp/app/core/util/parse-links.service.spec.ts @@ -0,0 +1,36 @@ +import { inject, TestBed } from '@angular/core/testing'; + +import { ParseLinks } from './parse-links.service'; + +describe('Parse links service test', () => { + describe('Parse Links Service Test', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [ParseLinks], + }); + }); + + it('should throw an error when passed an empty string', inject([ParseLinks], (service: ParseLinks) => { + expect(function () { + service.parse(''); + }).toThrow(new Error('input must not be of zero length')); + })); + + it('should throw an error when passed without comma', inject([ParseLinks], (service: ParseLinks) => { + expect(function () { + service.parse('test'); + }).toThrow(new Error('section could not be split on ";"')); + })); + + it('should throw an error when passed without semicolon', inject([ParseLinks], (service: ParseLinks) => { + expect(function () { + service.parse('test,test2'); + }).toThrow(new Error('section could not be split on ";"')); + })); + + it('should return links when headers are passed', inject([ParseLinks], (service: ParseLinks) => { + const links = { last: 0, first: 0 }; + expect(service.parse(' ; rel="last",; rel="first"')).toEqual(links); + })); + }); +}); diff --git a/src/main/webapp/app/core/util/parse-links.service.ts b/src/main/webapp/app/core/util/parse-links.service.ts new file mode 100644 index 0000000..9c73f50 --- /dev/null +++ b/src/main/webapp/app/core/util/parse-links.service.ts @@ -0,0 +1,50 @@ +import { Injectable } from '@angular/core'; + +/** + * An utility service for link parsing. + */ +@Injectable({ + providedIn: 'root', +}) +export class ParseLinks { + /** + * Method to parse the links + */ + parse(header: string): { [key: string]: number } { + if (header.length === 0) { + throw new Error('input must not be of zero length'); + } + + // Split parts by comma + const parts: string[] = header.split(','); + const links: { [key: string]: number } = {}; + + // Parse each part into a named link + parts.forEach(p => { + const section: string[] = p.split(';'); + + if (section.length !== 2) { + throw new Error('section could not be split on ";"'); + } + + const url: string = section[0].replace(/<(.*)>/, '$1').trim(); + const queryString: { [key: string]: string | undefined } = {}; + + url.replace( + new RegExp('([^?=&]+)(=([^&]*))?', 'g'), + ($0: string, $1: string | undefined, $2: string | undefined, $3: string | undefined) => { + if ($1 !== undefined) { + queryString[$1] = $3; + } + return $3 ?? ''; + } + ); + + if (queryString.page !== undefined) { + const name: string = section[1].replace(/rel="(.*)"/, '$1').trim(); + links[name] = parseInt(queryString.page, 10); + } + }); + return links; + } +} diff --git a/src/main/webapp/app/entities/categoria/categoria.model.ts b/src/main/webapp/app/entities/categoria/categoria.model.ts new file mode 100644 index 0000000..6d80f7a --- /dev/null +++ b/src/main/webapp/app/entities/categoria/categoria.model.ts @@ -0,0 +1,25 @@ +import { IEncuesta } from 'app/entities/encuesta/encuesta.model'; +import { IPlantilla } from 'app/entities/plantilla/plantilla.model'; +import { EstadoCategoria } from 'app/entities/enumerations/estado-categoria.model'; + +export interface ICategoria { + id?: number; + nombre?: string; + estado?: EstadoCategoria; + encuestas?: IEncuesta[] | null; + plantillas?: IPlantilla[] | null; +} + +export class Categoria implements ICategoria { + constructor( + public id?: number, + public nombre?: string, + public estado?: EstadoCategoria, + public encuestas?: IEncuesta[] | null, + public plantillas?: IPlantilla[] | null + ) {} +} + +export function getCategoriaIdentifier(categoria: ICategoria): number | undefined { + return categoria.id; +} diff --git a/src/main/webapp/app/entities/categoria/categoria.module.ts b/src/main/webapp/app/entities/categoria/categoria.module.ts new file mode 100644 index 0000000..96383a6 --- /dev/null +++ b/src/main/webapp/app/entities/categoria/categoria.module.ts @@ -0,0 +1,14 @@ +import { NgModule } from '@angular/core'; +import { SharedModule } from 'app/shared/shared.module'; +import { CategoriaComponent } from './list/categoria.component'; +import { CategoriaDetailComponent } from './detail/categoria-detail.component'; +import { CategoriaUpdateComponent } from './update/categoria-update.component'; +import { CategoriaDeleteDialogComponent } from './delete/categoria-delete-dialog.component'; +import { CategoriaRoutingModule } from './route/categoria-routing.module'; + +@NgModule({ + imports: [SharedModule, CategoriaRoutingModule], + declarations: [CategoriaComponent, CategoriaDetailComponent, CategoriaUpdateComponent, CategoriaDeleteDialogComponent], + entryComponents: [CategoriaDeleteDialogComponent], +}) +export class CategoriaModule {} diff --git a/src/main/webapp/app/entities/categoria/delete/categoria-delete-dialog.component.html b/src/main/webapp/app/entities/categoria/delete/categoria-delete-dialog.component.html new file mode 100644 index 0000000..ed57d17 --- /dev/null +++ b/src/main/webapp/app/entities/categoria/delete/categoria-delete-dialog.component.html @@ -0,0 +1,25 @@ +
+ + + + + +
diff --git a/src/main/webapp/app/entities/categoria/delete/categoria-delete-dialog.component.spec.ts b/src/main/webapp/app/entities/categoria/delete/categoria-delete-dialog.component.spec.ts new file mode 100644 index 0000000..8511caf --- /dev/null +++ b/src/main/webapp/app/entities/categoria/delete/categoria-delete-dialog.component.spec.ts @@ -0,0 +1,65 @@ +jest.mock('@ng-bootstrap/ng-bootstrap'); + +import { ComponentFixture, TestBed, inject, fakeAsync, tick } from '@angular/core/testing'; +import { HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { of } from 'rxjs'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; + +import { CategoriaService } from '../service/categoria.service'; + +import { CategoriaDeleteDialogComponent } from './categoria-delete-dialog.component'; + +describe('Component Tests', () => { + describe('Categoria Management Delete Component', () => { + let comp: CategoriaDeleteDialogComponent; + let fixture: ComponentFixture; + let service: CategoriaService; + let mockActiveModal: NgbActiveModal; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [CategoriaDeleteDialogComponent], + providers: [NgbActiveModal], + }) + .overrideTemplate(CategoriaDeleteDialogComponent, '') + .compileComponents(); + fixture = TestBed.createComponent(CategoriaDeleteDialogComponent); + comp = fixture.componentInstance; + service = TestBed.inject(CategoriaService); + mockActiveModal = TestBed.inject(NgbActiveModal); + }); + + describe('confirmDelete', () => { + it('Should call delete service on confirmDelete', inject( + [], + fakeAsync(() => { + // GIVEN + jest.spyOn(service, 'delete').mockReturnValue(of(new HttpResponse({}))); + + // WHEN + comp.confirmDelete(123); + tick(); + + // THEN + expect(service.delete).toHaveBeenCalledWith(123); + expect(mockActiveModal.close).toHaveBeenCalledWith('deleted'); + }) + )); + + it('Should not call delete service on clear', () => { + // GIVEN + jest.spyOn(service, 'delete'); + + // WHEN + comp.cancel(); + + // THEN + expect(service.delete).not.toHaveBeenCalled(); + expect(mockActiveModal.close).not.toHaveBeenCalled(); + expect(mockActiveModal.dismiss).toHaveBeenCalled(); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/categoria/delete/categoria-delete-dialog.component.ts b/src/main/webapp/app/entities/categoria/delete/categoria-delete-dialog.component.ts new file mode 100644 index 0000000..d6edc6a --- /dev/null +++ b/src/main/webapp/app/entities/categoria/delete/categoria-delete-dialog.component.ts @@ -0,0 +1,24 @@ +import { Component } from '@angular/core'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; + +import { ICategoria } from '../categoria.model'; +import { CategoriaService } from '../service/categoria.service'; + +@Component({ + templateUrl: './categoria-delete-dialog.component.html', +}) +export class CategoriaDeleteDialogComponent { + categoria?: ICategoria; + + constructor(protected categoriaService: CategoriaService, protected activeModal: NgbActiveModal) {} + + cancel(): void { + this.activeModal.dismiss(); + } + + confirmDelete(id: number): void { + this.categoriaService.delete(id).subscribe(() => { + this.activeModal.close('deleted'); + }); + } +} diff --git a/src/main/webapp/app/entities/categoria/detail/categoria-detail.component.html b/src/main/webapp/app/entities/categoria/detail/categoria-detail.component.html new file mode 100644 index 0000000..fe0ee96 --- /dev/null +++ b/src/main/webapp/app/entities/categoria/detail/categoria-detail.component.html @@ -0,0 +1,36 @@ +
+
+
+

Categoria

+ +
+ + + + + +
+
ID
+
+ {{ categoria.id }} +
+
Nombre
+
+ {{ categoria.nombre }} +
+
Estado
+
+ {{ categoria.estado }} +
+
+ + + + +
+
+
diff --git a/src/main/webapp/app/entities/categoria/detail/categoria-detail.component.spec.ts b/src/main/webapp/app/entities/categoria/detail/categoria-detail.component.spec.ts new file mode 100644 index 0000000..506ac72 --- /dev/null +++ b/src/main/webapp/app/entities/categoria/detail/categoria-detail.component.spec.ts @@ -0,0 +1,38 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { ActivatedRoute } from '@angular/router'; +import { of } from 'rxjs'; + +import { CategoriaDetailComponent } from './categoria-detail.component'; + +describe('Component Tests', () => { + describe('Categoria Management Detail Component', () => { + let comp: CategoriaDetailComponent; + let fixture: ComponentFixture; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [CategoriaDetailComponent], + providers: [ + { + provide: ActivatedRoute, + useValue: { data: of({ categoria: { id: 123 } }) }, + }, + ], + }) + .overrideTemplate(CategoriaDetailComponent, '') + .compileComponents(); + fixture = TestBed.createComponent(CategoriaDetailComponent); + comp = fixture.componentInstance; + }); + + describe('OnInit', () => { + it('Should load categoria on init', () => { + // WHEN + comp.ngOnInit(); + + // THEN + expect(comp.categoria).toEqual(expect.objectContaining({ id: 123 })); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/categoria/detail/categoria-detail.component.ts b/src/main/webapp/app/entities/categoria/detail/categoria-detail.component.ts new file mode 100644 index 0000000..36ecdcf --- /dev/null +++ b/src/main/webapp/app/entities/categoria/detail/categoria-detail.component.ts @@ -0,0 +1,24 @@ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; + +import { ICategoria } from '../categoria.model'; + +@Component({ + selector: 'jhi-categoria-detail', + templateUrl: './categoria-detail.component.html', +}) +export class CategoriaDetailComponent implements OnInit { + categoria: ICategoria | null = null; + + constructor(protected activatedRoute: ActivatedRoute) {} + + ngOnInit(): void { + this.activatedRoute.data.subscribe(({ categoria }) => { + this.categoria = categoria; + }); + } + + previousState(): void { + window.history.back(); + } +} diff --git a/src/main/webapp/app/entities/categoria/list/categoria.component.html b/src/main/webapp/app/entities/categoria/list/categoria.component.html new file mode 100644 index 0000000..a6ef61e --- /dev/null +++ b/src/main/webapp/app/entities/categoria/list/categoria.component.html @@ -0,0 +1,80 @@ +
+

+ Categorias + +
+ + + +
+

+ + + + + +
+ No categorias found +
+ +
+ + + + + + + + + + + + + + + + + +
IDNombreEstado
+ {{ categoria.id }} + {{ categoria.nombre }}{{ categoria.estado }} +
+ + + + + +
+
+
+
diff --git a/src/main/webapp/app/entities/categoria/list/categoria.component.spec.ts b/src/main/webapp/app/entities/categoria/list/categoria.component.spec.ts new file mode 100644 index 0000000..863a588 --- /dev/null +++ b/src/main/webapp/app/entities/categoria/list/categoria.component.spec.ts @@ -0,0 +1,48 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { HttpHeaders, HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { of } from 'rxjs'; + +import { CategoriaService } from '../service/categoria.service'; + +import { CategoriaComponent } from './categoria.component'; + +describe('Component Tests', () => { + describe('Categoria Management Component', () => { + let comp: CategoriaComponent; + let fixture: ComponentFixture; + let service: CategoriaService; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [CategoriaComponent], + }) + .overrideTemplate(CategoriaComponent, '') + .compileComponents(); + + fixture = TestBed.createComponent(CategoriaComponent); + comp = fixture.componentInstance; + service = TestBed.inject(CategoriaService); + + const headers = new HttpHeaders().append('link', 'link;link'); + jest.spyOn(service, 'query').mockReturnValue( + of( + new HttpResponse({ + body: [{ id: 123 }], + headers, + }) + ) + ); + }); + + it('Should call load all on init', () => { + // WHEN + comp.ngOnInit(); + + // THEN + expect(service.query).toHaveBeenCalled(); + expect(comp.categorias?.[0]).toEqual(expect.objectContaining({ id: 123 })); + }); + }); +}); diff --git a/src/main/webapp/app/entities/categoria/list/categoria.component.ts b/src/main/webapp/app/entities/categoria/list/categoria.component.ts new file mode 100644 index 0000000..cb48c91 --- /dev/null +++ b/src/main/webapp/app/entities/categoria/list/categoria.component.ts @@ -0,0 +1,51 @@ +import { Component, OnInit } from '@angular/core'; +import { HttpResponse } from '@angular/common/http'; +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; + +import { ICategoria } from '../categoria.model'; +import { CategoriaService } from '../service/categoria.service'; +import { CategoriaDeleteDialogComponent } from '../delete/categoria-delete-dialog.component'; + +@Component({ + selector: 'jhi-categoria', + templateUrl: './categoria.component.html', +}) +export class CategoriaComponent implements OnInit { + categorias?: ICategoria[]; + isLoading = false; + + constructor(protected categoriaService: CategoriaService, protected modalService: NgbModal) {} + + loadAll(): void { + this.isLoading = true; + + this.categoriaService.query().subscribe( + (res: HttpResponse) => { + this.isLoading = false; + this.categorias = res.body ?? []; + }, + () => { + this.isLoading = false; + } + ); + } + + ngOnInit(): void { + this.loadAll(); + } + + trackId(index: number, item: ICategoria): number { + return item.id!; + } + + delete(categoria: ICategoria): void { + const modalRef = this.modalService.open(CategoriaDeleteDialogComponent, { size: 'lg', backdrop: 'static' }); + modalRef.componentInstance.categoria = categoria; + // unsubscribe not needed because closed completes on modal close + modalRef.closed.subscribe(reason => { + if (reason === 'deleted') { + this.loadAll(); + } + }); + } +} diff --git a/src/main/webapp/app/entities/categoria/route/categoria-routing-resolve.service.spec.ts b/src/main/webapp/app/entities/categoria/route/categoria-routing-resolve.service.spec.ts new file mode 100644 index 0000000..957eeb6 --- /dev/null +++ b/src/main/webapp/app/entities/categoria/route/categoria-routing-resolve.service.spec.ts @@ -0,0 +1,82 @@ +jest.mock('@angular/router'); + +import { TestBed } from '@angular/core/testing'; +import { HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { ActivatedRouteSnapshot, Router } from '@angular/router'; +import { of } from 'rxjs'; + +import { ICategoria, Categoria } from '../categoria.model'; +import { CategoriaService } from '../service/categoria.service'; + +import { CategoriaRoutingResolveService } from './categoria-routing-resolve.service'; + +describe('Service Tests', () => { + describe('Categoria routing resolve service', () => { + let mockRouter: Router; + let mockActivatedRouteSnapshot: ActivatedRouteSnapshot; + let routingResolveService: CategoriaRoutingResolveService; + let service: CategoriaService; + let resultCategoria: ICategoria | undefined; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [Router, ActivatedRouteSnapshot], + }); + mockRouter = TestBed.inject(Router); + mockActivatedRouteSnapshot = TestBed.inject(ActivatedRouteSnapshot); + routingResolveService = TestBed.inject(CategoriaRoutingResolveService); + service = TestBed.inject(CategoriaService); + resultCategoria = undefined; + }); + + describe('resolve', () => { + it('should return ICategoria returned by find', () => { + // GIVEN + service.find = jest.fn(id => of(new HttpResponse({ body: { id } }))); + mockActivatedRouteSnapshot.params = { id: 123 }; + + // WHEN + routingResolveService.resolve(mockActivatedRouteSnapshot).subscribe(result => { + resultCategoria = result; + }); + + // THEN + expect(service.find).toBeCalledWith(123); + expect(resultCategoria).toEqual({ id: 123 }); + }); + + it('should return new ICategoria if id is not provided', () => { + // GIVEN + service.find = jest.fn(); + mockActivatedRouteSnapshot.params = {}; + + // WHEN + routingResolveService.resolve(mockActivatedRouteSnapshot).subscribe(result => { + resultCategoria = result; + }); + + // THEN + expect(service.find).not.toBeCalled(); + expect(resultCategoria).toEqual(new Categoria()); + }); + + it('should route to 404 page if data not found in server', () => { + // GIVEN + jest.spyOn(service, 'find').mockReturnValue(of(new HttpResponse({ body: null as unknown as Categoria }))); + mockActivatedRouteSnapshot.params = { id: 123 }; + + // WHEN + routingResolveService.resolve(mockActivatedRouteSnapshot).subscribe(result => { + resultCategoria = result; + }); + + // THEN + expect(service.find).toBeCalledWith(123); + expect(resultCategoria).toEqual(undefined); + expect(mockRouter.navigate).toHaveBeenCalledWith(['404']); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/categoria/route/categoria-routing-resolve.service.ts b/src/main/webapp/app/entities/categoria/route/categoria-routing-resolve.service.ts new file mode 100644 index 0000000..4d611ff --- /dev/null +++ b/src/main/webapp/app/entities/categoria/route/categoria-routing-resolve.service.ts @@ -0,0 +1,30 @@ +import { Injectable } from '@angular/core'; +import { HttpResponse } from '@angular/common/http'; +import { Resolve, ActivatedRouteSnapshot, Router } from '@angular/router'; +import { Observable, of, EMPTY } from 'rxjs'; +import { mergeMap } from 'rxjs/operators'; + +import { ICategoria, Categoria } from '../categoria.model'; +import { CategoriaService } from '../service/categoria.service'; + +@Injectable({ providedIn: 'root' }) +export class CategoriaRoutingResolveService implements Resolve { + constructor(protected service: CategoriaService, protected router: Router) {} + + resolve(route: ActivatedRouteSnapshot): Observable | Observable { + const id = route.params['id']; + if (id) { + return this.service.find(id).pipe( + mergeMap((categoria: HttpResponse) => { + if (categoria.body) { + return of(categoria.body); + } else { + this.router.navigate(['404']); + return EMPTY; + } + }) + ); + } + return of(new Categoria()); + } +} diff --git a/src/main/webapp/app/entities/categoria/route/categoria-routing.module.ts b/src/main/webapp/app/entities/categoria/route/categoria-routing.module.ts new file mode 100644 index 0000000..d48d560 --- /dev/null +++ b/src/main/webapp/app/entities/categoria/route/categoria-routing.module.ts @@ -0,0 +1,46 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; + +import { UserRouteAccessService } from 'app/core/auth/user-route-access.service'; +import { CategoriaComponent } from '../list/categoria.component'; +import { CategoriaDetailComponent } from '../detail/categoria-detail.component'; +import { CategoriaUpdateComponent } from '../update/categoria-update.component'; +import { CategoriaRoutingResolveService } from './categoria-routing-resolve.service'; + +const categoriaRoute: Routes = [ + { + path: '', + component: CategoriaComponent, + canActivate: [UserRouteAccessService], + }, + { + path: ':id/view', + component: CategoriaDetailComponent, + resolve: { + categoria: CategoriaRoutingResolveService, + }, + canActivate: [UserRouteAccessService], + }, + { + path: 'new', + component: CategoriaUpdateComponent, + resolve: { + categoria: CategoriaRoutingResolveService, + }, + canActivate: [UserRouteAccessService], + }, + { + path: ':id/edit', + component: CategoriaUpdateComponent, + resolve: { + categoria: CategoriaRoutingResolveService, + }, + canActivate: [UserRouteAccessService], + }, +]; + +@NgModule({ + imports: [RouterModule.forChild(categoriaRoute)], + exports: [RouterModule], +}) +export class CategoriaRoutingModule {} diff --git a/src/main/webapp/app/entities/categoria/service/categoria.service.spec.ts b/src/main/webapp/app/entities/categoria/service/categoria.service.spec.ts new file mode 100644 index 0000000..f2d7412 --- /dev/null +++ b/src/main/webapp/app/entities/categoria/service/categoria.service.spec.ts @@ -0,0 +1,188 @@ +import { TestBed } from '@angular/core/testing'; +import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; + +import { EstadoCategoria } from 'app/entities/enumerations/estado-categoria.model'; +import { ICategoria, Categoria } from '../categoria.model'; + +import { CategoriaService } from './categoria.service'; + +describe('Service Tests', () => { + describe('Categoria Service', () => { + let service: CategoriaService; + let httpMock: HttpTestingController; + let elemDefault: ICategoria; + let expectedResult: ICategoria | ICategoria[] | boolean | null; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + }); + expectedResult = null; + service = TestBed.inject(CategoriaService); + httpMock = TestBed.inject(HttpTestingController); + + elemDefault = { + id: 0, + nombre: 'AAAAAAA', + estado: EstadoCategoria.ACTIVE, + }; + }); + + describe('Service methods', () => { + it('should find an element', () => { + const returnedFromService = Object.assign({}, elemDefault); + + service.find(123).subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'GET' }); + req.flush(returnedFromService); + expect(expectedResult).toMatchObject(elemDefault); + }); + + it('should create a Categoria', () => { + const returnedFromService = Object.assign( + { + id: 0, + }, + elemDefault + ); + + const expected = Object.assign({}, returnedFromService); + + service.create(new Categoria()).subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'POST' }); + req.flush(returnedFromService); + expect(expectedResult).toMatchObject(expected); + }); + + it('should update a Categoria', () => { + const returnedFromService = Object.assign( + { + id: 1, + nombre: 'BBBBBB', + estado: 'BBBBBB', + }, + elemDefault + ); + + const expected = Object.assign({}, returnedFromService); + + service.update(expected).subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'PUT' }); + req.flush(returnedFromService); + expect(expectedResult).toMatchObject(expected); + }); + + it('should partial update a Categoria', () => { + const patchObject = Object.assign( + { + estado: 'BBBBBB', + }, + new Categoria() + ); + + const returnedFromService = Object.assign(patchObject, elemDefault); + + const expected = Object.assign({}, returnedFromService); + + service.partialUpdate(patchObject).subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'PATCH' }); + req.flush(returnedFromService); + expect(expectedResult).toMatchObject(expected); + }); + + it('should return a list of Categoria', () => { + const returnedFromService = Object.assign( + { + id: 1, + nombre: 'BBBBBB', + estado: 'BBBBBB', + }, + elemDefault + ); + + const expected = Object.assign({}, returnedFromService); + + service.query().subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'GET' }); + req.flush([returnedFromService]); + httpMock.verify(); + expect(expectedResult).toContainEqual(expected); + }); + + it('should delete a Categoria', () => { + service.delete(123).subscribe(resp => (expectedResult = resp.ok)); + + const req = httpMock.expectOne({ method: 'DELETE' }); + req.flush({ status: 200 }); + expect(expectedResult); + }); + + describe('addCategoriaToCollectionIfMissing', () => { + it('should add a Categoria to an empty array', () => { + const categoria: ICategoria = { id: 123 }; + expectedResult = service.addCategoriaToCollectionIfMissing([], categoria); + expect(expectedResult).toHaveLength(1); + expect(expectedResult).toContain(categoria); + }); + + it('should not add a Categoria to an array that contains it', () => { + const categoria: ICategoria = { id: 123 }; + const categoriaCollection: ICategoria[] = [ + { + ...categoria, + }, + { id: 456 }, + ]; + expectedResult = service.addCategoriaToCollectionIfMissing(categoriaCollection, categoria); + expect(expectedResult).toHaveLength(2); + }); + + it("should add a Categoria to an array that doesn't contain it", () => { + const categoria: ICategoria = { id: 123 }; + const categoriaCollection: ICategoria[] = [{ id: 456 }]; + expectedResult = service.addCategoriaToCollectionIfMissing(categoriaCollection, categoria); + expect(expectedResult).toHaveLength(2); + expect(expectedResult).toContain(categoria); + }); + + it('should add only unique Categoria to an array', () => { + const categoriaArray: ICategoria[] = [{ id: 123 }, { id: 456 }, { id: 17584 }]; + const categoriaCollection: ICategoria[] = [{ id: 123 }]; + expectedResult = service.addCategoriaToCollectionIfMissing(categoriaCollection, ...categoriaArray); + expect(expectedResult).toHaveLength(3); + }); + + it('should accept varargs', () => { + const categoria: ICategoria = { id: 123 }; + const categoria2: ICategoria = { id: 456 }; + expectedResult = service.addCategoriaToCollectionIfMissing([], categoria, categoria2); + expect(expectedResult).toHaveLength(2); + expect(expectedResult).toContain(categoria); + expect(expectedResult).toContain(categoria2); + }); + + it('should accept null and undefined values', () => { + const categoria: ICategoria = { id: 123 }; + expectedResult = service.addCategoriaToCollectionIfMissing([], null, categoria, undefined); + expect(expectedResult).toHaveLength(1); + expect(expectedResult).toContain(categoria); + }); + + it('should return initial array if no Categoria is added', () => { + const categoriaCollection: ICategoria[] = [{ id: 123 }]; + expectedResult = service.addCategoriaToCollectionIfMissing(categoriaCollection, undefined, null); + expect(expectedResult).toEqual(categoriaCollection); + }); + }); + }); + + afterEach(() => { + httpMock.verify(); + }); + }); +}); diff --git a/src/main/webapp/app/entities/categoria/service/categoria.service.ts b/src/main/webapp/app/entities/categoria/service/categoria.service.ts new file mode 100644 index 0000000..35d1c30 --- /dev/null +++ b/src/main/webapp/app/entities/categoria/service/categoria.service.ts @@ -0,0 +1,67 @@ +import { Injectable } from '@angular/core'; +import { HttpClient, HttpResponse } from '@angular/common/http'; +import { Observable } from 'rxjs'; + +import { isPresent } from 'app/core/util/operators'; +import { ApplicationConfigService } from 'app/core/config/application-config.service'; +import { createRequestOption } from 'app/core/request/request-util'; +import { ICategoria, getCategoriaIdentifier } from '../categoria.model'; + +export type EntityResponseType = HttpResponse; +export type EntityArrayResponseType = HttpResponse; + +@Injectable({ providedIn: 'root' }) +export class CategoriaService { + protected resourceUrl = this.applicationConfigService.getEndpointFor('api/categorias'); + + constructor(protected http: HttpClient, protected applicationConfigService: ApplicationConfigService) {} + + create(categoria: ICategoria): Observable { + return this.http.post(this.resourceUrl, categoria, { observe: 'response' }); + } + + update(categoria: ICategoria): Observable { + return this.http.put(`${this.resourceUrl}/${getCategoriaIdentifier(categoria) as number}`, categoria, { + observe: 'response', + }); + } + + partialUpdate(categoria: ICategoria): Observable { + return this.http.patch(`${this.resourceUrl}/${getCategoriaIdentifier(categoria) as number}`, categoria, { + observe: 'response', + }); + } + + find(id: number): Observable { + return this.http.get(`${this.resourceUrl}/${id}`, { observe: 'response' }); + } + + query(req?: any): Observable { + const options = createRequestOption(req); + return this.http.get(this.resourceUrl, { params: options, observe: 'response' }); + } + + delete(id: number): Observable> { + return this.http.delete(`${this.resourceUrl}/${id}`, { observe: 'response' }); + } + + addCategoriaToCollectionIfMissing( + categoriaCollection: ICategoria[], + ...categoriasToCheck: (ICategoria | null | undefined)[] + ): ICategoria[] { + const categorias: ICategoria[] = categoriasToCheck.filter(isPresent); + if (categorias.length > 0) { + const categoriaCollectionIdentifiers = categoriaCollection.map(categoriaItem => getCategoriaIdentifier(categoriaItem)!); + const categoriasToAdd = categorias.filter(categoriaItem => { + const categoriaIdentifier = getCategoriaIdentifier(categoriaItem); + if (categoriaIdentifier == null || categoriaCollectionIdentifiers.includes(categoriaIdentifier)) { + return false; + } + categoriaCollectionIdentifiers.push(categoriaIdentifier); + return true; + }); + return [...categoriasToAdd, ...categoriaCollection]; + } + return categoriaCollection; + } +} diff --git a/src/main/webapp/app/entities/categoria/update/categoria-update.component.html b/src/main/webapp/app/entities/categoria/update/categoria-update.component.html new file mode 100644 index 0000000..01dea01 --- /dev/null +++ b/src/main/webapp/app/entities/categoria/update/categoria-update.component.html @@ -0,0 +1,58 @@ +
+
+
+

+ Create or edit a Categoria +

+ +
+ + +
+ + +
+ +
+ + +
+ + This field is required. + +
+
+ +
+ + +
+ + This field is required. + +
+
+
+ +
+ + + +
+
+
+
diff --git a/src/main/webapp/app/entities/categoria/update/categoria-update.component.spec.ts b/src/main/webapp/app/entities/categoria/update/categoria-update.component.spec.ts new file mode 100644 index 0000000..30509ef --- /dev/null +++ b/src/main/webapp/app/entities/categoria/update/categoria-update.component.spec.ts @@ -0,0 +1,113 @@ +jest.mock('@angular/router'); + +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { FormBuilder } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; +import { of, Subject } from 'rxjs'; + +import { CategoriaService } from '../service/categoria.service'; +import { ICategoria, Categoria } from '../categoria.model'; + +import { CategoriaUpdateComponent } from './categoria-update.component'; + +describe('Component Tests', () => { + describe('Categoria Management Update Component', () => { + let comp: CategoriaUpdateComponent; + let fixture: ComponentFixture; + let activatedRoute: ActivatedRoute; + let categoriaService: CategoriaService; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [CategoriaUpdateComponent], + providers: [FormBuilder, ActivatedRoute], + }) + .overrideTemplate(CategoriaUpdateComponent, '') + .compileComponents(); + + fixture = TestBed.createComponent(CategoriaUpdateComponent); + activatedRoute = TestBed.inject(ActivatedRoute); + categoriaService = TestBed.inject(CategoriaService); + + comp = fixture.componentInstance; + }); + + describe('ngOnInit', () => { + it('Should update editForm', () => { + const categoria: ICategoria = { id: 456 }; + + activatedRoute.data = of({ categoria }); + comp.ngOnInit(); + + expect(comp.editForm.value).toEqual(expect.objectContaining(categoria)); + }); + }); + + describe('save', () => { + it('Should call update service on save for existing entity', () => { + // GIVEN + const saveSubject = new Subject>(); + const categoria = { id: 123 }; + jest.spyOn(categoriaService, 'update').mockReturnValue(saveSubject); + jest.spyOn(comp, 'previousState'); + activatedRoute.data = of({ categoria }); + comp.ngOnInit(); + + // WHEN + comp.save(); + expect(comp.isSaving).toEqual(true); + saveSubject.next(new HttpResponse({ body: categoria })); + saveSubject.complete(); + + // THEN + expect(comp.previousState).toHaveBeenCalled(); + expect(categoriaService.update).toHaveBeenCalledWith(categoria); + expect(comp.isSaving).toEqual(false); + }); + + it('Should call create service on save for new entity', () => { + // GIVEN + const saveSubject = new Subject>(); + const categoria = new Categoria(); + jest.spyOn(categoriaService, 'create').mockReturnValue(saveSubject); + jest.spyOn(comp, 'previousState'); + activatedRoute.data = of({ categoria }); + comp.ngOnInit(); + + // WHEN + comp.save(); + expect(comp.isSaving).toEqual(true); + saveSubject.next(new HttpResponse({ body: categoria })); + saveSubject.complete(); + + // THEN + expect(categoriaService.create).toHaveBeenCalledWith(categoria); + expect(comp.isSaving).toEqual(false); + expect(comp.previousState).toHaveBeenCalled(); + }); + + it('Should set isSaving to false on error', () => { + // GIVEN + const saveSubject = new Subject>(); + const categoria = { id: 123 }; + jest.spyOn(categoriaService, 'update').mockReturnValue(saveSubject); + jest.spyOn(comp, 'previousState'); + activatedRoute.data = of({ categoria }); + comp.ngOnInit(); + + // WHEN + comp.save(); + expect(comp.isSaving).toEqual(true); + saveSubject.error('This is an error!'); + + // THEN + expect(categoriaService.update).toHaveBeenCalledWith(categoria); + expect(comp.isSaving).toEqual(false); + expect(comp.previousState).not.toHaveBeenCalled(); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/categoria/update/categoria-update.component.ts b/src/main/webapp/app/entities/categoria/update/categoria-update.component.ts new file mode 100644 index 0000000..b5d24ae --- /dev/null +++ b/src/main/webapp/app/entities/categoria/update/categoria-update.component.ts @@ -0,0 +1,81 @@ +import { Component, OnInit } from '@angular/core'; +import { HttpResponse } from '@angular/common/http'; +import { FormBuilder, Validators } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; +import { Observable } from 'rxjs'; +import { finalize } from 'rxjs/operators'; + +import { ICategoria, Categoria } from '../categoria.model'; +import { CategoriaService } from '../service/categoria.service'; + +@Component({ + selector: 'jhi-categoria-update', + templateUrl: './categoria-update.component.html', +}) +export class CategoriaUpdateComponent implements OnInit { + isSaving = false; + + editForm = this.fb.group({ + id: [], + nombre: [null, [Validators.required]], + estado: [null, [Validators.required]], + }); + + constructor(protected categoriaService: CategoriaService, protected activatedRoute: ActivatedRoute, protected fb: FormBuilder) {} + + ngOnInit(): void { + this.activatedRoute.data.subscribe(({ categoria }) => { + this.updateForm(categoria); + }); + } + + previousState(): void { + window.history.back(); + } + + save(): void { + this.isSaving = true; + const categoria = this.createFromForm(); + if (categoria.id !== undefined) { + this.subscribeToSaveResponse(this.categoriaService.update(categoria)); + } else { + this.subscribeToSaveResponse(this.categoriaService.create(categoria)); + } + } + + protected subscribeToSaveResponse(result: Observable>): void { + result.pipe(finalize(() => this.onSaveFinalize())).subscribe( + () => this.onSaveSuccess(), + () => this.onSaveError() + ); + } + + protected onSaveSuccess(): void { + this.previousState(); + } + + protected onSaveError(): void { + // Api for inheritance. + } + + protected onSaveFinalize(): void { + this.isSaving = false; + } + + protected updateForm(categoria: ICategoria): void { + this.editForm.patchValue({ + id: categoria.id, + nombre: categoria.nombre, + estado: categoria.estado, + }); + } + + protected createFromForm(): ICategoria { + return { + ...new Categoria(), + id: this.editForm.get(['id'])!.value, + nombre: this.editForm.get(['nombre'])!.value, + estado: this.editForm.get(['estado'])!.value, + }; + } +} diff --git a/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/delete/e-pregunta-abierta-respuesta-delete-dialog.component.html b/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/delete/e-pregunta-abierta-respuesta-delete-dialog.component.html new file mode 100644 index 0000000..2bfe71f --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/delete/e-pregunta-abierta-respuesta-delete-dialog.component.html @@ -0,0 +1,31 @@ +
+ + + + + +
diff --git a/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/delete/e-pregunta-abierta-respuesta-delete-dialog.component.spec.ts b/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/delete/e-pregunta-abierta-respuesta-delete-dialog.component.spec.ts new file mode 100644 index 0000000..165acbc --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/delete/e-pregunta-abierta-respuesta-delete-dialog.component.spec.ts @@ -0,0 +1,65 @@ +jest.mock('@ng-bootstrap/ng-bootstrap'); + +import { ComponentFixture, TestBed, inject, fakeAsync, tick } from '@angular/core/testing'; +import { HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { of } from 'rxjs'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; + +import { EPreguntaAbiertaRespuestaService } from '../service/e-pregunta-abierta-respuesta.service'; + +import { EPreguntaAbiertaRespuestaDeleteDialogComponent } from './e-pregunta-abierta-respuesta-delete-dialog.component'; + +describe('Component Tests', () => { + describe('EPreguntaAbiertaRespuesta Management Delete Component', () => { + let comp: EPreguntaAbiertaRespuestaDeleteDialogComponent; + let fixture: ComponentFixture; + let service: EPreguntaAbiertaRespuestaService; + let mockActiveModal: NgbActiveModal; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [EPreguntaAbiertaRespuestaDeleteDialogComponent], + providers: [NgbActiveModal], + }) + .overrideTemplate(EPreguntaAbiertaRespuestaDeleteDialogComponent, '') + .compileComponents(); + fixture = TestBed.createComponent(EPreguntaAbiertaRespuestaDeleteDialogComponent); + comp = fixture.componentInstance; + service = TestBed.inject(EPreguntaAbiertaRespuestaService); + mockActiveModal = TestBed.inject(NgbActiveModal); + }); + + describe('confirmDelete', () => { + it('Should call delete service on confirmDelete', inject( + [], + fakeAsync(() => { + // GIVEN + jest.spyOn(service, 'delete').mockReturnValue(of(new HttpResponse({}))); + + // WHEN + comp.confirmDelete(123); + tick(); + + // THEN + expect(service.delete).toHaveBeenCalledWith(123); + expect(mockActiveModal.close).toHaveBeenCalledWith('deleted'); + }) + )); + + it('Should not call delete service on clear', () => { + // GIVEN + jest.spyOn(service, 'delete'); + + // WHEN + comp.cancel(); + + // THEN + expect(service.delete).not.toHaveBeenCalled(); + expect(mockActiveModal.close).not.toHaveBeenCalled(); + expect(mockActiveModal.dismiss).toHaveBeenCalled(); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/delete/e-pregunta-abierta-respuesta-delete-dialog.component.ts b/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/delete/e-pregunta-abierta-respuesta-delete-dialog.component.ts new file mode 100644 index 0000000..eb27291 --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/delete/e-pregunta-abierta-respuesta-delete-dialog.component.ts @@ -0,0 +1,24 @@ +import { Component } from '@angular/core'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; + +import { IEPreguntaAbiertaRespuesta } from '../e-pregunta-abierta-respuesta.model'; +import { EPreguntaAbiertaRespuestaService } from '../service/e-pregunta-abierta-respuesta.service'; + +@Component({ + templateUrl: './e-pregunta-abierta-respuesta-delete-dialog.component.html', +}) +export class EPreguntaAbiertaRespuestaDeleteDialogComponent { + ePreguntaAbiertaRespuesta?: IEPreguntaAbiertaRespuesta; + + constructor(protected ePreguntaAbiertaRespuestaService: EPreguntaAbiertaRespuestaService, protected activeModal: NgbActiveModal) {} + + cancel(): void { + this.activeModal.dismiss(); + } + + confirmDelete(id: number): void { + this.ePreguntaAbiertaRespuestaService.delete(id).subscribe(() => { + this.activeModal.close('deleted'); + }); + } +} diff --git a/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/detail/e-pregunta-abierta-respuesta-detail.component.html b/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/detail/e-pregunta-abierta-respuesta-detail.component.html new file mode 100644 index 0000000..03e44c2 --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/detail/e-pregunta-abierta-respuesta-detail.component.html @@ -0,0 +1,42 @@ +
+
+
+

+ E Pregunta Abierta Respuesta +

+ +
+ + + + + +
+
ID
+
+ {{ ePreguntaAbiertaRespuesta.id }} +
+
Respuesta
+
+ {{ ePreguntaAbiertaRespuesta.respuesta }} +
+
E Pregunta Abierta
+
+ +
+
+ + + + +
+
+
diff --git a/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/detail/e-pregunta-abierta-respuesta-detail.component.spec.ts b/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/detail/e-pregunta-abierta-respuesta-detail.component.spec.ts new file mode 100644 index 0000000..72e2153 --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/detail/e-pregunta-abierta-respuesta-detail.component.spec.ts @@ -0,0 +1,38 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { ActivatedRoute } from '@angular/router'; +import { of } from 'rxjs'; + +import { EPreguntaAbiertaRespuestaDetailComponent } from './e-pregunta-abierta-respuesta-detail.component'; + +describe('Component Tests', () => { + describe('EPreguntaAbiertaRespuesta Management Detail Component', () => { + let comp: EPreguntaAbiertaRespuestaDetailComponent; + let fixture: ComponentFixture; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [EPreguntaAbiertaRespuestaDetailComponent], + providers: [ + { + provide: ActivatedRoute, + useValue: { data: of({ ePreguntaAbiertaRespuesta: { id: 123 } }) }, + }, + ], + }) + .overrideTemplate(EPreguntaAbiertaRespuestaDetailComponent, '') + .compileComponents(); + fixture = TestBed.createComponent(EPreguntaAbiertaRespuestaDetailComponent); + comp = fixture.componentInstance; + }); + + describe('OnInit', () => { + it('Should load ePreguntaAbiertaRespuesta on init', () => { + // WHEN + comp.ngOnInit(); + + // THEN + expect(comp.ePreguntaAbiertaRespuesta).toEqual(expect.objectContaining({ id: 123 })); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/detail/e-pregunta-abierta-respuesta-detail.component.ts b/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/detail/e-pregunta-abierta-respuesta-detail.component.ts new file mode 100644 index 0000000..316cef2 --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/detail/e-pregunta-abierta-respuesta-detail.component.ts @@ -0,0 +1,24 @@ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; + +import { IEPreguntaAbiertaRespuesta } from '../e-pregunta-abierta-respuesta.model'; + +@Component({ + selector: 'jhi-e-pregunta-abierta-respuesta-detail', + templateUrl: './e-pregunta-abierta-respuesta-detail.component.html', +}) +export class EPreguntaAbiertaRespuestaDetailComponent implements OnInit { + ePreguntaAbiertaRespuesta: IEPreguntaAbiertaRespuesta | null = null; + + constructor(protected activatedRoute: ActivatedRoute) {} + + ngOnInit(): void { + this.activatedRoute.data.subscribe(({ ePreguntaAbiertaRespuesta }) => { + this.ePreguntaAbiertaRespuesta = ePreguntaAbiertaRespuesta; + }); + } + + previousState(): void { + window.history.back(); + } +} diff --git a/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/e-pregunta-abierta-respuesta.model.ts b/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/e-pregunta-abierta-respuesta.model.ts new file mode 100644 index 0000000..8439571 --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/e-pregunta-abierta-respuesta.model.ts @@ -0,0 +1,15 @@ +import { IEPreguntaAbierta } from 'app/entities/e-pregunta-abierta/e-pregunta-abierta.model'; + +export interface IEPreguntaAbiertaRespuesta { + id?: number; + respuesta?: string; + ePreguntaAbierta?: IEPreguntaAbierta | null; +} + +export class EPreguntaAbiertaRespuesta implements IEPreguntaAbiertaRespuesta { + constructor(public id?: number, public respuesta?: string, public ePreguntaAbierta?: IEPreguntaAbierta | null) {} +} + +export function getEPreguntaAbiertaRespuestaIdentifier(ePreguntaAbiertaRespuesta: IEPreguntaAbiertaRespuesta): number | undefined { + return ePreguntaAbiertaRespuesta.id; +} diff --git a/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/e-pregunta-abierta-respuesta.module.ts b/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/e-pregunta-abierta-respuesta.module.ts new file mode 100644 index 0000000..e945249 --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/e-pregunta-abierta-respuesta.module.ts @@ -0,0 +1,19 @@ +import { NgModule } from '@angular/core'; +import { SharedModule } from 'app/shared/shared.module'; +import { EPreguntaAbiertaRespuestaComponent } from './list/e-pregunta-abierta-respuesta.component'; +import { EPreguntaAbiertaRespuestaDetailComponent } from './detail/e-pregunta-abierta-respuesta-detail.component'; +import { EPreguntaAbiertaRespuestaUpdateComponent } from './update/e-pregunta-abierta-respuesta-update.component'; +import { EPreguntaAbiertaRespuestaDeleteDialogComponent } from './delete/e-pregunta-abierta-respuesta-delete-dialog.component'; +import { EPreguntaAbiertaRespuestaRoutingModule } from './route/e-pregunta-abierta-respuesta-routing.module'; + +@NgModule({ + imports: [SharedModule, EPreguntaAbiertaRespuestaRoutingModule], + declarations: [ + EPreguntaAbiertaRespuestaComponent, + EPreguntaAbiertaRespuestaDetailComponent, + EPreguntaAbiertaRespuestaUpdateComponent, + EPreguntaAbiertaRespuestaDeleteDialogComponent, + ], + entryComponents: [EPreguntaAbiertaRespuestaDeleteDialogComponent], +}) +export class EPreguntaAbiertaRespuestaModule {} diff --git a/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/list/e-pregunta-abierta-respuesta.component.html b/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/list/e-pregunta-abierta-respuesta.component.html new file mode 100644 index 0000000..c26f340 --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/list/e-pregunta-abierta-respuesta.component.html @@ -0,0 +1,86 @@ +
+

+ E Pregunta Abierta Respuestas + +
+ + + +
+

+ + + + + +
+ No ePreguntaAbiertaRespuestas found +
+ +
+ + + + + + + + + + + + + + + + + +
IDRespuestaE Pregunta Abierta
+ {{ ePreguntaAbiertaRespuesta.id }} + {{ ePreguntaAbiertaRespuesta.respuesta }} + + +
+ + + + + +
+
+
+
diff --git a/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/list/e-pregunta-abierta-respuesta.component.spec.ts b/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/list/e-pregunta-abierta-respuesta.component.spec.ts new file mode 100644 index 0000000..96765ec --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/list/e-pregunta-abierta-respuesta.component.spec.ts @@ -0,0 +1,48 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { HttpHeaders, HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { of } from 'rxjs'; + +import { EPreguntaAbiertaRespuestaService } from '../service/e-pregunta-abierta-respuesta.service'; + +import { EPreguntaAbiertaRespuestaComponent } from './e-pregunta-abierta-respuesta.component'; + +describe('Component Tests', () => { + describe('EPreguntaAbiertaRespuesta Management Component', () => { + let comp: EPreguntaAbiertaRespuestaComponent; + let fixture: ComponentFixture; + let service: EPreguntaAbiertaRespuestaService; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [EPreguntaAbiertaRespuestaComponent], + }) + .overrideTemplate(EPreguntaAbiertaRespuestaComponent, '') + .compileComponents(); + + fixture = TestBed.createComponent(EPreguntaAbiertaRespuestaComponent); + comp = fixture.componentInstance; + service = TestBed.inject(EPreguntaAbiertaRespuestaService); + + const headers = new HttpHeaders().append('link', 'link;link'); + jest.spyOn(service, 'query').mockReturnValue( + of( + new HttpResponse({ + body: [{ id: 123 }], + headers, + }) + ) + ); + }); + + it('Should call load all on init', () => { + // WHEN + comp.ngOnInit(); + + // THEN + expect(service.query).toHaveBeenCalled(); + expect(comp.ePreguntaAbiertaRespuestas?.[0]).toEqual(expect.objectContaining({ id: 123 })); + }); + }); +}); diff --git a/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/list/e-pregunta-abierta-respuesta.component.ts b/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/list/e-pregunta-abierta-respuesta.component.ts new file mode 100644 index 0000000..bb9274a --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/list/e-pregunta-abierta-respuesta.component.ts @@ -0,0 +1,51 @@ +import { Component, OnInit } from '@angular/core'; +import { HttpResponse } from '@angular/common/http'; +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; + +import { IEPreguntaAbiertaRespuesta } from '../e-pregunta-abierta-respuesta.model'; +import { EPreguntaAbiertaRespuestaService } from '../service/e-pregunta-abierta-respuesta.service'; +import { EPreguntaAbiertaRespuestaDeleteDialogComponent } from '../delete/e-pregunta-abierta-respuesta-delete-dialog.component'; + +@Component({ + selector: 'jhi-e-pregunta-abierta-respuesta', + templateUrl: './e-pregunta-abierta-respuesta.component.html', +}) +export class EPreguntaAbiertaRespuestaComponent implements OnInit { + ePreguntaAbiertaRespuestas?: IEPreguntaAbiertaRespuesta[]; + isLoading = false; + + constructor(protected ePreguntaAbiertaRespuestaService: EPreguntaAbiertaRespuestaService, protected modalService: NgbModal) {} + + loadAll(): void { + this.isLoading = true; + + this.ePreguntaAbiertaRespuestaService.query().subscribe( + (res: HttpResponse) => { + this.isLoading = false; + this.ePreguntaAbiertaRespuestas = res.body ?? []; + }, + () => { + this.isLoading = false; + } + ); + } + + ngOnInit(): void { + this.loadAll(); + } + + trackId(index: number, item: IEPreguntaAbiertaRespuesta): number { + return item.id!; + } + + delete(ePreguntaAbiertaRespuesta: IEPreguntaAbiertaRespuesta): void { + const modalRef = this.modalService.open(EPreguntaAbiertaRespuestaDeleteDialogComponent, { size: 'lg', backdrop: 'static' }); + modalRef.componentInstance.ePreguntaAbiertaRespuesta = ePreguntaAbiertaRespuesta; + // unsubscribe not needed because closed completes on modal close + modalRef.closed.subscribe(reason => { + if (reason === 'deleted') { + this.loadAll(); + } + }); + } +} diff --git a/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/route/e-pregunta-abierta-respuesta-routing-resolve.service.spec.ts b/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/route/e-pregunta-abierta-respuesta-routing-resolve.service.spec.ts new file mode 100644 index 0000000..40bd980 --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/route/e-pregunta-abierta-respuesta-routing-resolve.service.spec.ts @@ -0,0 +1,82 @@ +jest.mock('@angular/router'); + +import { TestBed } from '@angular/core/testing'; +import { HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { ActivatedRouteSnapshot, Router } from '@angular/router'; +import { of } from 'rxjs'; + +import { IEPreguntaAbiertaRespuesta, EPreguntaAbiertaRespuesta } from '../e-pregunta-abierta-respuesta.model'; +import { EPreguntaAbiertaRespuestaService } from '../service/e-pregunta-abierta-respuesta.service'; + +import { EPreguntaAbiertaRespuestaRoutingResolveService } from './e-pregunta-abierta-respuesta-routing-resolve.service'; + +describe('Service Tests', () => { + describe('EPreguntaAbiertaRespuesta routing resolve service', () => { + let mockRouter: Router; + let mockActivatedRouteSnapshot: ActivatedRouteSnapshot; + let routingResolveService: EPreguntaAbiertaRespuestaRoutingResolveService; + let service: EPreguntaAbiertaRespuestaService; + let resultEPreguntaAbiertaRespuesta: IEPreguntaAbiertaRespuesta | undefined; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [Router, ActivatedRouteSnapshot], + }); + mockRouter = TestBed.inject(Router); + mockActivatedRouteSnapshot = TestBed.inject(ActivatedRouteSnapshot); + routingResolveService = TestBed.inject(EPreguntaAbiertaRespuestaRoutingResolveService); + service = TestBed.inject(EPreguntaAbiertaRespuestaService); + resultEPreguntaAbiertaRespuesta = undefined; + }); + + describe('resolve', () => { + it('should return IEPreguntaAbiertaRespuesta returned by find', () => { + // GIVEN + service.find = jest.fn(id => of(new HttpResponse({ body: { id } }))); + mockActivatedRouteSnapshot.params = { id: 123 }; + + // WHEN + routingResolveService.resolve(mockActivatedRouteSnapshot).subscribe(result => { + resultEPreguntaAbiertaRespuesta = result; + }); + + // THEN + expect(service.find).toBeCalledWith(123); + expect(resultEPreguntaAbiertaRespuesta).toEqual({ id: 123 }); + }); + + it('should return new IEPreguntaAbiertaRespuesta if id is not provided', () => { + // GIVEN + service.find = jest.fn(); + mockActivatedRouteSnapshot.params = {}; + + // WHEN + routingResolveService.resolve(mockActivatedRouteSnapshot).subscribe(result => { + resultEPreguntaAbiertaRespuesta = result; + }); + + // THEN + expect(service.find).not.toBeCalled(); + expect(resultEPreguntaAbiertaRespuesta).toEqual(new EPreguntaAbiertaRespuesta()); + }); + + it('should route to 404 page if data not found in server', () => { + // GIVEN + jest.spyOn(service, 'find').mockReturnValue(of(new HttpResponse({ body: null as unknown as EPreguntaAbiertaRespuesta }))); + mockActivatedRouteSnapshot.params = { id: 123 }; + + // WHEN + routingResolveService.resolve(mockActivatedRouteSnapshot).subscribe(result => { + resultEPreguntaAbiertaRespuesta = result; + }); + + // THEN + expect(service.find).toBeCalledWith(123); + expect(resultEPreguntaAbiertaRespuesta).toEqual(undefined); + expect(mockRouter.navigate).toHaveBeenCalledWith(['404']); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/route/e-pregunta-abierta-respuesta-routing-resolve.service.ts b/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/route/e-pregunta-abierta-respuesta-routing-resolve.service.ts new file mode 100644 index 0000000..a90a35a --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/route/e-pregunta-abierta-respuesta-routing-resolve.service.ts @@ -0,0 +1,30 @@ +import { Injectable } from '@angular/core'; +import { HttpResponse } from '@angular/common/http'; +import { Resolve, ActivatedRouteSnapshot, Router } from '@angular/router'; +import { Observable, of, EMPTY } from 'rxjs'; +import { mergeMap } from 'rxjs/operators'; + +import { IEPreguntaAbiertaRespuesta, EPreguntaAbiertaRespuesta } from '../e-pregunta-abierta-respuesta.model'; +import { EPreguntaAbiertaRespuestaService } from '../service/e-pregunta-abierta-respuesta.service'; + +@Injectable({ providedIn: 'root' }) +export class EPreguntaAbiertaRespuestaRoutingResolveService implements Resolve { + constructor(protected service: EPreguntaAbiertaRespuestaService, protected router: Router) {} + + resolve(route: ActivatedRouteSnapshot): Observable | Observable { + const id = route.params['id']; + if (id) { + return this.service.find(id).pipe( + mergeMap((ePreguntaAbiertaRespuesta: HttpResponse) => { + if (ePreguntaAbiertaRespuesta.body) { + return of(ePreguntaAbiertaRespuesta.body); + } else { + this.router.navigate(['404']); + return EMPTY; + } + }) + ); + } + return of(new EPreguntaAbiertaRespuesta()); + } +} diff --git a/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/route/e-pregunta-abierta-respuesta-routing.module.ts b/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/route/e-pregunta-abierta-respuesta-routing.module.ts new file mode 100644 index 0000000..58358db --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/route/e-pregunta-abierta-respuesta-routing.module.ts @@ -0,0 +1,46 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; + +import { UserRouteAccessService } from 'app/core/auth/user-route-access.service'; +import { EPreguntaAbiertaRespuestaComponent } from '../list/e-pregunta-abierta-respuesta.component'; +import { EPreguntaAbiertaRespuestaDetailComponent } from '../detail/e-pregunta-abierta-respuesta-detail.component'; +import { EPreguntaAbiertaRespuestaUpdateComponent } from '../update/e-pregunta-abierta-respuesta-update.component'; +import { EPreguntaAbiertaRespuestaRoutingResolveService } from './e-pregunta-abierta-respuesta-routing-resolve.service'; + +const ePreguntaAbiertaRespuestaRoute: Routes = [ + { + path: '', + component: EPreguntaAbiertaRespuestaComponent, + canActivate: [UserRouteAccessService], + }, + { + path: ':id/view', + component: EPreguntaAbiertaRespuestaDetailComponent, + resolve: { + ePreguntaAbiertaRespuesta: EPreguntaAbiertaRespuestaRoutingResolveService, + }, + canActivate: [UserRouteAccessService], + }, + { + path: 'new', + component: EPreguntaAbiertaRespuestaUpdateComponent, + resolve: { + ePreguntaAbiertaRespuesta: EPreguntaAbiertaRespuestaRoutingResolveService, + }, + canActivate: [UserRouteAccessService], + }, + { + path: ':id/edit', + component: EPreguntaAbiertaRespuestaUpdateComponent, + resolve: { + ePreguntaAbiertaRespuesta: EPreguntaAbiertaRespuestaRoutingResolveService, + }, + canActivate: [UserRouteAccessService], + }, +]; + +@NgModule({ + imports: [RouterModule.forChild(ePreguntaAbiertaRespuestaRoute)], + exports: [RouterModule], +}) +export class EPreguntaAbiertaRespuestaRoutingModule {} diff --git a/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/service/e-pregunta-abierta-respuesta.service.spec.ts b/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/service/e-pregunta-abierta-respuesta.service.spec.ts new file mode 100644 index 0000000..4015351 --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/service/e-pregunta-abierta-respuesta.service.spec.ts @@ -0,0 +1,197 @@ +import { TestBed } from '@angular/core/testing'; +import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; + +import { IEPreguntaAbiertaRespuesta, EPreguntaAbiertaRespuesta } from '../e-pregunta-abierta-respuesta.model'; + +import { EPreguntaAbiertaRespuestaService } from './e-pregunta-abierta-respuesta.service'; + +describe('Service Tests', () => { + describe('EPreguntaAbiertaRespuesta Service', () => { + let service: EPreguntaAbiertaRespuestaService; + let httpMock: HttpTestingController; + let elemDefault: IEPreguntaAbiertaRespuesta; + let expectedResult: IEPreguntaAbiertaRespuesta | IEPreguntaAbiertaRespuesta[] | boolean | null; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + }); + expectedResult = null; + service = TestBed.inject(EPreguntaAbiertaRespuestaService); + httpMock = TestBed.inject(HttpTestingController); + + elemDefault = { + id: 0, + respuesta: 'AAAAAAA', + }; + }); + + describe('Service methods', () => { + it('should find an element', () => { + const returnedFromService = Object.assign({}, elemDefault); + + service.find(123).subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'GET' }); + req.flush(returnedFromService); + expect(expectedResult).toMatchObject(elemDefault); + }); + + it('should create a EPreguntaAbiertaRespuesta', () => { + const returnedFromService = Object.assign( + { + id: 0, + }, + elemDefault + ); + + const expected = Object.assign({}, returnedFromService); + + service.create(new EPreguntaAbiertaRespuesta()).subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'POST' }); + req.flush(returnedFromService); + expect(expectedResult).toMatchObject(expected); + }); + + it('should update a EPreguntaAbiertaRespuesta', () => { + const returnedFromService = Object.assign( + { + id: 1, + respuesta: 'BBBBBB', + }, + elemDefault + ); + + const expected = Object.assign({}, returnedFromService); + + service.update(expected).subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'PUT' }); + req.flush(returnedFromService); + expect(expectedResult).toMatchObject(expected); + }); + + it('should partial update a EPreguntaAbiertaRespuesta', () => { + const patchObject = Object.assign( + { + respuesta: 'BBBBBB', + }, + new EPreguntaAbiertaRespuesta() + ); + + const returnedFromService = Object.assign(patchObject, elemDefault); + + const expected = Object.assign({}, returnedFromService); + + service.partialUpdate(patchObject).subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'PATCH' }); + req.flush(returnedFromService); + expect(expectedResult).toMatchObject(expected); + }); + + it('should return a list of EPreguntaAbiertaRespuesta', () => { + const returnedFromService = Object.assign( + { + id: 1, + respuesta: 'BBBBBB', + }, + elemDefault + ); + + const expected = Object.assign({}, returnedFromService); + + service.query().subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'GET' }); + req.flush([returnedFromService]); + httpMock.verify(); + expect(expectedResult).toContainEqual(expected); + }); + + it('should delete a EPreguntaAbiertaRespuesta', () => { + service.delete(123).subscribe(resp => (expectedResult = resp.ok)); + + const req = httpMock.expectOne({ method: 'DELETE' }); + req.flush({ status: 200 }); + expect(expectedResult); + }); + + describe('addEPreguntaAbiertaRespuestaToCollectionIfMissing', () => { + it('should add a EPreguntaAbiertaRespuesta to an empty array', () => { + const ePreguntaAbiertaRespuesta: IEPreguntaAbiertaRespuesta = { id: 123 }; + expectedResult = service.addEPreguntaAbiertaRespuestaToCollectionIfMissing([], ePreguntaAbiertaRespuesta); + expect(expectedResult).toHaveLength(1); + expect(expectedResult).toContain(ePreguntaAbiertaRespuesta); + }); + + it('should not add a EPreguntaAbiertaRespuesta to an array that contains it', () => { + const ePreguntaAbiertaRespuesta: IEPreguntaAbiertaRespuesta = { id: 123 }; + const ePreguntaAbiertaRespuestaCollection: IEPreguntaAbiertaRespuesta[] = [ + { + ...ePreguntaAbiertaRespuesta, + }, + { id: 456 }, + ]; + expectedResult = service.addEPreguntaAbiertaRespuestaToCollectionIfMissing( + ePreguntaAbiertaRespuestaCollection, + ePreguntaAbiertaRespuesta + ); + expect(expectedResult).toHaveLength(2); + }); + + it("should add a EPreguntaAbiertaRespuesta to an array that doesn't contain it", () => { + const ePreguntaAbiertaRespuesta: IEPreguntaAbiertaRespuesta = { id: 123 }; + const ePreguntaAbiertaRespuestaCollection: IEPreguntaAbiertaRespuesta[] = [{ id: 456 }]; + expectedResult = service.addEPreguntaAbiertaRespuestaToCollectionIfMissing( + ePreguntaAbiertaRespuestaCollection, + ePreguntaAbiertaRespuesta + ); + expect(expectedResult).toHaveLength(2); + expect(expectedResult).toContain(ePreguntaAbiertaRespuesta); + }); + + it('should add only unique EPreguntaAbiertaRespuesta to an array', () => { + const ePreguntaAbiertaRespuestaArray: IEPreguntaAbiertaRespuesta[] = [{ id: 123 }, { id: 456 }, { id: 61207 }]; + const ePreguntaAbiertaRespuestaCollection: IEPreguntaAbiertaRespuesta[] = [{ id: 123 }]; + expectedResult = service.addEPreguntaAbiertaRespuestaToCollectionIfMissing( + ePreguntaAbiertaRespuestaCollection, + ...ePreguntaAbiertaRespuestaArray + ); + expect(expectedResult).toHaveLength(3); + }); + + it('should accept varargs', () => { + const ePreguntaAbiertaRespuesta: IEPreguntaAbiertaRespuesta = { id: 123 }; + const ePreguntaAbiertaRespuesta2: IEPreguntaAbiertaRespuesta = { id: 456 }; + expectedResult = service.addEPreguntaAbiertaRespuestaToCollectionIfMissing( + [], + ePreguntaAbiertaRespuesta, + ePreguntaAbiertaRespuesta2 + ); + expect(expectedResult).toHaveLength(2); + expect(expectedResult).toContain(ePreguntaAbiertaRespuesta); + expect(expectedResult).toContain(ePreguntaAbiertaRespuesta2); + }); + + it('should accept null and undefined values', () => { + const ePreguntaAbiertaRespuesta: IEPreguntaAbiertaRespuesta = { id: 123 }; + expectedResult = service.addEPreguntaAbiertaRespuestaToCollectionIfMissing([], null, ePreguntaAbiertaRespuesta, undefined); + expect(expectedResult).toHaveLength(1); + expect(expectedResult).toContain(ePreguntaAbiertaRespuesta); + }); + + it('should return initial array if no EPreguntaAbiertaRespuesta is added', () => { + const ePreguntaAbiertaRespuestaCollection: IEPreguntaAbiertaRespuesta[] = [{ id: 123 }]; + expectedResult = service.addEPreguntaAbiertaRespuestaToCollectionIfMissing(ePreguntaAbiertaRespuestaCollection, undefined, null); + expect(expectedResult).toEqual(ePreguntaAbiertaRespuestaCollection); + }); + }); + }); + + afterEach(() => { + httpMock.verify(); + }); + }); +}); diff --git a/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/service/e-pregunta-abierta-respuesta.service.ts b/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/service/e-pregunta-abierta-respuesta.service.ts new file mode 100644 index 0000000..87533fc --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/service/e-pregunta-abierta-respuesta.service.ts @@ -0,0 +1,76 @@ +import { Injectable } from '@angular/core'; +import { HttpClient, HttpResponse } from '@angular/common/http'; +import { Observable } from 'rxjs'; + +import { isPresent } from 'app/core/util/operators'; +import { ApplicationConfigService } from 'app/core/config/application-config.service'; +import { createRequestOption } from 'app/core/request/request-util'; +import { IEPreguntaAbiertaRespuesta, getEPreguntaAbiertaRespuestaIdentifier } from '../e-pregunta-abierta-respuesta.model'; + +export type EntityResponseType = HttpResponse; +export type EntityArrayResponseType = HttpResponse; + +@Injectable({ providedIn: 'root' }) +export class EPreguntaAbiertaRespuestaService { + protected resourceUrl = this.applicationConfigService.getEndpointFor('api/e-pregunta-abierta-respuestas'); + + constructor(protected http: HttpClient, protected applicationConfigService: ApplicationConfigService) {} + + create(ePreguntaAbiertaRespuesta: IEPreguntaAbiertaRespuesta): Observable { + return this.http.post(this.resourceUrl, ePreguntaAbiertaRespuesta, { observe: 'response' }); + } + + update(ePreguntaAbiertaRespuesta: IEPreguntaAbiertaRespuesta): Observable { + return this.http.put( + `${this.resourceUrl}/${getEPreguntaAbiertaRespuestaIdentifier(ePreguntaAbiertaRespuesta) as number}`, + ePreguntaAbiertaRespuesta, + { observe: 'response' } + ); + } + + partialUpdate(ePreguntaAbiertaRespuesta: IEPreguntaAbiertaRespuesta): Observable { + return this.http.patch( + `${this.resourceUrl}/${getEPreguntaAbiertaRespuestaIdentifier(ePreguntaAbiertaRespuesta) as number}`, + ePreguntaAbiertaRespuesta, + { observe: 'response' } + ); + } + + find(id: number): Observable { + return this.http.get(`${this.resourceUrl}/${id}`, { observe: 'response' }); + } + + query(req?: any): Observable { + const options = createRequestOption(req); + return this.http.get(this.resourceUrl, { params: options, observe: 'response' }); + } + + delete(id: number): Observable> { + return this.http.delete(`${this.resourceUrl}/${id}`, { observe: 'response' }); + } + + addEPreguntaAbiertaRespuestaToCollectionIfMissing( + ePreguntaAbiertaRespuestaCollection: IEPreguntaAbiertaRespuesta[], + ...ePreguntaAbiertaRespuestasToCheck: (IEPreguntaAbiertaRespuesta | null | undefined)[] + ): IEPreguntaAbiertaRespuesta[] { + const ePreguntaAbiertaRespuestas: IEPreguntaAbiertaRespuesta[] = ePreguntaAbiertaRespuestasToCheck.filter(isPresent); + if (ePreguntaAbiertaRespuestas.length > 0) { + const ePreguntaAbiertaRespuestaCollectionIdentifiers = ePreguntaAbiertaRespuestaCollection.map( + ePreguntaAbiertaRespuestaItem => getEPreguntaAbiertaRespuestaIdentifier(ePreguntaAbiertaRespuestaItem)! + ); + const ePreguntaAbiertaRespuestasToAdd = ePreguntaAbiertaRespuestas.filter(ePreguntaAbiertaRespuestaItem => { + const ePreguntaAbiertaRespuestaIdentifier = getEPreguntaAbiertaRespuestaIdentifier(ePreguntaAbiertaRespuestaItem); + if ( + ePreguntaAbiertaRespuestaIdentifier == null || + ePreguntaAbiertaRespuestaCollectionIdentifiers.includes(ePreguntaAbiertaRespuestaIdentifier) + ) { + return false; + } + ePreguntaAbiertaRespuestaCollectionIdentifiers.push(ePreguntaAbiertaRespuestaIdentifier); + return true; + }); + return [...ePreguntaAbiertaRespuestasToAdd, ...ePreguntaAbiertaRespuestaCollection]; + } + return ePreguntaAbiertaRespuestaCollection; + } +} diff --git a/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/update/e-pregunta-abierta-respuesta-update.component.html b/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/update/e-pregunta-abierta-respuesta-update.component.html new file mode 100644 index 0000000..77b55b3 --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/update/e-pregunta-abierta-respuesta-update.component.html @@ -0,0 +1,82 @@ +
+
+
+

+ Create or edit a E Pregunta Abierta Respuesta +

+ +
+ + +
+ + +
+ +
+ + +
+ + This field is required. + +
+
+ +
+ + +
+
+ +
+ + + +
+
+
+
diff --git a/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/update/e-pregunta-abierta-respuesta-update.component.spec.ts b/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/update/e-pregunta-abierta-respuesta-update.component.spec.ts new file mode 100644 index 0000000..5a62399 --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/update/e-pregunta-abierta-respuesta-update.component.spec.ts @@ -0,0 +1,152 @@ +jest.mock('@angular/router'); + +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { FormBuilder } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; +import { of, Subject } from 'rxjs'; + +import { EPreguntaAbiertaRespuestaService } from '../service/e-pregunta-abierta-respuesta.service'; +import { IEPreguntaAbiertaRespuesta, EPreguntaAbiertaRespuesta } from '../e-pregunta-abierta-respuesta.model'; +import { IEPreguntaAbierta } from 'app/entities/e-pregunta-abierta/e-pregunta-abierta.model'; +import { EPreguntaAbiertaService } from 'app/entities/e-pregunta-abierta/service/e-pregunta-abierta.service'; + +import { EPreguntaAbiertaRespuestaUpdateComponent } from './e-pregunta-abierta-respuesta-update.component'; + +describe('Component Tests', () => { + describe('EPreguntaAbiertaRespuesta Management Update Component', () => { + let comp: EPreguntaAbiertaRespuestaUpdateComponent; + let fixture: ComponentFixture; + let activatedRoute: ActivatedRoute; + let ePreguntaAbiertaRespuestaService: EPreguntaAbiertaRespuestaService; + let ePreguntaAbiertaService: EPreguntaAbiertaService; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [EPreguntaAbiertaRespuestaUpdateComponent], + providers: [FormBuilder, ActivatedRoute], + }) + .overrideTemplate(EPreguntaAbiertaRespuestaUpdateComponent, '') + .compileComponents(); + + fixture = TestBed.createComponent(EPreguntaAbiertaRespuestaUpdateComponent); + activatedRoute = TestBed.inject(ActivatedRoute); + ePreguntaAbiertaRespuestaService = TestBed.inject(EPreguntaAbiertaRespuestaService); + ePreguntaAbiertaService = TestBed.inject(EPreguntaAbiertaService); + + comp = fixture.componentInstance; + }); + + describe('ngOnInit', () => { + it('Should call EPreguntaAbierta query and add missing value', () => { + const ePreguntaAbiertaRespuesta: IEPreguntaAbiertaRespuesta = { id: 456 }; + const ePreguntaAbierta: IEPreguntaAbierta = { id: 35011 }; + ePreguntaAbiertaRespuesta.ePreguntaAbierta = ePreguntaAbierta; + + const ePreguntaAbiertaCollection: IEPreguntaAbierta[] = [{ id: 58318 }]; + jest.spyOn(ePreguntaAbiertaService, 'query').mockReturnValue(of(new HttpResponse({ body: ePreguntaAbiertaCollection }))); + const additionalEPreguntaAbiertas = [ePreguntaAbierta]; + const expectedCollection: IEPreguntaAbierta[] = [...additionalEPreguntaAbiertas, ...ePreguntaAbiertaCollection]; + jest.spyOn(ePreguntaAbiertaService, 'addEPreguntaAbiertaToCollectionIfMissing').mockReturnValue(expectedCollection); + + activatedRoute.data = of({ ePreguntaAbiertaRespuesta }); + comp.ngOnInit(); + + expect(ePreguntaAbiertaService.query).toHaveBeenCalled(); + expect(ePreguntaAbiertaService.addEPreguntaAbiertaToCollectionIfMissing).toHaveBeenCalledWith( + ePreguntaAbiertaCollection, + ...additionalEPreguntaAbiertas + ); + expect(comp.ePreguntaAbiertasSharedCollection).toEqual(expectedCollection); + }); + + it('Should update editForm', () => { + const ePreguntaAbiertaRespuesta: IEPreguntaAbiertaRespuesta = { id: 456 }; + const ePreguntaAbierta: IEPreguntaAbierta = { id: 40814 }; + ePreguntaAbiertaRespuesta.ePreguntaAbierta = ePreguntaAbierta; + + activatedRoute.data = of({ ePreguntaAbiertaRespuesta }); + comp.ngOnInit(); + + expect(comp.editForm.value).toEqual(expect.objectContaining(ePreguntaAbiertaRespuesta)); + expect(comp.ePreguntaAbiertasSharedCollection).toContain(ePreguntaAbierta); + }); + }); + + describe('save', () => { + it('Should call update service on save for existing entity', () => { + // GIVEN + const saveSubject = new Subject>(); + const ePreguntaAbiertaRespuesta = { id: 123 }; + jest.spyOn(ePreguntaAbiertaRespuestaService, 'update').mockReturnValue(saveSubject); + jest.spyOn(comp, 'previousState'); + activatedRoute.data = of({ ePreguntaAbiertaRespuesta }); + comp.ngOnInit(); + + // WHEN + comp.save(); + expect(comp.isSaving).toEqual(true); + saveSubject.next(new HttpResponse({ body: ePreguntaAbiertaRespuesta })); + saveSubject.complete(); + + // THEN + expect(comp.previousState).toHaveBeenCalled(); + expect(ePreguntaAbiertaRespuestaService.update).toHaveBeenCalledWith(ePreguntaAbiertaRespuesta); + expect(comp.isSaving).toEqual(false); + }); + + it('Should call create service on save for new entity', () => { + // GIVEN + const saveSubject = new Subject>(); + const ePreguntaAbiertaRespuesta = new EPreguntaAbiertaRespuesta(); + jest.spyOn(ePreguntaAbiertaRespuestaService, 'create').mockReturnValue(saveSubject); + jest.spyOn(comp, 'previousState'); + activatedRoute.data = of({ ePreguntaAbiertaRespuesta }); + comp.ngOnInit(); + + // WHEN + comp.save(); + expect(comp.isSaving).toEqual(true); + saveSubject.next(new HttpResponse({ body: ePreguntaAbiertaRespuesta })); + saveSubject.complete(); + + // THEN + expect(ePreguntaAbiertaRespuestaService.create).toHaveBeenCalledWith(ePreguntaAbiertaRespuesta); + expect(comp.isSaving).toEqual(false); + expect(comp.previousState).toHaveBeenCalled(); + }); + + it('Should set isSaving to false on error', () => { + // GIVEN + const saveSubject = new Subject>(); + const ePreguntaAbiertaRespuesta = { id: 123 }; + jest.spyOn(ePreguntaAbiertaRespuestaService, 'update').mockReturnValue(saveSubject); + jest.spyOn(comp, 'previousState'); + activatedRoute.data = of({ ePreguntaAbiertaRespuesta }); + comp.ngOnInit(); + + // WHEN + comp.save(); + expect(comp.isSaving).toEqual(true); + saveSubject.error('This is an error!'); + + // THEN + expect(ePreguntaAbiertaRespuestaService.update).toHaveBeenCalledWith(ePreguntaAbiertaRespuesta); + expect(comp.isSaving).toEqual(false); + expect(comp.previousState).not.toHaveBeenCalled(); + }); + }); + + describe('Tracking relationships identifiers', () => { + describe('trackEPreguntaAbiertaById', () => { + it('Should return tracked EPreguntaAbierta primary key', () => { + const entity = { id: 123 }; + const trackResult = comp.trackEPreguntaAbiertaById(0, entity); + expect(trackResult).toEqual(entity.id); + }); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/update/e-pregunta-abierta-respuesta-update.component.ts b/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/update/e-pregunta-abierta-respuesta-update.component.ts new file mode 100644 index 0000000..1563265 --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-abierta-respuesta/update/e-pregunta-abierta-respuesta-update.component.ts @@ -0,0 +1,116 @@ +import { Component, OnInit } from '@angular/core'; +import { HttpResponse } from '@angular/common/http'; +import { FormBuilder, Validators } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; +import { Observable } from 'rxjs'; +import { finalize, map } from 'rxjs/operators'; + +import { IEPreguntaAbiertaRespuesta, EPreguntaAbiertaRespuesta } from '../e-pregunta-abierta-respuesta.model'; +import { EPreguntaAbiertaRespuestaService } from '../service/e-pregunta-abierta-respuesta.service'; +import { IEPreguntaAbierta } from 'app/entities/e-pregunta-abierta/e-pregunta-abierta.model'; +import { EPreguntaAbiertaService } from 'app/entities/e-pregunta-abierta/service/e-pregunta-abierta.service'; + +@Component({ + selector: 'jhi-e-pregunta-abierta-respuesta-update', + templateUrl: './e-pregunta-abierta-respuesta-update.component.html', +}) +export class EPreguntaAbiertaRespuestaUpdateComponent implements OnInit { + isSaving = false; + + ePreguntaAbiertasSharedCollection: IEPreguntaAbierta[] = []; + + editForm = this.fb.group({ + id: [], + respuesta: [null, [Validators.required]], + ePreguntaAbierta: [], + }); + + constructor( + protected ePreguntaAbiertaRespuestaService: EPreguntaAbiertaRespuestaService, + protected ePreguntaAbiertaService: EPreguntaAbiertaService, + protected activatedRoute: ActivatedRoute, + protected fb: FormBuilder + ) {} + + ngOnInit(): void { + this.activatedRoute.data.subscribe(({ ePreguntaAbiertaRespuesta }) => { + this.updateForm(ePreguntaAbiertaRespuesta); + + this.loadRelationshipsOptions(); + }); + } + + previousState(): void { + window.history.back(); + } + + save(): void { + this.isSaving = true; + const ePreguntaAbiertaRespuesta = this.createFromForm(); + if (ePreguntaAbiertaRespuesta.id !== undefined) { + this.subscribeToSaveResponse(this.ePreguntaAbiertaRespuestaService.update(ePreguntaAbiertaRespuesta)); + } else { + this.subscribeToSaveResponse(this.ePreguntaAbiertaRespuestaService.create(ePreguntaAbiertaRespuesta)); + } + } + + trackEPreguntaAbiertaById(index: number, item: IEPreguntaAbierta): number { + return item.id!; + } + + protected subscribeToSaveResponse(result: Observable>): void { + result.pipe(finalize(() => this.onSaveFinalize())).subscribe( + () => this.onSaveSuccess(), + () => this.onSaveError() + ); + } + + protected onSaveSuccess(): void { + this.previousState(); + } + + protected onSaveError(): void { + // Api for inheritance. + } + + protected onSaveFinalize(): void { + this.isSaving = false; + } + + protected updateForm(ePreguntaAbiertaRespuesta: IEPreguntaAbiertaRespuesta): void { + this.editForm.patchValue({ + id: ePreguntaAbiertaRespuesta.id, + respuesta: ePreguntaAbiertaRespuesta.respuesta, + ePreguntaAbierta: ePreguntaAbiertaRespuesta.ePreguntaAbierta, + }); + + this.ePreguntaAbiertasSharedCollection = this.ePreguntaAbiertaService.addEPreguntaAbiertaToCollectionIfMissing( + this.ePreguntaAbiertasSharedCollection, + ePreguntaAbiertaRespuesta.ePreguntaAbierta + ); + } + + protected loadRelationshipsOptions(): void { + this.ePreguntaAbiertaService + .query() + .pipe(map((res: HttpResponse) => res.body ?? [])) + .pipe( + map((ePreguntaAbiertas: IEPreguntaAbierta[]) => + this.ePreguntaAbiertaService.addEPreguntaAbiertaToCollectionIfMissing( + ePreguntaAbiertas, + this.editForm.get('ePreguntaAbierta')!.value + ) + ) + ) + .subscribe((ePreguntaAbiertas: IEPreguntaAbierta[]) => (this.ePreguntaAbiertasSharedCollection = ePreguntaAbiertas)); + } + + protected createFromForm(): IEPreguntaAbiertaRespuesta { + return { + ...new EPreguntaAbiertaRespuesta(), + id: this.editForm.get(['id'])!.value, + respuesta: this.editForm.get(['respuesta'])!.value, + ePreguntaAbierta: this.editForm.get(['ePreguntaAbierta'])!.value, + }; + } +} diff --git a/src/main/webapp/app/entities/e-pregunta-abierta/delete/e-pregunta-abierta-delete-dialog.component.html b/src/main/webapp/app/entities/e-pregunta-abierta/delete/e-pregunta-abierta-delete-dialog.component.html new file mode 100644 index 0000000..669d8c0 --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-abierta/delete/e-pregunta-abierta-delete-dialog.component.html @@ -0,0 +1,29 @@ +
+ + + + + +
diff --git a/src/main/webapp/app/entities/e-pregunta-abierta/delete/e-pregunta-abierta-delete-dialog.component.spec.ts b/src/main/webapp/app/entities/e-pregunta-abierta/delete/e-pregunta-abierta-delete-dialog.component.spec.ts new file mode 100644 index 0000000..d402a0b --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-abierta/delete/e-pregunta-abierta-delete-dialog.component.spec.ts @@ -0,0 +1,65 @@ +jest.mock('@ng-bootstrap/ng-bootstrap'); + +import { ComponentFixture, TestBed, inject, fakeAsync, tick } from '@angular/core/testing'; +import { HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { of } from 'rxjs'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; + +import { EPreguntaAbiertaService } from '../service/e-pregunta-abierta.service'; + +import { EPreguntaAbiertaDeleteDialogComponent } from './e-pregunta-abierta-delete-dialog.component'; + +describe('Component Tests', () => { + describe('EPreguntaAbierta Management Delete Component', () => { + let comp: EPreguntaAbiertaDeleteDialogComponent; + let fixture: ComponentFixture; + let service: EPreguntaAbiertaService; + let mockActiveModal: NgbActiveModal; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [EPreguntaAbiertaDeleteDialogComponent], + providers: [NgbActiveModal], + }) + .overrideTemplate(EPreguntaAbiertaDeleteDialogComponent, '') + .compileComponents(); + fixture = TestBed.createComponent(EPreguntaAbiertaDeleteDialogComponent); + comp = fixture.componentInstance; + service = TestBed.inject(EPreguntaAbiertaService); + mockActiveModal = TestBed.inject(NgbActiveModal); + }); + + describe('confirmDelete', () => { + it('Should call delete service on confirmDelete', inject( + [], + fakeAsync(() => { + // GIVEN + jest.spyOn(service, 'delete').mockReturnValue(of(new HttpResponse({}))); + + // WHEN + comp.confirmDelete(123); + tick(); + + // THEN + expect(service.delete).toHaveBeenCalledWith(123); + expect(mockActiveModal.close).toHaveBeenCalledWith('deleted'); + }) + )); + + it('Should not call delete service on clear', () => { + // GIVEN + jest.spyOn(service, 'delete'); + + // WHEN + comp.cancel(); + + // THEN + expect(service.delete).not.toHaveBeenCalled(); + expect(mockActiveModal.close).not.toHaveBeenCalled(); + expect(mockActiveModal.dismiss).toHaveBeenCalled(); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/e-pregunta-abierta/delete/e-pregunta-abierta-delete-dialog.component.ts b/src/main/webapp/app/entities/e-pregunta-abierta/delete/e-pregunta-abierta-delete-dialog.component.ts new file mode 100644 index 0000000..8129adc --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-abierta/delete/e-pregunta-abierta-delete-dialog.component.ts @@ -0,0 +1,24 @@ +import { Component } from '@angular/core'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; + +import { IEPreguntaAbierta } from '../e-pregunta-abierta.model'; +import { EPreguntaAbiertaService } from '../service/e-pregunta-abierta.service'; + +@Component({ + templateUrl: './e-pregunta-abierta-delete-dialog.component.html', +}) +export class EPreguntaAbiertaDeleteDialogComponent { + ePreguntaAbierta?: IEPreguntaAbierta; + + constructor(protected ePreguntaAbiertaService: EPreguntaAbiertaService, protected activeModal: NgbActiveModal) {} + + cancel(): void { + this.activeModal.dismiss(); + } + + confirmDelete(id: number): void { + this.ePreguntaAbiertaService.delete(id).subscribe(() => { + this.activeModal.close('deleted'); + }); + } +} diff --git a/src/main/webapp/app/entities/e-pregunta-abierta/detail/e-pregunta-abierta-detail.component.html b/src/main/webapp/app/entities/e-pregunta-abierta/detail/e-pregunta-abierta-detail.component.html new file mode 100644 index 0000000..1d2207f --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-abierta/detail/e-pregunta-abierta-detail.component.html @@ -0,0 +1,48 @@ +
+
+
+

+ E Pregunta Abierta +

+ +
+ + + + + +
+
ID
+
+ {{ ePreguntaAbierta.id }} +
+
Nombre
+
+ {{ ePreguntaAbierta.nombre }} +
+
Opcional
+
+ {{ ePreguntaAbierta.opcional }} +
+
Orden
+
+ {{ ePreguntaAbierta.orden }} +
+
Encuesta
+
+ +
+
+ + + + +
+
+
diff --git a/src/main/webapp/app/entities/e-pregunta-abierta/detail/e-pregunta-abierta-detail.component.spec.ts b/src/main/webapp/app/entities/e-pregunta-abierta/detail/e-pregunta-abierta-detail.component.spec.ts new file mode 100644 index 0000000..a7d958b --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-abierta/detail/e-pregunta-abierta-detail.component.spec.ts @@ -0,0 +1,38 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { ActivatedRoute } from '@angular/router'; +import { of } from 'rxjs'; + +import { EPreguntaAbiertaDetailComponent } from './e-pregunta-abierta-detail.component'; + +describe('Component Tests', () => { + describe('EPreguntaAbierta Management Detail Component', () => { + let comp: EPreguntaAbiertaDetailComponent; + let fixture: ComponentFixture; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [EPreguntaAbiertaDetailComponent], + providers: [ + { + provide: ActivatedRoute, + useValue: { data: of({ ePreguntaAbierta: { id: 123 } }) }, + }, + ], + }) + .overrideTemplate(EPreguntaAbiertaDetailComponent, '') + .compileComponents(); + fixture = TestBed.createComponent(EPreguntaAbiertaDetailComponent); + comp = fixture.componentInstance; + }); + + describe('OnInit', () => { + it('Should load ePreguntaAbierta on init', () => { + // WHEN + comp.ngOnInit(); + + // THEN + expect(comp.ePreguntaAbierta).toEqual(expect.objectContaining({ id: 123 })); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/e-pregunta-abierta/detail/e-pregunta-abierta-detail.component.ts b/src/main/webapp/app/entities/e-pregunta-abierta/detail/e-pregunta-abierta-detail.component.ts new file mode 100644 index 0000000..4d19324 --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-abierta/detail/e-pregunta-abierta-detail.component.ts @@ -0,0 +1,24 @@ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; + +import { IEPreguntaAbierta } from '../e-pregunta-abierta.model'; + +@Component({ + selector: 'jhi-e-pregunta-abierta-detail', + templateUrl: './e-pregunta-abierta-detail.component.html', +}) +export class EPreguntaAbiertaDetailComponent implements OnInit { + ePreguntaAbierta: IEPreguntaAbierta | null = null; + + constructor(protected activatedRoute: ActivatedRoute) {} + + ngOnInit(): void { + this.activatedRoute.data.subscribe(({ ePreguntaAbierta }) => { + this.ePreguntaAbierta = ePreguntaAbierta; + }); + } + + previousState(): void { + window.history.back(); + } +} diff --git a/src/main/webapp/app/entities/e-pregunta-abierta/e-pregunta-abierta.model.ts b/src/main/webapp/app/entities/e-pregunta-abierta/e-pregunta-abierta.model.ts new file mode 100644 index 0000000..5ed38af --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-abierta/e-pregunta-abierta.model.ts @@ -0,0 +1,28 @@ +import { IEPreguntaAbiertaRespuesta } from 'app/entities/e-pregunta-abierta-respuesta/e-pregunta-abierta-respuesta.model'; +import { IEncuesta } from 'app/entities/encuesta/encuesta.model'; + +export interface IEPreguntaAbierta { + id?: number; + nombre?: string; + opcional?: boolean; + orden?: number; + ePreguntaAbiertaRespuestas?: IEPreguntaAbiertaRespuesta[] | null; + encuesta?: IEncuesta | null; +} + +export class EPreguntaAbierta implements IEPreguntaAbierta { + constructor( + public id?: number, + public nombre?: string, + public opcional?: boolean, + public orden?: number, + public ePreguntaAbiertaRespuestas?: IEPreguntaAbiertaRespuesta[] | null, + public encuesta?: IEncuesta | null + ) { + this.opcional = this.opcional ?? false; + } +} + +export function getEPreguntaAbiertaIdentifier(ePreguntaAbierta: IEPreguntaAbierta): number | undefined { + return ePreguntaAbierta.id; +} diff --git a/src/main/webapp/app/entities/e-pregunta-abierta/e-pregunta-abierta.module.ts b/src/main/webapp/app/entities/e-pregunta-abierta/e-pregunta-abierta.module.ts new file mode 100644 index 0000000..f507760 --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-abierta/e-pregunta-abierta.module.ts @@ -0,0 +1,19 @@ +import { NgModule } from '@angular/core'; +import { SharedModule } from 'app/shared/shared.module'; +import { EPreguntaAbiertaComponent } from './list/e-pregunta-abierta.component'; +import { EPreguntaAbiertaDetailComponent } from './detail/e-pregunta-abierta-detail.component'; +import { EPreguntaAbiertaUpdateComponent } from './update/e-pregunta-abierta-update.component'; +import { EPreguntaAbiertaDeleteDialogComponent } from './delete/e-pregunta-abierta-delete-dialog.component'; +import { EPreguntaAbiertaRoutingModule } from './route/e-pregunta-abierta-routing.module'; + +@NgModule({ + imports: [SharedModule, EPreguntaAbiertaRoutingModule], + declarations: [ + EPreguntaAbiertaComponent, + EPreguntaAbiertaDetailComponent, + EPreguntaAbiertaUpdateComponent, + EPreguntaAbiertaDeleteDialogComponent, + ], + entryComponents: [EPreguntaAbiertaDeleteDialogComponent], +}) +export class EPreguntaAbiertaModule {} diff --git a/src/main/webapp/app/entities/e-pregunta-abierta/list/e-pregunta-abierta.component.html b/src/main/webapp/app/entities/e-pregunta-abierta/list/e-pregunta-abierta.component.html new file mode 100644 index 0000000..26e475d --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-abierta/list/e-pregunta-abierta.component.html @@ -0,0 +1,88 @@ +
+

+ E Pregunta Abiertas + +
+ + + +
+

+ + + + + +
+ No ePreguntaAbiertas found +
+ +
+ + + + + + + + + + + + + + + + + + + + + +
IDNombreOpcionalOrdenEncuesta
+ {{ ePreguntaAbierta.id }} + {{ ePreguntaAbierta.nombre }}{{ ePreguntaAbierta.opcional }}{{ ePreguntaAbierta.orden }} + + +
+ + + + + +
+
+
+
diff --git a/src/main/webapp/app/entities/e-pregunta-abierta/list/e-pregunta-abierta.component.spec.ts b/src/main/webapp/app/entities/e-pregunta-abierta/list/e-pregunta-abierta.component.spec.ts new file mode 100644 index 0000000..bb9c016 --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-abierta/list/e-pregunta-abierta.component.spec.ts @@ -0,0 +1,48 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { HttpHeaders, HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { of } from 'rxjs'; + +import { EPreguntaAbiertaService } from '../service/e-pregunta-abierta.service'; + +import { EPreguntaAbiertaComponent } from './e-pregunta-abierta.component'; + +describe('Component Tests', () => { + describe('EPreguntaAbierta Management Component', () => { + let comp: EPreguntaAbiertaComponent; + let fixture: ComponentFixture; + let service: EPreguntaAbiertaService; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [EPreguntaAbiertaComponent], + }) + .overrideTemplate(EPreguntaAbiertaComponent, '') + .compileComponents(); + + fixture = TestBed.createComponent(EPreguntaAbiertaComponent); + comp = fixture.componentInstance; + service = TestBed.inject(EPreguntaAbiertaService); + + const headers = new HttpHeaders().append('link', 'link;link'); + jest.spyOn(service, 'query').mockReturnValue( + of( + new HttpResponse({ + body: [{ id: 123 }], + headers, + }) + ) + ); + }); + + it('Should call load all on init', () => { + // WHEN + comp.ngOnInit(); + + // THEN + expect(service.query).toHaveBeenCalled(); + expect(comp.ePreguntaAbiertas?.[0]).toEqual(expect.objectContaining({ id: 123 })); + }); + }); +}); diff --git a/src/main/webapp/app/entities/e-pregunta-abierta/list/e-pregunta-abierta.component.ts b/src/main/webapp/app/entities/e-pregunta-abierta/list/e-pregunta-abierta.component.ts new file mode 100644 index 0000000..d9d7f63 --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-abierta/list/e-pregunta-abierta.component.ts @@ -0,0 +1,51 @@ +import { Component, OnInit } from '@angular/core'; +import { HttpResponse } from '@angular/common/http'; +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; + +import { IEPreguntaAbierta } from '../e-pregunta-abierta.model'; +import { EPreguntaAbiertaService } from '../service/e-pregunta-abierta.service'; +import { EPreguntaAbiertaDeleteDialogComponent } from '../delete/e-pregunta-abierta-delete-dialog.component'; + +@Component({ + selector: 'jhi-e-pregunta-abierta', + templateUrl: './e-pregunta-abierta.component.html', +}) +export class EPreguntaAbiertaComponent implements OnInit { + ePreguntaAbiertas?: IEPreguntaAbierta[]; + isLoading = false; + + constructor(protected ePreguntaAbiertaService: EPreguntaAbiertaService, protected modalService: NgbModal) {} + + loadAll(): void { + this.isLoading = true; + + this.ePreguntaAbiertaService.query().subscribe( + (res: HttpResponse) => { + this.isLoading = false; + this.ePreguntaAbiertas = res.body ?? []; + }, + () => { + this.isLoading = false; + } + ); + } + + ngOnInit(): void { + this.loadAll(); + } + + trackId(index: number, item: IEPreguntaAbierta): number { + return item.id!; + } + + delete(ePreguntaAbierta: IEPreguntaAbierta): void { + const modalRef = this.modalService.open(EPreguntaAbiertaDeleteDialogComponent, { size: 'lg', backdrop: 'static' }); + modalRef.componentInstance.ePreguntaAbierta = ePreguntaAbierta; + // unsubscribe not needed because closed completes on modal close + modalRef.closed.subscribe(reason => { + if (reason === 'deleted') { + this.loadAll(); + } + }); + } +} diff --git a/src/main/webapp/app/entities/e-pregunta-abierta/route/e-pregunta-abierta-routing-resolve.service.spec.ts b/src/main/webapp/app/entities/e-pregunta-abierta/route/e-pregunta-abierta-routing-resolve.service.spec.ts new file mode 100644 index 0000000..93a9430 --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-abierta/route/e-pregunta-abierta-routing-resolve.service.spec.ts @@ -0,0 +1,82 @@ +jest.mock('@angular/router'); + +import { TestBed } from '@angular/core/testing'; +import { HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { ActivatedRouteSnapshot, Router } from '@angular/router'; +import { of } from 'rxjs'; + +import { IEPreguntaAbierta, EPreguntaAbierta } from '../e-pregunta-abierta.model'; +import { EPreguntaAbiertaService } from '../service/e-pregunta-abierta.service'; + +import { EPreguntaAbiertaRoutingResolveService } from './e-pregunta-abierta-routing-resolve.service'; + +describe('Service Tests', () => { + describe('EPreguntaAbierta routing resolve service', () => { + let mockRouter: Router; + let mockActivatedRouteSnapshot: ActivatedRouteSnapshot; + let routingResolveService: EPreguntaAbiertaRoutingResolveService; + let service: EPreguntaAbiertaService; + let resultEPreguntaAbierta: IEPreguntaAbierta | undefined; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [Router, ActivatedRouteSnapshot], + }); + mockRouter = TestBed.inject(Router); + mockActivatedRouteSnapshot = TestBed.inject(ActivatedRouteSnapshot); + routingResolveService = TestBed.inject(EPreguntaAbiertaRoutingResolveService); + service = TestBed.inject(EPreguntaAbiertaService); + resultEPreguntaAbierta = undefined; + }); + + describe('resolve', () => { + it('should return IEPreguntaAbierta returned by find', () => { + // GIVEN + service.find = jest.fn(id => of(new HttpResponse({ body: { id } }))); + mockActivatedRouteSnapshot.params = { id: 123 }; + + // WHEN + routingResolveService.resolve(mockActivatedRouteSnapshot).subscribe(result => { + resultEPreguntaAbierta = result; + }); + + // THEN + expect(service.find).toBeCalledWith(123); + expect(resultEPreguntaAbierta).toEqual({ id: 123 }); + }); + + it('should return new IEPreguntaAbierta if id is not provided', () => { + // GIVEN + service.find = jest.fn(); + mockActivatedRouteSnapshot.params = {}; + + // WHEN + routingResolveService.resolve(mockActivatedRouteSnapshot).subscribe(result => { + resultEPreguntaAbierta = result; + }); + + // THEN + expect(service.find).not.toBeCalled(); + expect(resultEPreguntaAbierta).toEqual(new EPreguntaAbierta()); + }); + + it('should route to 404 page if data not found in server', () => { + // GIVEN + jest.spyOn(service, 'find').mockReturnValue(of(new HttpResponse({ body: null as unknown as EPreguntaAbierta }))); + mockActivatedRouteSnapshot.params = { id: 123 }; + + // WHEN + routingResolveService.resolve(mockActivatedRouteSnapshot).subscribe(result => { + resultEPreguntaAbierta = result; + }); + + // THEN + expect(service.find).toBeCalledWith(123); + expect(resultEPreguntaAbierta).toEqual(undefined); + expect(mockRouter.navigate).toHaveBeenCalledWith(['404']); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/e-pregunta-abierta/route/e-pregunta-abierta-routing-resolve.service.ts b/src/main/webapp/app/entities/e-pregunta-abierta/route/e-pregunta-abierta-routing-resolve.service.ts new file mode 100644 index 0000000..3eaf0c7 --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-abierta/route/e-pregunta-abierta-routing-resolve.service.ts @@ -0,0 +1,30 @@ +import { Injectable } from '@angular/core'; +import { HttpResponse } from '@angular/common/http'; +import { Resolve, ActivatedRouteSnapshot, Router } from '@angular/router'; +import { Observable, of, EMPTY } from 'rxjs'; +import { mergeMap } from 'rxjs/operators'; + +import { IEPreguntaAbierta, EPreguntaAbierta } from '../e-pregunta-abierta.model'; +import { EPreguntaAbiertaService } from '../service/e-pregunta-abierta.service'; + +@Injectable({ providedIn: 'root' }) +export class EPreguntaAbiertaRoutingResolveService implements Resolve { + constructor(protected service: EPreguntaAbiertaService, protected router: Router) {} + + resolve(route: ActivatedRouteSnapshot): Observable | Observable { + const id = route.params['id']; + if (id) { + return this.service.find(id).pipe( + mergeMap((ePreguntaAbierta: HttpResponse) => { + if (ePreguntaAbierta.body) { + return of(ePreguntaAbierta.body); + } else { + this.router.navigate(['404']); + return EMPTY; + } + }) + ); + } + return of(new EPreguntaAbierta()); + } +} diff --git a/src/main/webapp/app/entities/e-pregunta-abierta/route/e-pregunta-abierta-routing.module.ts b/src/main/webapp/app/entities/e-pregunta-abierta/route/e-pregunta-abierta-routing.module.ts new file mode 100644 index 0000000..5246ea6 --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-abierta/route/e-pregunta-abierta-routing.module.ts @@ -0,0 +1,46 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; + +import { UserRouteAccessService } from 'app/core/auth/user-route-access.service'; +import { EPreguntaAbiertaComponent } from '../list/e-pregunta-abierta.component'; +import { EPreguntaAbiertaDetailComponent } from '../detail/e-pregunta-abierta-detail.component'; +import { EPreguntaAbiertaUpdateComponent } from '../update/e-pregunta-abierta-update.component'; +import { EPreguntaAbiertaRoutingResolveService } from './e-pregunta-abierta-routing-resolve.service'; + +const ePreguntaAbiertaRoute: Routes = [ + { + path: '', + component: EPreguntaAbiertaComponent, + canActivate: [UserRouteAccessService], + }, + { + path: ':id/view', + component: EPreguntaAbiertaDetailComponent, + resolve: { + ePreguntaAbierta: EPreguntaAbiertaRoutingResolveService, + }, + canActivate: [UserRouteAccessService], + }, + { + path: 'new', + component: EPreguntaAbiertaUpdateComponent, + resolve: { + ePreguntaAbierta: EPreguntaAbiertaRoutingResolveService, + }, + canActivate: [UserRouteAccessService], + }, + { + path: ':id/edit', + component: EPreguntaAbiertaUpdateComponent, + resolve: { + ePreguntaAbierta: EPreguntaAbiertaRoutingResolveService, + }, + canActivate: [UserRouteAccessService], + }, +]; + +@NgModule({ + imports: [RouterModule.forChild(ePreguntaAbiertaRoute)], + exports: [RouterModule], +}) +export class EPreguntaAbiertaRoutingModule {} diff --git a/src/main/webapp/app/entities/e-pregunta-abierta/service/e-pregunta-abierta.service.spec.ts b/src/main/webapp/app/entities/e-pregunta-abierta/service/e-pregunta-abierta.service.spec.ts new file mode 100644 index 0000000..86cf716 --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-abierta/service/e-pregunta-abierta.service.spec.ts @@ -0,0 +1,192 @@ +import { TestBed } from '@angular/core/testing'; +import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; + +import { IEPreguntaAbierta, EPreguntaAbierta } from '../e-pregunta-abierta.model'; + +import { EPreguntaAbiertaService } from './e-pregunta-abierta.service'; + +describe('Service Tests', () => { + describe('EPreguntaAbierta Service', () => { + let service: EPreguntaAbiertaService; + let httpMock: HttpTestingController; + let elemDefault: IEPreguntaAbierta; + let expectedResult: IEPreguntaAbierta | IEPreguntaAbierta[] | boolean | null; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + }); + expectedResult = null; + service = TestBed.inject(EPreguntaAbiertaService); + httpMock = TestBed.inject(HttpTestingController); + + elemDefault = { + id: 0, + nombre: 'AAAAAAA', + opcional: false, + orden: 0, + }; + }); + + describe('Service methods', () => { + it('should find an element', () => { + const returnedFromService = Object.assign({}, elemDefault); + + service.find(123).subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'GET' }); + req.flush(returnedFromService); + expect(expectedResult).toMatchObject(elemDefault); + }); + + it('should create a EPreguntaAbierta', () => { + const returnedFromService = Object.assign( + { + id: 0, + }, + elemDefault + ); + + const expected = Object.assign({}, returnedFromService); + + service.create(new EPreguntaAbierta()).subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'POST' }); + req.flush(returnedFromService); + expect(expectedResult).toMatchObject(expected); + }); + + it('should update a EPreguntaAbierta', () => { + const returnedFromService = Object.assign( + { + id: 1, + nombre: 'BBBBBB', + opcional: true, + orden: 1, + }, + elemDefault + ); + + const expected = Object.assign({}, returnedFromService); + + service.update(expected).subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'PUT' }); + req.flush(returnedFromService); + expect(expectedResult).toMatchObject(expected); + }); + + it('should partial update a EPreguntaAbierta', () => { + const patchObject = Object.assign( + { + nombre: 'BBBBBB', + opcional: true, + orden: 1, + }, + new EPreguntaAbierta() + ); + + const returnedFromService = Object.assign(patchObject, elemDefault); + + const expected = Object.assign({}, returnedFromService); + + service.partialUpdate(patchObject).subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'PATCH' }); + req.flush(returnedFromService); + expect(expectedResult).toMatchObject(expected); + }); + + it('should return a list of EPreguntaAbierta', () => { + const returnedFromService = Object.assign( + { + id: 1, + nombre: 'BBBBBB', + opcional: true, + orden: 1, + }, + elemDefault + ); + + const expected = Object.assign({}, returnedFromService); + + service.query().subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'GET' }); + req.flush([returnedFromService]); + httpMock.verify(); + expect(expectedResult).toContainEqual(expected); + }); + + it('should delete a EPreguntaAbierta', () => { + service.delete(123).subscribe(resp => (expectedResult = resp.ok)); + + const req = httpMock.expectOne({ method: 'DELETE' }); + req.flush({ status: 200 }); + expect(expectedResult); + }); + + describe('addEPreguntaAbiertaToCollectionIfMissing', () => { + it('should add a EPreguntaAbierta to an empty array', () => { + const ePreguntaAbierta: IEPreguntaAbierta = { id: 123 }; + expectedResult = service.addEPreguntaAbiertaToCollectionIfMissing([], ePreguntaAbierta); + expect(expectedResult).toHaveLength(1); + expect(expectedResult).toContain(ePreguntaAbierta); + }); + + it('should not add a EPreguntaAbierta to an array that contains it', () => { + const ePreguntaAbierta: IEPreguntaAbierta = { id: 123 }; + const ePreguntaAbiertaCollection: IEPreguntaAbierta[] = [ + { + ...ePreguntaAbierta, + }, + { id: 456 }, + ]; + expectedResult = service.addEPreguntaAbiertaToCollectionIfMissing(ePreguntaAbiertaCollection, ePreguntaAbierta); + expect(expectedResult).toHaveLength(2); + }); + + it("should add a EPreguntaAbierta to an array that doesn't contain it", () => { + const ePreguntaAbierta: IEPreguntaAbierta = { id: 123 }; + const ePreguntaAbiertaCollection: IEPreguntaAbierta[] = [{ id: 456 }]; + expectedResult = service.addEPreguntaAbiertaToCollectionIfMissing(ePreguntaAbiertaCollection, ePreguntaAbierta); + expect(expectedResult).toHaveLength(2); + expect(expectedResult).toContain(ePreguntaAbierta); + }); + + it('should add only unique EPreguntaAbierta to an array', () => { + const ePreguntaAbiertaArray: IEPreguntaAbierta[] = [{ id: 123 }, { id: 456 }, { id: 51823 }]; + const ePreguntaAbiertaCollection: IEPreguntaAbierta[] = [{ id: 123 }]; + expectedResult = service.addEPreguntaAbiertaToCollectionIfMissing(ePreguntaAbiertaCollection, ...ePreguntaAbiertaArray); + expect(expectedResult).toHaveLength(3); + }); + + it('should accept varargs', () => { + const ePreguntaAbierta: IEPreguntaAbierta = { id: 123 }; + const ePreguntaAbierta2: IEPreguntaAbierta = { id: 456 }; + expectedResult = service.addEPreguntaAbiertaToCollectionIfMissing([], ePreguntaAbierta, ePreguntaAbierta2); + expect(expectedResult).toHaveLength(2); + expect(expectedResult).toContain(ePreguntaAbierta); + expect(expectedResult).toContain(ePreguntaAbierta2); + }); + + it('should accept null and undefined values', () => { + const ePreguntaAbierta: IEPreguntaAbierta = { id: 123 }; + expectedResult = service.addEPreguntaAbiertaToCollectionIfMissing([], null, ePreguntaAbierta, undefined); + expect(expectedResult).toHaveLength(1); + expect(expectedResult).toContain(ePreguntaAbierta); + }); + + it('should return initial array if no EPreguntaAbierta is added', () => { + const ePreguntaAbiertaCollection: IEPreguntaAbierta[] = [{ id: 123 }]; + expectedResult = service.addEPreguntaAbiertaToCollectionIfMissing(ePreguntaAbiertaCollection, undefined, null); + expect(expectedResult).toEqual(ePreguntaAbiertaCollection); + }); + }); + }); + + afterEach(() => { + httpMock.verify(); + }); + }); +}); diff --git a/src/main/webapp/app/entities/e-pregunta-abierta/service/e-pregunta-abierta.service.ts b/src/main/webapp/app/entities/e-pregunta-abierta/service/e-pregunta-abierta.service.ts new file mode 100644 index 0000000..54c1db1 --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-abierta/service/e-pregunta-abierta.service.ts @@ -0,0 +1,73 @@ +import { Injectable } from '@angular/core'; +import { HttpClient, HttpResponse } from '@angular/common/http'; +import { Observable } from 'rxjs'; + +import { isPresent } from 'app/core/util/operators'; +import { ApplicationConfigService } from 'app/core/config/application-config.service'; +import { createRequestOption } from 'app/core/request/request-util'; +import { IEPreguntaAbierta, getEPreguntaAbiertaIdentifier } from '../e-pregunta-abierta.model'; + +export type EntityResponseType = HttpResponse; +export type EntityArrayResponseType = HttpResponse; + +@Injectable({ providedIn: 'root' }) +export class EPreguntaAbiertaService { + protected resourceUrl = this.applicationConfigService.getEndpointFor('api/e-pregunta-abiertas'); + + constructor(protected http: HttpClient, protected applicationConfigService: ApplicationConfigService) {} + + create(ePreguntaAbierta: IEPreguntaAbierta): Observable { + return this.http.post(this.resourceUrl, ePreguntaAbierta, { observe: 'response' }); + } + + update(ePreguntaAbierta: IEPreguntaAbierta): Observable { + return this.http.put( + `${this.resourceUrl}/${getEPreguntaAbiertaIdentifier(ePreguntaAbierta) as number}`, + ePreguntaAbierta, + { observe: 'response' } + ); + } + + partialUpdate(ePreguntaAbierta: IEPreguntaAbierta): Observable { + return this.http.patch( + `${this.resourceUrl}/${getEPreguntaAbiertaIdentifier(ePreguntaAbierta) as number}`, + ePreguntaAbierta, + { observe: 'response' } + ); + } + + find(id: number): Observable { + return this.http.get(`${this.resourceUrl}/${id}`, { observe: 'response' }); + } + + query(req?: any): Observable { + const options = createRequestOption(req); + return this.http.get(this.resourceUrl, { params: options, observe: 'response' }); + } + + delete(id: number): Observable> { + return this.http.delete(`${this.resourceUrl}/${id}`, { observe: 'response' }); + } + + addEPreguntaAbiertaToCollectionIfMissing( + ePreguntaAbiertaCollection: IEPreguntaAbierta[], + ...ePreguntaAbiertasToCheck: (IEPreguntaAbierta | null | undefined)[] + ): IEPreguntaAbierta[] { + const ePreguntaAbiertas: IEPreguntaAbierta[] = ePreguntaAbiertasToCheck.filter(isPresent); + if (ePreguntaAbiertas.length > 0) { + const ePreguntaAbiertaCollectionIdentifiers = ePreguntaAbiertaCollection.map( + ePreguntaAbiertaItem => getEPreguntaAbiertaIdentifier(ePreguntaAbiertaItem)! + ); + const ePreguntaAbiertasToAdd = ePreguntaAbiertas.filter(ePreguntaAbiertaItem => { + const ePreguntaAbiertaIdentifier = getEPreguntaAbiertaIdentifier(ePreguntaAbiertaItem); + if (ePreguntaAbiertaIdentifier == null || ePreguntaAbiertaCollectionIdentifiers.includes(ePreguntaAbiertaIdentifier)) { + return false; + } + ePreguntaAbiertaCollectionIdentifiers.push(ePreguntaAbiertaIdentifier); + return true; + }); + return [...ePreguntaAbiertasToAdd, ...ePreguntaAbiertaCollection]; + } + return ePreguntaAbiertaCollection; + } +} diff --git a/src/main/webapp/app/entities/e-pregunta-abierta/update/e-pregunta-abierta-update.component.html b/src/main/webapp/app/entities/e-pregunta-abierta/update/e-pregunta-abierta-update.component.html new file mode 100644 index 0000000..32f1c07 --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-abierta/update/e-pregunta-abierta-update.component.html @@ -0,0 +1,104 @@ +
+
+
+

+ Create or edit a E Pregunta Abierta +

+ +
+ + +
+ + +
+ +
+ + +
+ + This field is required. + + + This field is required to be at least 1 characters. + + + This field cannot be longer than 500 characters. + +
+
+ +
+ + +
+ + This field is required. + +
+
+ +
+ + +
+ + This field is required. + + + This field should be a number. + +
+
+ +
+ + +
+
+ +
+ + + +
+
+
+
diff --git a/src/main/webapp/app/entities/e-pregunta-abierta/update/e-pregunta-abierta-update.component.spec.ts b/src/main/webapp/app/entities/e-pregunta-abierta/update/e-pregunta-abierta-update.component.spec.ts new file mode 100644 index 0000000..c69c095 --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-abierta/update/e-pregunta-abierta-update.component.spec.ts @@ -0,0 +1,149 @@ +jest.mock('@angular/router'); + +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { FormBuilder } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; +import { of, Subject } from 'rxjs'; + +import { EPreguntaAbiertaService } from '../service/e-pregunta-abierta.service'; +import { IEPreguntaAbierta, EPreguntaAbierta } from '../e-pregunta-abierta.model'; +import { IEncuesta } from 'app/entities/encuesta/encuesta.model'; +import { EncuestaService } from 'app/entities/encuesta/service/encuesta.service'; + +import { EPreguntaAbiertaUpdateComponent } from './e-pregunta-abierta-update.component'; + +describe('Component Tests', () => { + describe('EPreguntaAbierta Management Update Component', () => { + let comp: EPreguntaAbiertaUpdateComponent; + let fixture: ComponentFixture; + let activatedRoute: ActivatedRoute; + let ePreguntaAbiertaService: EPreguntaAbiertaService; + let encuestaService: EncuestaService; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [EPreguntaAbiertaUpdateComponent], + providers: [FormBuilder, ActivatedRoute], + }) + .overrideTemplate(EPreguntaAbiertaUpdateComponent, '') + .compileComponents(); + + fixture = TestBed.createComponent(EPreguntaAbiertaUpdateComponent); + activatedRoute = TestBed.inject(ActivatedRoute); + ePreguntaAbiertaService = TestBed.inject(EPreguntaAbiertaService); + encuestaService = TestBed.inject(EncuestaService); + + comp = fixture.componentInstance; + }); + + describe('ngOnInit', () => { + it('Should call Encuesta query and add missing value', () => { + const ePreguntaAbierta: IEPreguntaAbierta = { id: 456 }; + const encuesta: IEncuesta = { id: 87544 }; + ePreguntaAbierta.encuesta = encuesta; + + const encuestaCollection: IEncuesta[] = [{ id: 93487 }]; + jest.spyOn(encuestaService, 'query').mockReturnValue(of(new HttpResponse({ body: encuestaCollection }))); + const additionalEncuestas = [encuesta]; + const expectedCollection: IEncuesta[] = [...additionalEncuestas, ...encuestaCollection]; + jest.spyOn(encuestaService, 'addEncuestaToCollectionIfMissing').mockReturnValue(expectedCollection); + + activatedRoute.data = of({ ePreguntaAbierta }); + comp.ngOnInit(); + + expect(encuestaService.query).toHaveBeenCalled(); + expect(encuestaService.addEncuestaToCollectionIfMissing).toHaveBeenCalledWith(encuestaCollection, ...additionalEncuestas); + expect(comp.encuestasSharedCollection).toEqual(expectedCollection); + }); + + it('Should update editForm', () => { + const ePreguntaAbierta: IEPreguntaAbierta = { id: 456 }; + const encuesta: IEncuesta = { id: 41784 }; + ePreguntaAbierta.encuesta = encuesta; + + activatedRoute.data = of({ ePreguntaAbierta }); + comp.ngOnInit(); + + expect(comp.editForm.value).toEqual(expect.objectContaining(ePreguntaAbierta)); + expect(comp.encuestasSharedCollection).toContain(encuesta); + }); + }); + + describe('save', () => { + it('Should call update service on save for existing entity', () => { + // GIVEN + const saveSubject = new Subject>(); + const ePreguntaAbierta = { id: 123 }; + jest.spyOn(ePreguntaAbiertaService, 'update').mockReturnValue(saveSubject); + jest.spyOn(comp, 'previousState'); + activatedRoute.data = of({ ePreguntaAbierta }); + comp.ngOnInit(); + + // WHEN + comp.save(); + expect(comp.isSaving).toEqual(true); + saveSubject.next(new HttpResponse({ body: ePreguntaAbierta })); + saveSubject.complete(); + + // THEN + expect(comp.previousState).toHaveBeenCalled(); + expect(ePreguntaAbiertaService.update).toHaveBeenCalledWith(ePreguntaAbierta); + expect(comp.isSaving).toEqual(false); + }); + + it('Should call create service on save for new entity', () => { + // GIVEN + const saveSubject = new Subject>(); + const ePreguntaAbierta = new EPreguntaAbierta(); + jest.spyOn(ePreguntaAbiertaService, 'create').mockReturnValue(saveSubject); + jest.spyOn(comp, 'previousState'); + activatedRoute.data = of({ ePreguntaAbierta }); + comp.ngOnInit(); + + // WHEN + comp.save(); + expect(comp.isSaving).toEqual(true); + saveSubject.next(new HttpResponse({ body: ePreguntaAbierta })); + saveSubject.complete(); + + // THEN + expect(ePreguntaAbiertaService.create).toHaveBeenCalledWith(ePreguntaAbierta); + expect(comp.isSaving).toEqual(false); + expect(comp.previousState).toHaveBeenCalled(); + }); + + it('Should set isSaving to false on error', () => { + // GIVEN + const saveSubject = new Subject>(); + const ePreguntaAbierta = { id: 123 }; + jest.spyOn(ePreguntaAbiertaService, 'update').mockReturnValue(saveSubject); + jest.spyOn(comp, 'previousState'); + activatedRoute.data = of({ ePreguntaAbierta }); + comp.ngOnInit(); + + // WHEN + comp.save(); + expect(comp.isSaving).toEqual(true); + saveSubject.error('This is an error!'); + + // THEN + expect(ePreguntaAbiertaService.update).toHaveBeenCalledWith(ePreguntaAbierta); + expect(comp.isSaving).toEqual(false); + expect(comp.previousState).not.toHaveBeenCalled(); + }); + }); + + describe('Tracking relationships identifiers', () => { + describe('trackEncuestaById', () => { + it('Should return tracked Encuesta primary key', () => { + const entity = { id: 123 }; + const trackResult = comp.trackEncuestaById(0, entity); + expect(trackResult).toEqual(entity.id); + }); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/e-pregunta-abierta/update/e-pregunta-abierta-update.component.ts b/src/main/webapp/app/entities/e-pregunta-abierta/update/e-pregunta-abierta-update.component.ts new file mode 100644 index 0000000..0ec280f --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-abierta/update/e-pregunta-abierta-update.component.ts @@ -0,0 +1,119 @@ +import { Component, OnInit } from '@angular/core'; +import { HttpResponse } from '@angular/common/http'; +import { FormBuilder, Validators } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; +import { Observable } from 'rxjs'; +import { finalize, map } from 'rxjs/operators'; + +import { IEPreguntaAbierta, EPreguntaAbierta } from '../e-pregunta-abierta.model'; +import { EPreguntaAbiertaService } from '../service/e-pregunta-abierta.service'; +import { IEncuesta } from 'app/entities/encuesta/encuesta.model'; +import { EncuestaService } from 'app/entities/encuesta/service/encuesta.service'; + +@Component({ + selector: 'jhi-e-pregunta-abierta-update', + templateUrl: './e-pregunta-abierta-update.component.html', +}) +export class EPreguntaAbiertaUpdateComponent implements OnInit { + isSaving = false; + + encuestasSharedCollection: IEncuesta[] = []; + + editForm = this.fb.group({ + id: [], + nombre: [null, [Validators.required, Validators.minLength(1), Validators.maxLength(500)]], + opcional: [null, [Validators.required]], + orden: [null, [Validators.required]], + encuesta: [], + }); + + constructor( + protected ePreguntaAbiertaService: EPreguntaAbiertaService, + protected encuestaService: EncuestaService, + protected activatedRoute: ActivatedRoute, + protected fb: FormBuilder + ) {} + + ngOnInit(): void { + this.activatedRoute.data.subscribe(({ ePreguntaAbierta }) => { + this.updateForm(ePreguntaAbierta); + + this.loadRelationshipsOptions(); + }); + } + + previousState(): void { + window.history.back(); + } + + save(): void { + this.isSaving = true; + const ePreguntaAbierta = this.createFromForm(); + if (ePreguntaAbierta.id !== undefined) { + this.subscribeToSaveResponse(this.ePreguntaAbiertaService.update(ePreguntaAbierta)); + } else { + this.subscribeToSaveResponse(this.ePreguntaAbiertaService.create(ePreguntaAbierta)); + } + } + + trackEncuestaById(index: number, item: IEncuesta): number { + return item.id!; + } + + protected subscribeToSaveResponse(result: Observable>): void { + result.pipe(finalize(() => this.onSaveFinalize())).subscribe( + () => this.onSaveSuccess(), + () => this.onSaveError() + ); + } + + protected onSaveSuccess(): void { + this.previousState(); + } + + protected onSaveError(): void { + // Api for inheritance. + } + + protected onSaveFinalize(): void { + this.isSaving = false; + } + + protected updateForm(ePreguntaAbierta: IEPreguntaAbierta): void { + this.editForm.patchValue({ + id: ePreguntaAbierta.id, + nombre: ePreguntaAbierta.nombre, + opcional: ePreguntaAbierta.opcional, + orden: ePreguntaAbierta.orden, + encuesta: ePreguntaAbierta.encuesta, + }); + + this.encuestasSharedCollection = this.encuestaService.addEncuestaToCollectionIfMissing( + this.encuestasSharedCollection, + ePreguntaAbierta.encuesta + ); + } + + protected loadRelationshipsOptions(): void { + this.encuestaService + .query() + .pipe(map((res: HttpResponse) => res.body ?? [])) + .pipe( + map((encuestas: IEncuesta[]) => + this.encuestaService.addEncuestaToCollectionIfMissing(encuestas, this.editForm.get('encuesta')!.value) + ) + ) + .subscribe((encuestas: IEncuesta[]) => (this.encuestasSharedCollection = encuestas)); + } + + protected createFromForm(): IEPreguntaAbierta { + return { + ...new EPreguntaAbierta(), + id: this.editForm.get(['id'])!.value, + nombre: this.editForm.get(['nombre'])!.value, + opcional: this.editForm.get(['opcional'])!.value, + orden: this.editForm.get(['orden'])!.value, + encuesta: this.editForm.get(['encuesta'])!.value, + }; + } +} diff --git a/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/delete/e-pregunta-cerrada-opcion-delete-dialog.component.html b/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/delete/e-pregunta-cerrada-opcion-delete-dialog.component.html new file mode 100644 index 0000000..213a859 --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/delete/e-pregunta-cerrada-opcion-delete-dialog.component.html @@ -0,0 +1,31 @@ +
+ + + + + +
diff --git a/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/delete/e-pregunta-cerrada-opcion-delete-dialog.component.spec.ts b/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/delete/e-pregunta-cerrada-opcion-delete-dialog.component.spec.ts new file mode 100644 index 0000000..ba66e28 --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/delete/e-pregunta-cerrada-opcion-delete-dialog.component.spec.ts @@ -0,0 +1,65 @@ +jest.mock('@ng-bootstrap/ng-bootstrap'); + +import { ComponentFixture, TestBed, inject, fakeAsync, tick } from '@angular/core/testing'; +import { HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { of } from 'rxjs'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; + +import { EPreguntaCerradaOpcionService } from '../service/e-pregunta-cerrada-opcion.service'; + +import { EPreguntaCerradaOpcionDeleteDialogComponent } from './e-pregunta-cerrada-opcion-delete-dialog.component'; + +describe('Component Tests', () => { + describe('EPreguntaCerradaOpcion Management Delete Component', () => { + let comp: EPreguntaCerradaOpcionDeleteDialogComponent; + let fixture: ComponentFixture; + let service: EPreguntaCerradaOpcionService; + let mockActiveModal: NgbActiveModal; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [EPreguntaCerradaOpcionDeleteDialogComponent], + providers: [NgbActiveModal], + }) + .overrideTemplate(EPreguntaCerradaOpcionDeleteDialogComponent, '') + .compileComponents(); + fixture = TestBed.createComponent(EPreguntaCerradaOpcionDeleteDialogComponent); + comp = fixture.componentInstance; + service = TestBed.inject(EPreguntaCerradaOpcionService); + mockActiveModal = TestBed.inject(NgbActiveModal); + }); + + describe('confirmDelete', () => { + it('Should call delete service on confirmDelete', inject( + [], + fakeAsync(() => { + // GIVEN + jest.spyOn(service, 'delete').mockReturnValue(of(new HttpResponse({}))); + + // WHEN + comp.confirmDelete(123); + tick(); + + // THEN + expect(service.delete).toHaveBeenCalledWith(123); + expect(mockActiveModal.close).toHaveBeenCalledWith('deleted'); + }) + )); + + it('Should not call delete service on clear', () => { + // GIVEN + jest.spyOn(service, 'delete'); + + // WHEN + comp.cancel(); + + // THEN + expect(service.delete).not.toHaveBeenCalled(); + expect(mockActiveModal.close).not.toHaveBeenCalled(); + expect(mockActiveModal.dismiss).toHaveBeenCalled(); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/delete/e-pregunta-cerrada-opcion-delete-dialog.component.ts b/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/delete/e-pregunta-cerrada-opcion-delete-dialog.component.ts new file mode 100644 index 0000000..07f64b7 --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/delete/e-pregunta-cerrada-opcion-delete-dialog.component.ts @@ -0,0 +1,24 @@ +import { Component } from '@angular/core'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; + +import { IEPreguntaCerradaOpcion } from '../e-pregunta-cerrada-opcion.model'; +import { EPreguntaCerradaOpcionService } from '../service/e-pregunta-cerrada-opcion.service'; + +@Component({ + templateUrl: './e-pregunta-cerrada-opcion-delete-dialog.component.html', +}) +export class EPreguntaCerradaOpcionDeleteDialogComponent { + ePreguntaCerradaOpcion?: IEPreguntaCerradaOpcion; + + constructor(protected ePreguntaCerradaOpcionService: EPreguntaCerradaOpcionService, protected activeModal: NgbActiveModal) {} + + cancel(): void { + this.activeModal.dismiss(); + } + + confirmDelete(id: number): void { + this.ePreguntaCerradaOpcionService.delete(id).subscribe(() => { + this.activeModal.close('deleted'); + }); + } +} diff --git a/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/detail/e-pregunta-cerrada-opcion-detail.component.html b/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/detail/e-pregunta-cerrada-opcion-detail.component.html new file mode 100644 index 0000000..26fb52e --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/detail/e-pregunta-cerrada-opcion-detail.component.html @@ -0,0 +1,50 @@ +
+
+
+

+ E Pregunta Cerrada Opcion +

+ +
+ + + + + +
+
ID
+
+ {{ ePreguntaCerradaOpcion.id }} +
+
Nombre
+
+ {{ ePreguntaCerradaOpcion.nombre }} +
+
Orden
+
+ {{ ePreguntaCerradaOpcion.orden }} +
+
Cantidad
+
+ {{ ePreguntaCerradaOpcion.cantidad }} +
+
E Pregunta Cerrada
+
+ +
+
+ + + + +
+
+
diff --git a/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/detail/e-pregunta-cerrada-opcion-detail.component.spec.ts b/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/detail/e-pregunta-cerrada-opcion-detail.component.spec.ts new file mode 100644 index 0000000..c8caac6 --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/detail/e-pregunta-cerrada-opcion-detail.component.spec.ts @@ -0,0 +1,38 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { ActivatedRoute } from '@angular/router'; +import { of } from 'rxjs'; + +import { EPreguntaCerradaOpcionDetailComponent } from './e-pregunta-cerrada-opcion-detail.component'; + +describe('Component Tests', () => { + describe('EPreguntaCerradaOpcion Management Detail Component', () => { + let comp: EPreguntaCerradaOpcionDetailComponent; + let fixture: ComponentFixture; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [EPreguntaCerradaOpcionDetailComponent], + providers: [ + { + provide: ActivatedRoute, + useValue: { data: of({ ePreguntaCerradaOpcion: { id: 123 } }) }, + }, + ], + }) + .overrideTemplate(EPreguntaCerradaOpcionDetailComponent, '') + .compileComponents(); + fixture = TestBed.createComponent(EPreguntaCerradaOpcionDetailComponent); + comp = fixture.componentInstance; + }); + + describe('OnInit', () => { + it('Should load ePreguntaCerradaOpcion on init', () => { + // WHEN + comp.ngOnInit(); + + // THEN + expect(comp.ePreguntaCerradaOpcion).toEqual(expect.objectContaining({ id: 123 })); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/detail/e-pregunta-cerrada-opcion-detail.component.ts b/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/detail/e-pregunta-cerrada-opcion-detail.component.ts new file mode 100644 index 0000000..31f7bc1 --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/detail/e-pregunta-cerrada-opcion-detail.component.ts @@ -0,0 +1,24 @@ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; + +import { IEPreguntaCerradaOpcion } from '../e-pregunta-cerrada-opcion.model'; + +@Component({ + selector: 'jhi-e-pregunta-cerrada-opcion-detail', + templateUrl: './e-pregunta-cerrada-opcion-detail.component.html', +}) +export class EPreguntaCerradaOpcionDetailComponent implements OnInit { + ePreguntaCerradaOpcion: IEPreguntaCerradaOpcion | null = null; + + constructor(protected activatedRoute: ActivatedRoute) {} + + ngOnInit(): void { + this.activatedRoute.data.subscribe(({ ePreguntaCerradaOpcion }) => { + this.ePreguntaCerradaOpcion = ePreguntaCerradaOpcion; + }); + } + + previousState(): void { + window.history.back(); + } +} diff --git a/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/e-pregunta-cerrada-opcion.model.ts b/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/e-pregunta-cerrada-opcion.model.ts new file mode 100644 index 0000000..18343e3 --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/e-pregunta-cerrada-opcion.model.ts @@ -0,0 +1,23 @@ +import { IEPreguntaCerrada } from 'app/entities/e-pregunta-cerrada/e-pregunta-cerrada.model'; + +export interface IEPreguntaCerradaOpcion { + id?: number; + nombre?: string; + orden?: number; + cantidad?: number; + ePreguntaCerrada?: IEPreguntaCerrada | null; +} + +export class EPreguntaCerradaOpcion implements IEPreguntaCerradaOpcion { + constructor( + public id?: number, + public nombre?: string, + public orden?: number, + public cantidad?: number, + public ePreguntaCerrada?: IEPreguntaCerrada | null + ) {} +} + +export function getEPreguntaCerradaOpcionIdentifier(ePreguntaCerradaOpcion: IEPreguntaCerradaOpcion): number | undefined { + return ePreguntaCerradaOpcion.id; +} diff --git a/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/e-pregunta-cerrada-opcion.module.ts b/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/e-pregunta-cerrada-opcion.module.ts new file mode 100644 index 0000000..32553df --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/e-pregunta-cerrada-opcion.module.ts @@ -0,0 +1,19 @@ +import { NgModule } from '@angular/core'; +import { SharedModule } from 'app/shared/shared.module'; +import { EPreguntaCerradaOpcionComponent } from './list/e-pregunta-cerrada-opcion.component'; +import { EPreguntaCerradaOpcionDetailComponent } from './detail/e-pregunta-cerrada-opcion-detail.component'; +import { EPreguntaCerradaOpcionUpdateComponent } from './update/e-pregunta-cerrada-opcion-update.component'; +import { EPreguntaCerradaOpcionDeleteDialogComponent } from './delete/e-pregunta-cerrada-opcion-delete-dialog.component'; +import { EPreguntaCerradaOpcionRoutingModule } from './route/e-pregunta-cerrada-opcion-routing.module'; + +@NgModule({ + imports: [SharedModule, EPreguntaCerradaOpcionRoutingModule], + declarations: [ + EPreguntaCerradaOpcionComponent, + EPreguntaCerradaOpcionDetailComponent, + EPreguntaCerradaOpcionUpdateComponent, + EPreguntaCerradaOpcionDeleteDialogComponent, + ], + entryComponents: [EPreguntaCerradaOpcionDeleteDialogComponent], +}) +export class EPreguntaCerradaOpcionModule {} diff --git a/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/list/e-pregunta-cerrada-opcion.component.html b/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/list/e-pregunta-cerrada-opcion.component.html new file mode 100644 index 0000000..de4941f --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/list/e-pregunta-cerrada-opcion.component.html @@ -0,0 +1,90 @@ +
+

+ E Pregunta Cerrada Opcions + +
+ + + +
+

+ + + + + +
+ No ePreguntaCerradaOpcions found +
+ +
+ + + + + + + + + + + + + + + + + + + + + +
IDNombreOrdenCantidadE Pregunta Cerrada
+ {{ ePreguntaCerradaOpcion.id }} + {{ ePreguntaCerradaOpcion.nombre }}{{ ePreguntaCerradaOpcion.orden }}{{ ePreguntaCerradaOpcion.cantidad }} + + +
+ + + + + +
+
+
+
diff --git a/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/list/e-pregunta-cerrada-opcion.component.spec.ts b/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/list/e-pregunta-cerrada-opcion.component.spec.ts new file mode 100644 index 0000000..3993b4a --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/list/e-pregunta-cerrada-opcion.component.spec.ts @@ -0,0 +1,48 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { HttpHeaders, HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { of } from 'rxjs'; + +import { EPreguntaCerradaOpcionService } from '../service/e-pregunta-cerrada-opcion.service'; + +import { EPreguntaCerradaOpcionComponent } from './e-pregunta-cerrada-opcion.component'; + +describe('Component Tests', () => { + describe('EPreguntaCerradaOpcion Management Component', () => { + let comp: EPreguntaCerradaOpcionComponent; + let fixture: ComponentFixture; + let service: EPreguntaCerradaOpcionService; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [EPreguntaCerradaOpcionComponent], + }) + .overrideTemplate(EPreguntaCerradaOpcionComponent, '') + .compileComponents(); + + fixture = TestBed.createComponent(EPreguntaCerradaOpcionComponent); + comp = fixture.componentInstance; + service = TestBed.inject(EPreguntaCerradaOpcionService); + + const headers = new HttpHeaders().append('link', 'link;link'); + jest.spyOn(service, 'query').mockReturnValue( + of( + new HttpResponse({ + body: [{ id: 123 }], + headers, + }) + ) + ); + }); + + it('Should call load all on init', () => { + // WHEN + comp.ngOnInit(); + + // THEN + expect(service.query).toHaveBeenCalled(); + expect(comp.ePreguntaCerradaOpcions?.[0]).toEqual(expect.objectContaining({ id: 123 })); + }); + }); +}); diff --git a/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/list/e-pregunta-cerrada-opcion.component.ts b/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/list/e-pregunta-cerrada-opcion.component.ts new file mode 100644 index 0000000..4c580c4 --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/list/e-pregunta-cerrada-opcion.component.ts @@ -0,0 +1,51 @@ +import { Component, OnInit } from '@angular/core'; +import { HttpResponse } from '@angular/common/http'; +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; + +import { IEPreguntaCerradaOpcion } from '../e-pregunta-cerrada-opcion.model'; +import { EPreguntaCerradaOpcionService } from '../service/e-pregunta-cerrada-opcion.service'; +import { EPreguntaCerradaOpcionDeleteDialogComponent } from '../delete/e-pregunta-cerrada-opcion-delete-dialog.component'; + +@Component({ + selector: 'jhi-e-pregunta-cerrada-opcion', + templateUrl: './e-pregunta-cerrada-opcion.component.html', +}) +export class EPreguntaCerradaOpcionComponent implements OnInit { + ePreguntaCerradaOpcions?: IEPreguntaCerradaOpcion[]; + isLoading = false; + + constructor(protected ePreguntaCerradaOpcionService: EPreguntaCerradaOpcionService, protected modalService: NgbModal) {} + + loadAll(): void { + this.isLoading = true; + + this.ePreguntaCerradaOpcionService.query().subscribe( + (res: HttpResponse) => { + this.isLoading = false; + this.ePreguntaCerradaOpcions = res.body ?? []; + }, + () => { + this.isLoading = false; + } + ); + } + + ngOnInit(): void { + this.loadAll(); + } + + trackId(index: number, item: IEPreguntaCerradaOpcion): number { + return item.id!; + } + + delete(ePreguntaCerradaOpcion: IEPreguntaCerradaOpcion): void { + const modalRef = this.modalService.open(EPreguntaCerradaOpcionDeleteDialogComponent, { size: 'lg', backdrop: 'static' }); + modalRef.componentInstance.ePreguntaCerradaOpcion = ePreguntaCerradaOpcion; + // unsubscribe not needed because closed completes on modal close + modalRef.closed.subscribe(reason => { + if (reason === 'deleted') { + this.loadAll(); + } + }); + } +} diff --git a/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/route/e-pregunta-cerrada-opcion-routing-resolve.service.spec.ts b/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/route/e-pregunta-cerrada-opcion-routing-resolve.service.spec.ts new file mode 100644 index 0000000..76e62e1 --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/route/e-pregunta-cerrada-opcion-routing-resolve.service.spec.ts @@ -0,0 +1,82 @@ +jest.mock('@angular/router'); + +import { TestBed } from '@angular/core/testing'; +import { HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { ActivatedRouteSnapshot, Router } from '@angular/router'; +import { of } from 'rxjs'; + +import { IEPreguntaCerradaOpcion, EPreguntaCerradaOpcion } from '../e-pregunta-cerrada-opcion.model'; +import { EPreguntaCerradaOpcionService } from '../service/e-pregunta-cerrada-opcion.service'; + +import { EPreguntaCerradaOpcionRoutingResolveService } from './e-pregunta-cerrada-opcion-routing-resolve.service'; + +describe('Service Tests', () => { + describe('EPreguntaCerradaOpcion routing resolve service', () => { + let mockRouter: Router; + let mockActivatedRouteSnapshot: ActivatedRouteSnapshot; + let routingResolveService: EPreguntaCerradaOpcionRoutingResolveService; + let service: EPreguntaCerradaOpcionService; + let resultEPreguntaCerradaOpcion: IEPreguntaCerradaOpcion | undefined; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [Router, ActivatedRouteSnapshot], + }); + mockRouter = TestBed.inject(Router); + mockActivatedRouteSnapshot = TestBed.inject(ActivatedRouteSnapshot); + routingResolveService = TestBed.inject(EPreguntaCerradaOpcionRoutingResolveService); + service = TestBed.inject(EPreguntaCerradaOpcionService); + resultEPreguntaCerradaOpcion = undefined; + }); + + describe('resolve', () => { + it('should return IEPreguntaCerradaOpcion returned by find', () => { + // GIVEN + service.find = jest.fn(id => of(new HttpResponse({ body: { id } }))); + mockActivatedRouteSnapshot.params = { id: 123 }; + + // WHEN + routingResolveService.resolve(mockActivatedRouteSnapshot).subscribe(result => { + resultEPreguntaCerradaOpcion = result; + }); + + // THEN + expect(service.find).toBeCalledWith(123); + expect(resultEPreguntaCerradaOpcion).toEqual({ id: 123 }); + }); + + it('should return new IEPreguntaCerradaOpcion if id is not provided', () => { + // GIVEN + service.find = jest.fn(); + mockActivatedRouteSnapshot.params = {}; + + // WHEN + routingResolveService.resolve(mockActivatedRouteSnapshot).subscribe(result => { + resultEPreguntaCerradaOpcion = result; + }); + + // THEN + expect(service.find).not.toBeCalled(); + expect(resultEPreguntaCerradaOpcion).toEqual(new EPreguntaCerradaOpcion()); + }); + + it('should route to 404 page if data not found in server', () => { + // GIVEN + jest.spyOn(service, 'find').mockReturnValue(of(new HttpResponse({ body: null as unknown as EPreguntaCerradaOpcion }))); + mockActivatedRouteSnapshot.params = { id: 123 }; + + // WHEN + routingResolveService.resolve(mockActivatedRouteSnapshot).subscribe(result => { + resultEPreguntaCerradaOpcion = result; + }); + + // THEN + expect(service.find).toBeCalledWith(123); + expect(resultEPreguntaCerradaOpcion).toEqual(undefined); + expect(mockRouter.navigate).toHaveBeenCalledWith(['404']); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/route/e-pregunta-cerrada-opcion-routing-resolve.service.ts b/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/route/e-pregunta-cerrada-opcion-routing-resolve.service.ts new file mode 100644 index 0000000..9f75d6f --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/route/e-pregunta-cerrada-opcion-routing-resolve.service.ts @@ -0,0 +1,30 @@ +import { Injectable } from '@angular/core'; +import { HttpResponse } from '@angular/common/http'; +import { Resolve, ActivatedRouteSnapshot, Router } from '@angular/router'; +import { Observable, of, EMPTY } from 'rxjs'; +import { mergeMap } from 'rxjs/operators'; + +import { IEPreguntaCerradaOpcion, EPreguntaCerradaOpcion } from '../e-pregunta-cerrada-opcion.model'; +import { EPreguntaCerradaOpcionService } from '../service/e-pregunta-cerrada-opcion.service'; + +@Injectable({ providedIn: 'root' }) +export class EPreguntaCerradaOpcionRoutingResolveService implements Resolve { + constructor(protected service: EPreguntaCerradaOpcionService, protected router: Router) {} + + resolve(route: ActivatedRouteSnapshot): Observable | Observable { + const id = route.params['id']; + if (id) { + return this.service.find(id).pipe( + mergeMap((ePreguntaCerradaOpcion: HttpResponse) => { + if (ePreguntaCerradaOpcion.body) { + return of(ePreguntaCerradaOpcion.body); + } else { + this.router.navigate(['404']); + return EMPTY; + } + }) + ); + } + return of(new EPreguntaCerradaOpcion()); + } +} diff --git a/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/route/e-pregunta-cerrada-opcion-routing.module.ts b/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/route/e-pregunta-cerrada-opcion-routing.module.ts new file mode 100644 index 0000000..af295b2 --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/route/e-pregunta-cerrada-opcion-routing.module.ts @@ -0,0 +1,46 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; + +import { UserRouteAccessService } from 'app/core/auth/user-route-access.service'; +import { EPreguntaCerradaOpcionComponent } from '../list/e-pregunta-cerrada-opcion.component'; +import { EPreguntaCerradaOpcionDetailComponent } from '../detail/e-pregunta-cerrada-opcion-detail.component'; +import { EPreguntaCerradaOpcionUpdateComponent } from '../update/e-pregunta-cerrada-opcion-update.component'; +import { EPreguntaCerradaOpcionRoutingResolveService } from './e-pregunta-cerrada-opcion-routing-resolve.service'; + +const ePreguntaCerradaOpcionRoute: Routes = [ + { + path: '', + component: EPreguntaCerradaOpcionComponent, + canActivate: [UserRouteAccessService], + }, + { + path: ':id/view', + component: EPreguntaCerradaOpcionDetailComponent, + resolve: { + ePreguntaCerradaOpcion: EPreguntaCerradaOpcionRoutingResolveService, + }, + canActivate: [UserRouteAccessService], + }, + { + path: 'new', + component: EPreguntaCerradaOpcionUpdateComponent, + resolve: { + ePreguntaCerradaOpcion: EPreguntaCerradaOpcionRoutingResolveService, + }, + canActivate: [UserRouteAccessService], + }, + { + path: ':id/edit', + component: EPreguntaCerradaOpcionUpdateComponent, + resolve: { + ePreguntaCerradaOpcion: EPreguntaCerradaOpcionRoutingResolveService, + }, + canActivate: [UserRouteAccessService], + }, +]; + +@NgModule({ + imports: [RouterModule.forChild(ePreguntaCerradaOpcionRoute)], + exports: [RouterModule], +}) +export class EPreguntaCerradaOpcionRoutingModule {} diff --git a/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/service/e-pregunta-cerrada-opcion.service.spec.ts b/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/service/e-pregunta-cerrada-opcion.service.spec.ts new file mode 100644 index 0000000..c1c6700 --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/service/e-pregunta-cerrada-opcion.service.spec.ts @@ -0,0 +1,194 @@ +import { TestBed } from '@angular/core/testing'; +import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; + +import { IEPreguntaCerradaOpcion, EPreguntaCerradaOpcion } from '../e-pregunta-cerrada-opcion.model'; + +import { EPreguntaCerradaOpcionService } from './e-pregunta-cerrada-opcion.service'; + +describe('Service Tests', () => { + describe('EPreguntaCerradaOpcion Service', () => { + let service: EPreguntaCerradaOpcionService; + let httpMock: HttpTestingController; + let elemDefault: IEPreguntaCerradaOpcion; + let expectedResult: IEPreguntaCerradaOpcion | IEPreguntaCerradaOpcion[] | boolean | null; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + }); + expectedResult = null; + service = TestBed.inject(EPreguntaCerradaOpcionService); + httpMock = TestBed.inject(HttpTestingController); + + elemDefault = { + id: 0, + nombre: 'AAAAAAA', + orden: 0, + cantidad: 0, + }; + }); + + describe('Service methods', () => { + it('should find an element', () => { + const returnedFromService = Object.assign({}, elemDefault); + + service.find(123).subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'GET' }); + req.flush(returnedFromService); + expect(expectedResult).toMatchObject(elemDefault); + }); + + it('should create a EPreguntaCerradaOpcion', () => { + const returnedFromService = Object.assign( + { + id: 0, + }, + elemDefault + ); + + const expected = Object.assign({}, returnedFromService); + + service.create(new EPreguntaCerradaOpcion()).subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'POST' }); + req.flush(returnedFromService); + expect(expectedResult).toMatchObject(expected); + }); + + it('should update a EPreguntaCerradaOpcion', () => { + const returnedFromService = Object.assign( + { + id: 1, + nombre: 'BBBBBB', + orden: 1, + cantidad: 1, + }, + elemDefault + ); + + const expected = Object.assign({}, returnedFromService); + + service.update(expected).subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'PUT' }); + req.flush(returnedFromService); + expect(expectedResult).toMatchObject(expected); + }); + + it('should partial update a EPreguntaCerradaOpcion', () => { + const patchObject = Object.assign( + { + nombre: 'BBBBBB', + orden: 1, + }, + new EPreguntaCerradaOpcion() + ); + + const returnedFromService = Object.assign(patchObject, elemDefault); + + const expected = Object.assign({}, returnedFromService); + + service.partialUpdate(patchObject).subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'PATCH' }); + req.flush(returnedFromService); + expect(expectedResult).toMatchObject(expected); + }); + + it('should return a list of EPreguntaCerradaOpcion', () => { + const returnedFromService = Object.assign( + { + id: 1, + nombre: 'BBBBBB', + orden: 1, + cantidad: 1, + }, + elemDefault + ); + + const expected = Object.assign({}, returnedFromService); + + service.query().subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'GET' }); + req.flush([returnedFromService]); + httpMock.verify(); + expect(expectedResult).toContainEqual(expected); + }); + + it('should delete a EPreguntaCerradaOpcion', () => { + service.delete(123).subscribe(resp => (expectedResult = resp.ok)); + + const req = httpMock.expectOne({ method: 'DELETE' }); + req.flush({ status: 200 }); + expect(expectedResult); + }); + + describe('addEPreguntaCerradaOpcionToCollectionIfMissing', () => { + it('should add a EPreguntaCerradaOpcion to an empty array', () => { + const ePreguntaCerradaOpcion: IEPreguntaCerradaOpcion = { id: 123 }; + expectedResult = service.addEPreguntaCerradaOpcionToCollectionIfMissing([], ePreguntaCerradaOpcion); + expect(expectedResult).toHaveLength(1); + expect(expectedResult).toContain(ePreguntaCerradaOpcion); + }); + + it('should not add a EPreguntaCerradaOpcion to an array that contains it', () => { + const ePreguntaCerradaOpcion: IEPreguntaCerradaOpcion = { id: 123 }; + const ePreguntaCerradaOpcionCollection: IEPreguntaCerradaOpcion[] = [ + { + ...ePreguntaCerradaOpcion, + }, + { id: 456 }, + ]; + expectedResult = service.addEPreguntaCerradaOpcionToCollectionIfMissing(ePreguntaCerradaOpcionCollection, ePreguntaCerradaOpcion); + expect(expectedResult).toHaveLength(2); + }); + + it("should add a EPreguntaCerradaOpcion to an array that doesn't contain it", () => { + const ePreguntaCerradaOpcion: IEPreguntaCerradaOpcion = { id: 123 }; + const ePreguntaCerradaOpcionCollection: IEPreguntaCerradaOpcion[] = [{ id: 456 }]; + expectedResult = service.addEPreguntaCerradaOpcionToCollectionIfMissing(ePreguntaCerradaOpcionCollection, ePreguntaCerradaOpcion); + expect(expectedResult).toHaveLength(2); + expect(expectedResult).toContain(ePreguntaCerradaOpcion); + }); + + it('should add only unique EPreguntaCerradaOpcion to an array', () => { + const ePreguntaCerradaOpcionArray: IEPreguntaCerradaOpcion[] = [{ id: 123 }, { id: 456 }, { id: 80190 }]; + const ePreguntaCerradaOpcionCollection: IEPreguntaCerradaOpcion[] = [{ id: 123 }]; + expectedResult = service.addEPreguntaCerradaOpcionToCollectionIfMissing( + ePreguntaCerradaOpcionCollection, + ...ePreguntaCerradaOpcionArray + ); + expect(expectedResult).toHaveLength(3); + }); + + it('should accept varargs', () => { + const ePreguntaCerradaOpcion: IEPreguntaCerradaOpcion = { id: 123 }; + const ePreguntaCerradaOpcion2: IEPreguntaCerradaOpcion = { id: 456 }; + expectedResult = service.addEPreguntaCerradaOpcionToCollectionIfMissing([], ePreguntaCerradaOpcion, ePreguntaCerradaOpcion2); + expect(expectedResult).toHaveLength(2); + expect(expectedResult).toContain(ePreguntaCerradaOpcion); + expect(expectedResult).toContain(ePreguntaCerradaOpcion2); + }); + + it('should accept null and undefined values', () => { + const ePreguntaCerradaOpcion: IEPreguntaCerradaOpcion = { id: 123 }; + expectedResult = service.addEPreguntaCerradaOpcionToCollectionIfMissing([], null, ePreguntaCerradaOpcion, undefined); + expect(expectedResult).toHaveLength(1); + expect(expectedResult).toContain(ePreguntaCerradaOpcion); + }); + + it('should return initial array if no EPreguntaCerradaOpcion is added', () => { + const ePreguntaCerradaOpcionCollection: IEPreguntaCerradaOpcion[] = [{ id: 123 }]; + expectedResult = service.addEPreguntaCerradaOpcionToCollectionIfMissing(ePreguntaCerradaOpcionCollection, undefined, null); + expect(expectedResult).toEqual(ePreguntaCerradaOpcionCollection); + }); + }); + }); + + afterEach(() => { + httpMock.verify(); + }); + }); +}); diff --git a/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/service/e-pregunta-cerrada-opcion.service.ts b/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/service/e-pregunta-cerrada-opcion.service.ts new file mode 100644 index 0000000..a3daca3 --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/service/e-pregunta-cerrada-opcion.service.ts @@ -0,0 +1,76 @@ +import { Injectable } from '@angular/core'; +import { HttpClient, HttpResponse } from '@angular/common/http'; +import { Observable } from 'rxjs'; + +import { isPresent } from 'app/core/util/operators'; +import { ApplicationConfigService } from 'app/core/config/application-config.service'; +import { createRequestOption } from 'app/core/request/request-util'; +import { IEPreguntaCerradaOpcion, getEPreguntaCerradaOpcionIdentifier } from '../e-pregunta-cerrada-opcion.model'; + +export type EntityResponseType = HttpResponse; +export type EntityArrayResponseType = HttpResponse; + +@Injectable({ providedIn: 'root' }) +export class EPreguntaCerradaOpcionService { + protected resourceUrl = this.applicationConfigService.getEndpointFor('api/e-pregunta-cerrada-opcions'); + + constructor(protected http: HttpClient, protected applicationConfigService: ApplicationConfigService) {} + + create(ePreguntaCerradaOpcion: IEPreguntaCerradaOpcion): Observable { + return this.http.post(this.resourceUrl, ePreguntaCerradaOpcion, { observe: 'response' }); + } + + update(ePreguntaCerradaOpcion: IEPreguntaCerradaOpcion): Observable { + return this.http.put( + `${this.resourceUrl}/${getEPreguntaCerradaOpcionIdentifier(ePreguntaCerradaOpcion) as number}`, + ePreguntaCerradaOpcion, + { observe: 'response' } + ); + } + + partialUpdate(ePreguntaCerradaOpcion: IEPreguntaCerradaOpcion): Observable { + return this.http.patch( + `${this.resourceUrl}/${getEPreguntaCerradaOpcionIdentifier(ePreguntaCerradaOpcion) as number}`, + ePreguntaCerradaOpcion, + { observe: 'response' } + ); + } + + find(id: number): Observable { + return this.http.get(`${this.resourceUrl}/${id}`, { observe: 'response' }); + } + + query(req?: any): Observable { + const options = createRequestOption(req); + return this.http.get(this.resourceUrl, { params: options, observe: 'response' }); + } + + delete(id: number): Observable> { + return this.http.delete(`${this.resourceUrl}/${id}`, { observe: 'response' }); + } + + addEPreguntaCerradaOpcionToCollectionIfMissing( + ePreguntaCerradaOpcionCollection: IEPreguntaCerradaOpcion[], + ...ePreguntaCerradaOpcionsToCheck: (IEPreguntaCerradaOpcion | null | undefined)[] + ): IEPreguntaCerradaOpcion[] { + const ePreguntaCerradaOpcions: IEPreguntaCerradaOpcion[] = ePreguntaCerradaOpcionsToCheck.filter(isPresent); + if (ePreguntaCerradaOpcions.length > 0) { + const ePreguntaCerradaOpcionCollectionIdentifiers = ePreguntaCerradaOpcionCollection.map( + ePreguntaCerradaOpcionItem => getEPreguntaCerradaOpcionIdentifier(ePreguntaCerradaOpcionItem)! + ); + const ePreguntaCerradaOpcionsToAdd = ePreguntaCerradaOpcions.filter(ePreguntaCerradaOpcionItem => { + const ePreguntaCerradaOpcionIdentifier = getEPreguntaCerradaOpcionIdentifier(ePreguntaCerradaOpcionItem); + if ( + ePreguntaCerradaOpcionIdentifier == null || + ePreguntaCerradaOpcionCollectionIdentifiers.includes(ePreguntaCerradaOpcionIdentifier) + ) { + return false; + } + ePreguntaCerradaOpcionCollectionIdentifiers.push(ePreguntaCerradaOpcionIdentifier); + return true; + }); + return [...ePreguntaCerradaOpcionsToAdd, ...ePreguntaCerradaOpcionCollection]; + } + return ePreguntaCerradaOpcionCollection; + } +} diff --git a/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/update/e-pregunta-cerrada-opcion-update.component.html b/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/update/e-pregunta-cerrada-opcion-update.component.html new file mode 100644 index 0000000..e078405 --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/update/e-pregunta-cerrada-opcion-update.component.html @@ -0,0 +1,128 @@ +
+
+
+

+ Create or edit a E Pregunta Cerrada Opcion +

+ +
+ + +
+ + +
+ +
+ + +
+ + This field is required. + + + This field is required to be at least 1 characters. + + + This field cannot be longer than 500 characters. + +
+
+ +
+ + +
+ + This field is required. + + + This field should be a number. + +
+
+ +
+ + +
+ + This field is required. + + + This field should be a number. + +
+
+ +
+ + +
+
+ +
+ + + +
+
+
+
diff --git a/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/update/e-pregunta-cerrada-opcion-update.component.spec.ts b/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/update/e-pregunta-cerrada-opcion-update.component.spec.ts new file mode 100644 index 0000000..9e5c0ef --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/update/e-pregunta-cerrada-opcion-update.component.spec.ts @@ -0,0 +1,152 @@ +jest.mock('@angular/router'); + +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { FormBuilder } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; +import { of, Subject } from 'rxjs'; + +import { EPreguntaCerradaOpcionService } from '../service/e-pregunta-cerrada-opcion.service'; +import { IEPreguntaCerradaOpcion, EPreguntaCerradaOpcion } from '../e-pregunta-cerrada-opcion.model'; +import { IEPreguntaCerrada } from 'app/entities/e-pregunta-cerrada/e-pregunta-cerrada.model'; +import { EPreguntaCerradaService } from 'app/entities/e-pregunta-cerrada/service/e-pregunta-cerrada.service'; + +import { EPreguntaCerradaOpcionUpdateComponent } from './e-pregunta-cerrada-opcion-update.component'; + +describe('Component Tests', () => { + describe('EPreguntaCerradaOpcion Management Update Component', () => { + let comp: EPreguntaCerradaOpcionUpdateComponent; + let fixture: ComponentFixture; + let activatedRoute: ActivatedRoute; + let ePreguntaCerradaOpcionService: EPreguntaCerradaOpcionService; + let ePreguntaCerradaService: EPreguntaCerradaService; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [EPreguntaCerradaOpcionUpdateComponent], + providers: [FormBuilder, ActivatedRoute], + }) + .overrideTemplate(EPreguntaCerradaOpcionUpdateComponent, '') + .compileComponents(); + + fixture = TestBed.createComponent(EPreguntaCerradaOpcionUpdateComponent); + activatedRoute = TestBed.inject(ActivatedRoute); + ePreguntaCerradaOpcionService = TestBed.inject(EPreguntaCerradaOpcionService); + ePreguntaCerradaService = TestBed.inject(EPreguntaCerradaService); + + comp = fixture.componentInstance; + }); + + describe('ngOnInit', () => { + it('Should call EPreguntaCerrada query and add missing value', () => { + const ePreguntaCerradaOpcion: IEPreguntaCerradaOpcion = { id: 456 }; + const ePreguntaCerrada: IEPreguntaCerrada = { id: 2192 }; + ePreguntaCerradaOpcion.ePreguntaCerrada = ePreguntaCerrada; + + const ePreguntaCerradaCollection: IEPreguntaCerrada[] = [{ id: 89287 }]; + jest.spyOn(ePreguntaCerradaService, 'query').mockReturnValue(of(new HttpResponse({ body: ePreguntaCerradaCollection }))); + const additionalEPreguntaCerradas = [ePreguntaCerrada]; + const expectedCollection: IEPreguntaCerrada[] = [...additionalEPreguntaCerradas, ...ePreguntaCerradaCollection]; + jest.spyOn(ePreguntaCerradaService, 'addEPreguntaCerradaToCollectionIfMissing').mockReturnValue(expectedCollection); + + activatedRoute.data = of({ ePreguntaCerradaOpcion }); + comp.ngOnInit(); + + expect(ePreguntaCerradaService.query).toHaveBeenCalled(); + expect(ePreguntaCerradaService.addEPreguntaCerradaToCollectionIfMissing).toHaveBeenCalledWith( + ePreguntaCerradaCollection, + ...additionalEPreguntaCerradas + ); + expect(comp.ePreguntaCerradasSharedCollection).toEqual(expectedCollection); + }); + + it('Should update editForm', () => { + const ePreguntaCerradaOpcion: IEPreguntaCerradaOpcion = { id: 456 }; + const ePreguntaCerrada: IEPreguntaCerrada = { id: 64500 }; + ePreguntaCerradaOpcion.ePreguntaCerrada = ePreguntaCerrada; + + activatedRoute.data = of({ ePreguntaCerradaOpcion }); + comp.ngOnInit(); + + expect(comp.editForm.value).toEqual(expect.objectContaining(ePreguntaCerradaOpcion)); + expect(comp.ePreguntaCerradasSharedCollection).toContain(ePreguntaCerrada); + }); + }); + + describe('save', () => { + it('Should call update service on save for existing entity', () => { + // GIVEN + const saveSubject = new Subject>(); + const ePreguntaCerradaOpcion = { id: 123 }; + jest.spyOn(ePreguntaCerradaOpcionService, 'update').mockReturnValue(saveSubject); + jest.spyOn(comp, 'previousState'); + activatedRoute.data = of({ ePreguntaCerradaOpcion }); + comp.ngOnInit(); + + // WHEN + comp.save(); + expect(comp.isSaving).toEqual(true); + saveSubject.next(new HttpResponse({ body: ePreguntaCerradaOpcion })); + saveSubject.complete(); + + // THEN + expect(comp.previousState).toHaveBeenCalled(); + expect(ePreguntaCerradaOpcionService.update).toHaveBeenCalledWith(ePreguntaCerradaOpcion); + expect(comp.isSaving).toEqual(false); + }); + + it('Should call create service on save for new entity', () => { + // GIVEN + const saveSubject = new Subject>(); + const ePreguntaCerradaOpcion = new EPreguntaCerradaOpcion(); + jest.spyOn(ePreguntaCerradaOpcionService, 'create').mockReturnValue(saveSubject); + jest.spyOn(comp, 'previousState'); + activatedRoute.data = of({ ePreguntaCerradaOpcion }); + comp.ngOnInit(); + + // WHEN + comp.save(); + expect(comp.isSaving).toEqual(true); + saveSubject.next(new HttpResponse({ body: ePreguntaCerradaOpcion })); + saveSubject.complete(); + + // THEN + expect(ePreguntaCerradaOpcionService.create).toHaveBeenCalledWith(ePreguntaCerradaOpcion); + expect(comp.isSaving).toEqual(false); + expect(comp.previousState).toHaveBeenCalled(); + }); + + it('Should set isSaving to false on error', () => { + // GIVEN + const saveSubject = new Subject>(); + const ePreguntaCerradaOpcion = { id: 123 }; + jest.spyOn(ePreguntaCerradaOpcionService, 'update').mockReturnValue(saveSubject); + jest.spyOn(comp, 'previousState'); + activatedRoute.data = of({ ePreguntaCerradaOpcion }); + comp.ngOnInit(); + + // WHEN + comp.save(); + expect(comp.isSaving).toEqual(true); + saveSubject.error('This is an error!'); + + // THEN + expect(ePreguntaCerradaOpcionService.update).toHaveBeenCalledWith(ePreguntaCerradaOpcion); + expect(comp.isSaving).toEqual(false); + expect(comp.previousState).not.toHaveBeenCalled(); + }); + }); + + describe('Tracking relationships identifiers', () => { + describe('trackEPreguntaCerradaById', () => { + it('Should return tracked EPreguntaCerrada primary key', () => { + const entity = { id: 123 }; + const trackResult = comp.trackEPreguntaCerradaById(0, entity); + expect(trackResult).toEqual(entity.id); + }); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/update/e-pregunta-cerrada-opcion-update.component.ts b/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/update/e-pregunta-cerrada-opcion-update.component.ts new file mode 100644 index 0000000..9cafec9 --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-cerrada-opcion/update/e-pregunta-cerrada-opcion-update.component.ts @@ -0,0 +1,122 @@ +import { Component, OnInit } from '@angular/core'; +import { HttpResponse } from '@angular/common/http'; +import { FormBuilder, Validators } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; +import { Observable } from 'rxjs'; +import { finalize, map } from 'rxjs/operators'; + +import { IEPreguntaCerradaOpcion, EPreguntaCerradaOpcion } from '../e-pregunta-cerrada-opcion.model'; +import { EPreguntaCerradaOpcionService } from '../service/e-pregunta-cerrada-opcion.service'; +import { IEPreguntaCerrada } from 'app/entities/e-pregunta-cerrada/e-pregunta-cerrada.model'; +import { EPreguntaCerradaService } from 'app/entities/e-pregunta-cerrada/service/e-pregunta-cerrada.service'; + +@Component({ + selector: 'jhi-e-pregunta-cerrada-opcion-update', + templateUrl: './e-pregunta-cerrada-opcion-update.component.html', +}) +export class EPreguntaCerradaOpcionUpdateComponent implements OnInit { + isSaving = false; + + ePreguntaCerradasSharedCollection: IEPreguntaCerrada[] = []; + + editForm = this.fb.group({ + id: [], + nombre: [null, [Validators.required, Validators.minLength(1), Validators.maxLength(500)]], + orden: [null, [Validators.required]], + cantidad: [null, [Validators.required]], + ePreguntaCerrada: [], + }); + + constructor( + protected ePreguntaCerradaOpcionService: EPreguntaCerradaOpcionService, + protected ePreguntaCerradaService: EPreguntaCerradaService, + protected activatedRoute: ActivatedRoute, + protected fb: FormBuilder + ) {} + + ngOnInit(): void { + this.activatedRoute.data.subscribe(({ ePreguntaCerradaOpcion }) => { + this.updateForm(ePreguntaCerradaOpcion); + + this.loadRelationshipsOptions(); + }); + } + + previousState(): void { + window.history.back(); + } + + save(): void { + this.isSaving = true; + const ePreguntaCerradaOpcion = this.createFromForm(); + if (ePreguntaCerradaOpcion.id !== undefined) { + this.subscribeToSaveResponse(this.ePreguntaCerradaOpcionService.update(ePreguntaCerradaOpcion)); + } else { + this.subscribeToSaveResponse(this.ePreguntaCerradaOpcionService.create(ePreguntaCerradaOpcion)); + } + } + + trackEPreguntaCerradaById(index: number, item: IEPreguntaCerrada): number { + return item.id!; + } + + protected subscribeToSaveResponse(result: Observable>): void { + result.pipe(finalize(() => this.onSaveFinalize())).subscribe( + () => this.onSaveSuccess(), + () => this.onSaveError() + ); + } + + protected onSaveSuccess(): void { + this.previousState(); + } + + protected onSaveError(): void { + // Api for inheritance. + } + + protected onSaveFinalize(): void { + this.isSaving = false; + } + + protected updateForm(ePreguntaCerradaOpcion: IEPreguntaCerradaOpcion): void { + this.editForm.patchValue({ + id: ePreguntaCerradaOpcion.id, + nombre: ePreguntaCerradaOpcion.nombre, + orden: ePreguntaCerradaOpcion.orden, + cantidad: ePreguntaCerradaOpcion.cantidad, + ePreguntaCerrada: ePreguntaCerradaOpcion.ePreguntaCerrada, + }); + + this.ePreguntaCerradasSharedCollection = this.ePreguntaCerradaService.addEPreguntaCerradaToCollectionIfMissing( + this.ePreguntaCerradasSharedCollection, + ePreguntaCerradaOpcion.ePreguntaCerrada + ); + } + + protected loadRelationshipsOptions(): void { + this.ePreguntaCerradaService + .query() + .pipe(map((res: HttpResponse) => res.body ?? [])) + .pipe( + map((ePreguntaCerradas: IEPreguntaCerrada[]) => + this.ePreguntaCerradaService.addEPreguntaCerradaToCollectionIfMissing( + ePreguntaCerradas, + this.editForm.get('ePreguntaCerrada')!.value + ) + ) + ) + .subscribe((ePreguntaCerradas: IEPreguntaCerrada[]) => (this.ePreguntaCerradasSharedCollection = ePreguntaCerradas)); + } + + protected createFromForm(): IEPreguntaCerradaOpcion { + return { + ...new EPreguntaCerradaOpcion(), + id: this.editForm.get(['id'])!.value, + nombre: this.editForm.get(['nombre'])!.value, + orden: this.editForm.get(['orden'])!.value, + cantidad: this.editForm.get(['cantidad'])!.value, + ePreguntaCerrada: this.editForm.get(['ePreguntaCerrada'])!.value, + }; + } +} diff --git a/src/main/webapp/app/entities/e-pregunta-cerrada/delete/e-pregunta-cerrada-delete-dialog.component.html b/src/main/webapp/app/entities/e-pregunta-cerrada/delete/e-pregunta-cerrada-delete-dialog.component.html new file mode 100644 index 0000000..f20fffc --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-cerrada/delete/e-pregunta-cerrada-delete-dialog.component.html @@ -0,0 +1,29 @@ +
+ + + + + +
diff --git a/src/main/webapp/app/entities/e-pregunta-cerrada/delete/e-pregunta-cerrada-delete-dialog.component.spec.ts b/src/main/webapp/app/entities/e-pregunta-cerrada/delete/e-pregunta-cerrada-delete-dialog.component.spec.ts new file mode 100644 index 0000000..03721d8 --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-cerrada/delete/e-pregunta-cerrada-delete-dialog.component.spec.ts @@ -0,0 +1,65 @@ +jest.mock('@ng-bootstrap/ng-bootstrap'); + +import { ComponentFixture, TestBed, inject, fakeAsync, tick } from '@angular/core/testing'; +import { HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { of } from 'rxjs'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; + +import { EPreguntaCerradaService } from '../service/e-pregunta-cerrada.service'; + +import { EPreguntaCerradaDeleteDialogComponent } from './e-pregunta-cerrada-delete-dialog.component'; + +describe('Component Tests', () => { + describe('EPreguntaCerrada Management Delete Component', () => { + let comp: EPreguntaCerradaDeleteDialogComponent; + let fixture: ComponentFixture; + let service: EPreguntaCerradaService; + let mockActiveModal: NgbActiveModal; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [EPreguntaCerradaDeleteDialogComponent], + providers: [NgbActiveModal], + }) + .overrideTemplate(EPreguntaCerradaDeleteDialogComponent, '') + .compileComponents(); + fixture = TestBed.createComponent(EPreguntaCerradaDeleteDialogComponent); + comp = fixture.componentInstance; + service = TestBed.inject(EPreguntaCerradaService); + mockActiveModal = TestBed.inject(NgbActiveModal); + }); + + describe('confirmDelete', () => { + it('Should call delete service on confirmDelete', inject( + [], + fakeAsync(() => { + // GIVEN + jest.spyOn(service, 'delete').mockReturnValue(of(new HttpResponse({}))); + + // WHEN + comp.confirmDelete(123); + tick(); + + // THEN + expect(service.delete).toHaveBeenCalledWith(123); + expect(mockActiveModal.close).toHaveBeenCalledWith('deleted'); + }) + )); + + it('Should not call delete service on clear', () => { + // GIVEN + jest.spyOn(service, 'delete'); + + // WHEN + comp.cancel(); + + // THEN + expect(service.delete).not.toHaveBeenCalled(); + expect(mockActiveModal.close).not.toHaveBeenCalled(); + expect(mockActiveModal.dismiss).toHaveBeenCalled(); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/e-pregunta-cerrada/delete/e-pregunta-cerrada-delete-dialog.component.ts b/src/main/webapp/app/entities/e-pregunta-cerrada/delete/e-pregunta-cerrada-delete-dialog.component.ts new file mode 100644 index 0000000..bad40b5 --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-cerrada/delete/e-pregunta-cerrada-delete-dialog.component.ts @@ -0,0 +1,24 @@ +import { Component } from '@angular/core'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; + +import { IEPreguntaCerrada } from '../e-pregunta-cerrada.model'; +import { EPreguntaCerradaService } from '../service/e-pregunta-cerrada.service'; + +@Component({ + templateUrl: './e-pregunta-cerrada-delete-dialog.component.html', +}) +export class EPreguntaCerradaDeleteDialogComponent { + ePreguntaCerrada?: IEPreguntaCerrada; + + constructor(protected ePreguntaCerradaService: EPreguntaCerradaService, protected activeModal: NgbActiveModal) {} + + cancel(): void { + this.activeModal.dismiss(); + } + + confirmDelete(id: number): void { + this.ePreguntaCerradaService.delete(id).subscribe(() => { + this.activeModal.close('deleted'); + }); + } +} diff --git a/src/main/webapp/app/entities/e-pregunta-cerrada/detail/e-pregunta-cerrada-detail.component.html b/src/main/webapp/app/entities/e-pregunta-cerrada/detail/e-pregunta-cerrada-detail.component.html new file mode 100644 index 0000000..a141ffb --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-cerrada/detail/e-pregunta-cerrada-detail.component.html @@ -0,0 +1,52 @@ +
+
+
+

+ E Pregunta Cerrada +

+ +
+ + + + + +
+
ID
+
+ {{ ePreguntaCerrada.id }} +
+
Nombre
+
+ {{ ePreguntaCerrada.nombre }} +
+
Tipo
+
+ {{ ePreguntaCerrada.tipo }} +
+
Opcional
+
+ {{ ePreguntaCerrada.opcional }} +
+
Orden
+
+ {{ ePreguntaCerrada.orden }} +
+
Encuesta
+
+ +
+
+ + + + +
+
+
diff --git a/src/main/webapp/app/entities/e-pregunta-cerrada/detail/e-pregunta-cerrada-detail.component.spec.ts b/src/main/webapp/app/entities/e-pregunta-cerrada/detail/e-pregunta-cerrada-detail.component.spec.ts new file mode 100644 index 0000000..cda09e1 --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-cerrada/detail/e-pregunta-cerrada-detail.component.spec.ts @@ -0,0 +1,38 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { ActivatedRoute } from '@angular/router'; +import { of } from 'rxjs'; + +import { EPreguntaCerradaDetailComponent } from './e-pregunta-cerrada-detail.component'; + +describe('Component Tests', () => { + describe('EPreguntaCerrada Management Detail Component', () => { + let comp: EPreguntaCerradaDetailComponent; + let fixture: ComponentFixture; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [EPreguntaCerradaDetailComponent], + providers: [ + { + provide: ActivatedRoute, + useValue: { data: of({ ePreguntaCerrada: { id: 123 } }) }, + }, + ], + }) + .overrideTemplate(EPreguntaCerradaDetailComponent, '') + .compileComponents(); + fixture = TestBed.createComponent(EPreguntaCerradaDetailComponent); + comp = fixture.componentInstance; + }); + + describe('OnInit', () => { + it('Should load ePreguntaCerrada on init', () => { + // WHEN + comp.ngOnInit(); + + // THEN + expect(comp.ePreguntaCerrada).toEqual(expect.objectContaining({ id: 123 })); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/e-pregunta-cerrada/detail/e-pregunta-cerrada-detail.component.ts b/src/main/webapp/app/entities/e-pregunta-cerrada/detail/e-pregunta-cerrada-detail.component.ts new file mode 100644 index 0000000..acbb842 --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-cerrada/detail/e-pregunta-cerrada-detail.component.ts @@ -0,0 +1,24 @@ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; + +import { IEPreguntaCerrada } from '../e-pregunta-cerrada.model'; + +@Component({ + selector: 'jhi-e-pregunta-cerrada-detail', + templateUrl: './e-pregunta-cerrada-detail.component.html', +}) +export class EPreguntaCerradaDetailComponent implements OnInit { + ePreguntaCerrada: IEPreguntaCerrada | null = null; + + constructor(protected activatedRoute: ActivatedRoute) {} + + ngOnInit(): void { + this.activatedRoute.data.subscribe(({ ePreguntaCerrada }) => { + this.ePreguntaCerrada = ePreguntaCerrada; + }); + } + + previousState(): void { + window.history.back(); + } +} diff --git a/src/main/webapp/app/entities/e-pregunta-cerrada/e-pregunta-cerrada.model.ts b/src/main/webapp/app/entities/e-pregunta-cerrada/e-pregunta-cerrada.model.ts new file mode 100644 index 0000000..10f3501 --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-cerrada/e-pregunta-cerrada.model.ts @@ -0,0 +1,31 @@ +import { IEPreguntaCerradaOpcion } from 'app/entities/e-pregunta-cerrada-opcion/e-pregunta-cerrada-opcion.model'; +import { IEncuesta } from 'app/entities/encuesta/encuesta.model'; +import { PreguntaCerradaTipo } from 'app/entities/enumerations/pregunta-cerrada-tipo.model'; + +export interface IEPreguntaCerrada { + id?: number; + nombre?: string; + tipo?: PreguntaCerradaTipo; + opcional?: boolean; + orden?: number; + ePreguntaCerradaOpcions?: IEPreguntaCerradaOpcion[] | null; + encuesta?: IEncuesta | null; +} + +export class EPreguntaCerrada implements IEPreguntaCerrada { + constructor( + public id?: number, + public nombre?: string, + public tipo?: PreguntaCerradaTipo, + public opcional?: boolean, + public orden?: number, + public ePreguntaCerradaOpcions?: IEPreguntaCerradaOpcion[] | null, + public encuesta?: IEncuesta | null + ) { + this.opcional = this.opcional ?? false; + } +} + +export function getEPreguntaCerradaIdentifier(ePreguntaCerrada: IEPreguntaCerrada): number | undefined { + return ePreguntaCerrada.id; +} diff --git a/src/main/webapp/app/entities/e-pregunta-cerrada/e-pregunta-cerrada.module.ts b/src/main/webapp/app/entities/e-pregunta-cerrada/e-pregunta-cerrada.module.ts new file mode 100644 index 0000000..c1c033c --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-cerrada/e-pregunta-cerrada.module.ts @@ -0,0 +1,19 @@ +import { NgModule } from '@angular/core'; +import { SharedModule } from 'app/shared/shared.module'; +import { EPreguntaCerradaComponent } from './list/e-pregunta-cerrada.component'; +import { EPreguntaCerradaDetailComponent } from './detail/e-pregunta-cerrada-detail.component'; +import { EPreguntaCerradaUpdateComponent } from './update/e-pregunta-cerrada-update.component'; +import { EPreguntaCerradaDeleteDialogComponent } from './delete/e-pregunta-cerrada-delete-dialog.component'; +import { EPreguntaCerradaRoutingModule } from './route/e-pregunta-cerrada-routing.module'; + +@NgModule({ + imports: [SharedModule, EPreguntaCerradaRoutingModule], + declarations: [ + EPreguntaCerradaComponent, + EPreguntaCerradaDetailComponent, + EPreguntaCerradaUpdateComponent, + EPreguntaCerradaDeleteDialogComponent, + ], + entryComponents: [EPreguntaCerradaDeleteDialogComponent], +}) +export class EPreguntaCerradaModule {} diff --git a/src/main/webapp/app/entities/e-pregunta-cerrada/list/e-pregunta-cerrada.component.html b/src/main/webapp/app/entities/e-pregunta-cerrada/list/e-pregunta-cerrada.component.html new file mode 100644 index 0000000..96fe5a6 --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-cerrada/list/e-pregunta-cerrada.component.html @@ -0,0 +1,90 @@ +
+

+ E Pregunta Cerradas + +
+ + + +
+

+ + + + + +
+ No ePreguntaCerradas found +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + +
IDNombreTipoOpcionalOrdenEncuesta
+ {{ ePreguntaCerrada.id }} + {{ ePreguntaCerrada.nombre }}{{ ePreguntaCerrada.tipo }}{{ ePreguntaCerrada.opcional }}{{ ePreguntaCerrada.orden }} + + +
+ + + + + +
+
+
+
diff --git a/src/main/webapp/app/entities/e-pregunta-cerrada/list/e-pregunta-cerrada.component.spec.ts b/src/main/webapp/app/entities/e-pregunta-cerrada/list/e-pregunta-cerrada.component.spec.ts new file mode 100644 index 0000000..5393df4 --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-cerrada/list/e-pregunta-cerrada.component.spec.ts @@ -0,0 +1,48 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { HttpHeaders, HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { of } from 'rxjs'; + +import { EPreguntaCerradaService } from '../service/e-pregunta-cerrada.service'; + +import { EPreguntaCerradaComponent } from './e-pregunta-cerrada.component'; + +describe('Component Tests', () => { + describe('EPreguntaCerrada Management Component', () => { + let comp: EPreguntaCerradaComponent; + let fixture: ComponentFixture; + let service: EPreguntaCerradaService; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [EPreguntaCerradaComponent], + }) + .overrideTemplate(EPreguntaCerradaComponent, '') + .compileComponents(); + + fixture = TestBed.createComponent(EPreguntaCerradaComponent); + comp = fixture.componentInstance; + service = TestBed.inject(EPreguntaCerradaService); + + const headers = new HttpHeaders().append('link', 'link;link'); + jest.spyOn(service, 'query').mockReturnValue( + of( + new HttpResponse({ + body: [{ id: 123 }], + headers, + }) + ) + ); + }); + + it('Should call load all on init', () => { + // WHEN + comp.ngOnInit(); + + // THEN + expect(service.query).toHaveBeenCalled(); + expect(comp.ePreguntaCerradas?.[0]).toEqual(expect.objectContaining({ id: 123 })); + }); + }); +}); diff --git a/src/main/webapp/app/entities/e-pregunta-cerrada/list/e-pregunta-cerrada.component.ts b/src/main/webapp/app/entities/e-pregunta-cerrada/list/e-pregunta-cerrada.component.ts new file mode 100644 index 0000000..886ddd0 --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-cerrada/list/e-pregunta-cerrada.component.ts @@ -0,0 +1,51 @@ +import { Component, OnInit } from '@angular/core'; +import { HttpResponse } from '@angular/common/http'; +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; + +import { IEPreguntaCerrada } from '../e-pregunta-cerrada.model'; +import { EPreguntaCerradaService } from '../service/e-pregunta-cerrada.service'; +import { EPreguntaCerradaDeleteDialogComponent } from '../delete/e-pregunta-cerrada-delete-dialog.component'; + +@Component({ + selector: 'jhi-e-pregunta-cerrada', + templateUrl: './e-pregunta-cerrada.component.html', +}) +export class EPreguntaCerradaComponent implements OnInit { + ePreguntaCerradas?: IEPreguntaCerrada[]; + isLoading = false; + + constructor(protected ePreguntaCerradaService: EPreguntaCerradaService, protected modalService: NgbModal) {} + + loadAll(): void { + this.isLoading = true; + + this.ePreguntaCerradaService.query().subscribe( + (res: HttpResponse) => { + this.isLoading = false; + this.ePreguntaCerradas = res.body ?? []; + }, + () => { + this.isLoading = false; + } + ); + } + + ngOnInit(): void { + this.loadAll(); + } + + trackId(index: number, item: IEPreguntaCerrada): number { + return item.id!; + } + + delete(ePreguntaCerrada: IEPreguntaCerrada): void { + const modalRef = this.modalService.open(EPreguntaCerradaDeleteDialogComponent, { size: 'lg', backdrop: 'static' }); + modalRef.componentInstance.ePreguntaCerrada = ePreguntaCerrada; + // unsubscribe not needed because closed completes on modal close + modalRef.closed.subscribe(reason => { + if (reason === 'deleted') { + this.loadAll(); + } + }); + } +} diff --git a/src/main/webapp/app/entities/e-pregunta-cerrada/route/e-pregunta-cerrada-routing-resolve.service.spec.ts b/src/main/webapp/app/entities/e-pregunta-cerrada/route/e-pregunta-cerrada-routing-resolve.service.spec.ts new file mode 100644 index 0000000..a96f73d --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-cerrada/route/e-pregunta-cerrada-routing-resolve.service.spec.ts @@ -0,0 +1,82 @@ +jest.mock('@angular/router'); + +import { TestBed } from '@angular/core/testing'; +import { HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { ActivatedRouteSnapshot, Router } from '@angular/router'; +import { of } from 'rxjs'; + +import { IEPreguntaCerrada, EPreguntaCerrada } from '../e-pregunta-cerrada.model'; +import { EPreguntaCerradaService } from '../service/e-pregunta-cerrada.service'; + +import { EPreguntaCerradaRoutingResolveService } from './e-pregunta-cerrada-routing-resolve.service'; + +describe('Service Tests', () => { + describe('EPreguntaCerrada routing resolve service', () => { + let mockRouter: Router; + let mockActivatedRouteSnapshot: ActivatedRouteSnapshot; + let routingResolveService: EPreguntaCerradaRoutingResolveService; + let service: EPreguntaCerradaService; + let resultEPreguntaCerrada: IEPreguntaCerrada | undefined; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [Router, ActivatedRouteSnapshot], + }); + mockRouter = TestBed.inject(Router); + mockActivatedRouteSnapshot = TestBed.inject(ActivatedRouteSnapshot); + routingResolveService = TestBed.inject(EPreguntaCerradaRoutingResolveService); + service = TestBed.inject(EPreguntaCerradaService); + resultEPreguntaCerrada = undefined; + }); + + describe('resolve', () => { + it('should return IEPreguntaCerrada returned by find', () => { + // GIVEN + service.find = jest.fn(id => of(new HttpResponse({ body: { id } }))); + mockActivatedRouteSnapshot.params = { id: 123 }; + + // WHEN + routingResolveService.resolve(mockActivatedRouteSnapshot).subscribe(result => { + resultEPreguntaCerrada = result; + }); + + // THEN + expect(service.find).toBeCalledWith(123); + expect(resultEPreguntaCerrada).toEqual({ id: 123 }); + }); + + it('should return new IEPreguntaCerrada if id is not provided', () => { + // GIVEN + service.find = jest.fn(); + mockActivatedRouteSnapshot.params = {}; + + // WHEN + routingResolveService.resolve(mockActivatedRouteSnapshot).subscribe(result => { + resultEPreguntaCerrada = result; + }); + + // THEN + expect(service.find).not.toBeCalled(); + expect(resultEPreguntaCerrada).toEqual(new EPreguntaCerrada()); + }); + + it('should route to 404 page if data not found in server', () => { + // GIVEN + jest.spyOn(service, 'find').mockReturnValue(of(new HttpResponse({ body: null as unknown as EPreguntaCerrada }))); + mockActivatedRouteSnapshot.params = { id: 123 }; + + // WHEN + routingResolveService.resolve(mockActivatedRouteSnapshot).subscribe(result => { + resultEPreguntaCerrada = result; + }); + + // THEN + expect(service.find).toBeCalledWith(123); + expect(resultEPreguntaCerrada).toEqual(undefined); + expect(mockRouter.navigate).toHaveBeenCalledWith(['404']); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/e-pregunta-cerrada/route/e-pregunta-cerrada-routing-resolve.service.ts b/src/main/webapp/app/entities/e-pregunta-cerrada/route/e-pregunta-cerrada-routing-resolve.service.ts new file mode 100644 index 0000000..d2f4061 --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-cerrada/route/e-pregunta-cerrada-routing-resolve.service.ts @@ -0,0 +1,30 @@ +import { Injectable } from '@angular/core'; +import { HttpResponse } from '@angular/common/http'; +import { Resolve, ActivatedRouteSnapshot, Router } from '@angular/router'; +import { Observable, of, EMPTY } from 'rxjs'; +import { mergeMap } from 'rxjs/operators'; + +import { IEPreguntaCerrada, EPreguntaCerrada } from '../e-pregunta-cerrada.model'; +import { EPreguntaCerradaService } from '../service/e-pregunta-cerrada.service'; + +@Injectable({ providedIn: 'root' }) +export class EPreguntaCerradaRoutingResolveService implements Resolve { + constructor(protected service: EPreguntaCerradaService, protected router: Router) {} + + resolve(route: ActivatedRouteSnapshot): Observable | Observable { + const id = route.params['id']; + if (id) { + return this.service.find(id).pipe( + mergeMap((ePreguntaCerrada: HttpResponse) => { + if (ePreguntaCerrada.body) { + return of(ePreguntaCerrada.body); + } else { + this.router.navigate(['404']); + return EMPTY; + } + }) + ); + } + return of(new EPreguntaCerrada()); + } +} diff --git a/src/main/webapp/app/entities/e-pregunta-cerrada/route/e-pregunta-cerrada-routing.module.ts b/src/main/webapp/app/entities/e-pregunta-cerrada/route/e-pregunta-cerrada-routing.module.ts new file mode 100644 index 0000000..02865ef --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-cerrada/route/e-pregunta-cerrada-routing.module.ts @@ -0,0 +1,46 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; + +import { UserRouteAccessService } from 'app/core/auth/user-route-access.service'; +import { EPreguntaCerradaComponent } from '../list/e-pregunta-cerrada.component'; +import { EPreguntaCerradaDetailComponent } from '../detail/e-pregunta-cerrada-detail.component'; +import { EPreguntaCerradaUpdateComponent } from '../update/e-pregunta-cerrada-update.component'; +import { EPreguntaCerradaRoutingResolveService } from './e-pregunta-cerrada-routing-resolve.service'; + +const ePreguntaCerradaRoute: Routes = [ + { + path: '', + component: EPreguntaCerradaComponent, + canActivate: [UserRouteAccessService], + }, + { + path: ':id/view', + component: EPreguntaCerradaDetailComponent, + resolve: { + ePreguntaCerrada: EPreguntaCerradaRoutingResolveService, + }, + canActivate: [UserRouteAccessService], + }, + { + path: 'new', + component: EPreguntaCerradaUpdateComponent, + resolve: { + ePreguntaCerrada: EPreguntaCerradaRoutingResolveService, + }, + canActivate: [UserRouteAccessService], + }, + { + path: ':id/edit', + component: EPreguntaCerradaUpdateComponent, + resolve: { + ePreguntaCerrada: EPreguntaCerradaRoutingResolveService, + }, + canActivate: [UserRouteAccessService], + }, +]; + +@NgModule({ + imports: [RouterModule.forChild(ePreguntaCerradaRoute)], + exports: [RouterModule], +}) +export class EPreguntaCerradaRoutingModule {} diff --git a/src/main/webapp/app/entities/e-pregunta-cerrada/service/e-pregunta-cerrada.service.spec.ts b/src/main/webapp/app/entities/e-pregunta-cerrada/service/e-pregunta-cerrada.service.spec.ts new file mode 100644 index 0000000..b2d28ce --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-cerrada/service/e-pregunta-cerrada.service.spec.ts @@ -0,0 +1,194 @@ +import { TestBed } from '@angular/core/testing'; +import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; + +import { PreguntaCerradaTipo } from 'app/entities/enumerations/pregunta-cerrada-tipo.model'; +import { IEPreguntaCerrada, EPreguntaCerrada } from '../e-pregunta-cerrada.model'; + +import { EPreguntaCerradaService } from './e-pregunta-cerrada.service'; + +describe('Service Tests', () => { + describe('EPreguntaCerrada Service', () => { + let service: EPreguntaCerradaService; + let httpMock: HttpTestingController; + let elemDefault: IEPreguntaCerrada; + let expectedResult: IEPreguntaCerrada | IEPreguntaCerrada[] | boolean | null; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + }); + expectedResult = null; + service = TestBed.inject(EPreguntaCerradaService); + httpMock = TestBed.inject(HttpTestingController); + + elemDefault = { + id: 0, + nombre: 'AAAAAAA', + tipo: PreguntaCerradaTipo.SINGLE, + opcional: false, + orden: 0, + }; + }); + + describe('Service methods', () => { + it('should find an element', () => { + const returnedFromService = Object.assign({}, elemDefault); + + service.find(123).subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'GET' }); + req.flush(returnedFromService); + expect(expectedResult).toMatchObject(elemDefault); + }); + + it('should create a EPreguntaCerrada', () => { + const returnedFromService = Object.assign( + { + id: 0, + }, + elemDefault + ); + + const expected = Object.assign({}, returnedFromService); + + service.create(new EPreguntaCerrada()).subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'POST' }); + req.flush(returnedFromService); + expect(expectedResult).toMatchObject(expected); + }); + + it('should update a EPreguntaCerrada', () => { + const returnedFromService = Object.assign( + { + id: 1, + nombre: 'BBBBBB', + tipo: 'BBBBBB', + opcional: true, + orden: 1, + }, + elemDefault + ); + + const expected = Object.assign({}, returnedFromService); + + service.update(expected).subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'PUT' }); + req.flush(returnedFromService); + expect(expectedResult).toMatchObject(expected); + }); + + it('should partial update a EPreguntaCerrada', () => { + const patchObject = Object.assign( + { + opcional: true, + }, + new EPreguntaCerrada() + ); + + const returnedFromService = Object.assign(patchObject, elemDefault); + + const expected = Object.assign({}, returnedFromService); + + service.partialUpdate(patchObject).subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'PATCH' }); + req.flush(returnedFromService); + expect(expectedResult).toMatchObject(expected); + }); + + it('should return a list of EPreguntaCerrada', () => { + const returnedFromService = Object.assign( + { + id: 1, + nombre: 'BBBBBB', + tipo: 'BBBBBB', + opcional: true, + orden: 1, + }, + elemDefault + ); + + const expected = Object.assign({}, returnedFromService); + + service.query().subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'GET' }); + req.flush([returnedFromService]); + httpMock.verify(); + expect(expectedResult).toContainEqual(expected); + }); + + it('should delete a EPreguntaCerrada', () => { + service.delete(123).subscribe(resp => (expectedResult = resp.ok)); + + const req = httpMock.expectOne({ method: 'DELETE' }); + req.flush({ status: 200 }); + expect(expectedResult); + }); + + describe('addEPreguntaCerradaToCollectionIfMissing', () => { + it('should add a EPreguntaCerrada to an empty array', () => { + const ePreguntaCerrada: IEPreguntaCerrada = { id: 123 }; + expectedResult = service.addEPreguntaCerradaToCollectionIfMissing([], ePreguntaCerrada); + expect(expectedResult).toHaveLength(1); + expect(expectedResult).toContain(ePreguntaCerrada); + }); + + it('should not add a EPreguntaCerrada to an array that contains it', () => { + const ePreguntaCerrada: IEPreguntaCerrada = { id: 123 }; + const ePreguntaCerradaCollection: IEPreguntaCerrada[] = [ + { + ...ePreguntaCerrada, + }, + { id: 456 }, + ]; + expectedResult = service.addEPreguntaCerradaToCollectionIfMissing(ePreguntaCerradaCollection, ePreguntaCerrada); + expect(expectedResult).toHaveLength(2); + }); + + it("should add a EPreguntaCerrada to an array that doesn't contain it", () => { + const ePreguntaCerrada: IEPreguntaCerrada = { id: 123 }; + const ePreguntaCerradaCollection: IEPreguntaCerrada[] = [{ id: 456 }]; + expectedResult = service.addEPreguntaCerradaToCollectionIfMissing(ePreguntaCerradaCollection, ePreguntaCerrada); + expect(expectedResult).toHaveLength(2); + expect(expectedResult).toContain(ePreguntaCerrada); + }); + + it('should add only unique EPreguntaCerrada to an array', () => { + const ePreguntaCerradaArray: IEPreguntaCerrada[] = [{ id: 123 }, { id: 456 }, { id: 98164 }]; + const ePreguntaCerradaCollection: IEPreguntaCerrada[] = [{ id: 123 }]; + expectedResult = service.addEPreguntaCerradaToCollectionIfMissing(ePreguntaCerradaCollection, ...ePreguntaCerradaArray); + expect(expectedResult).toHaveLength(3); + }); + + it('should accept varargs', () => { + const ePreguntaCerrada: IEPreguntaCerrada = { id: 123 }; + const ePreguntaCerrada2: IEPreguntaCerrada = { id: 456 }; + expectedResult = service.addEPreguntaCerradaToCollectionIfMissing([], ePreguntaCerrada, ePreguntaCerrada2); + expect(expectedResult).toHaveLength(2); + expect(expectedResult).toContain(ePreguntaCerrada); + expect(expectedResult).toContain(ePreguntaCerrada2); + }); + + it('should accept null and undefined values', () => { + const ePreguntaCerrada: IEPreguntaCerrada = { id: 123 }; + expectedResult = service.addEPreguntaCerradaToCollectionIfMissing([], null, ePreguntaCerrada, undefined); + expect(expectedResult).toHaveLength(1); + expect(expectedResult).toContain(ePreguntaCerrada); + }); + + it('should return initial array if no EPreguntaCerrada is added', () => { + const ePreguntaCerradaCollection: IEPreguntaCerrada[] = [{ id: 123 }]; + expectedResult = service.addEPreguntaCerradaToCollectionIfMissing(ePreguntaCerradaCollection, undefined, null); + expect(expectedResult).toEqual(ePreguntaCerradaCollection); + }); + }); + }); + + afterEach(() => { + httpMock.verify(); + }); + }); +}); diff --git a/src/main/webapp/app/entities/e-pregunta-cerrada/service/e-pregunta-cerrada.service.ts b/src/main/webapp/app/entities/e-pregunta-cerrada/service/e-pregunta-cerrada.service.ts new file mode 100644 index 0000000..d3755d3 --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-cerrada/service/e-pregunta-cerrada.service.ts @@ -0,0 +1,73 @@ +import { Injectable } from '@angular/core'; +import { HttpClient, HttpResponse } from '@angular/common/http'; +import { Observable } from 'rxjs'; + +import { isPresent } from 'app/core/util/operators'; +import { ApplicationConfigService } from 'app/core/config/application-config.service'; +import { createRequestOption } from 'app/core/request/request-util'; +import { IEPreguntaCerrada, getEPreguntaCerradaIdentifier } from '../e-pregunta-cerrada.model'; + +export type EntityResponseType = HttpResponse; +export type EntityArrayResponseType = HttpResponse; + +@Injectable({ providedIn: 'root' }) +export class EPreguntaCerradaService { + protected resourceUrl = this.applicationConfigService.getEndpointFor('api/e-pregunta-cerradas'); + + constructor(protected http: HttpClient, protected applicationConfigService: ApplicationConfigService) {} + + create(ePreguntaCerrada: IEPreguntaCerrada): Observable { + return this.http.post(this.resourceUrl, ePreguntaCerrada, { observe: 'response' }); + } + + update(ePreguntaCerrada: IEPreguntaCerrada): Observable { + return this.http.put( + `${this.resourceUrl}/${getEPreguntaCerradaIdentifier(ePreguntaCerrada) as number}`, + ePreguntaCerrada, + { observe: 'response' } + ); + } + + partialUpdate(ePreguntaCerrada: IEPreguntaCerrada): Observable { + return this.http.patch( + `${this.resourceUrl}/${getEPreguntaCerradaIdentifier(ePreguntaCerrada) as number}`, + ePreguntaCerrada, + { observe: 'response' } + ); + } + + find(id: number): Observable { + return this.http.get(`${this.resourceUrl}/${id}`, { observe: 'response' }); + } + + query(req?: any): Observable { + const options = createRequestOption(req); + return this.http.get(this.resourceUrl, { params: options, observe: 'response' }); + } + + delete(id: number): Observable> { + return this.http.delete(`${this.resourceUrl}/${id}`, { observe: 'response' }); + } + + addEPreguntaCerradaToCollectionIfMissing( + ePreguntaCerradaCollection: IEPreguntaCerrada[], + ...ePreguntaCerradasToCheck: (IEPreguntaCerrada | null | undefined)[] + ): IEPreguntaCerrada[] { + const ePreguntaCerradas: IEPreguntaCerrada[] = ePreguntaCerradasToCheck.filter(isPresent); + if (ePreguntaCerradas.length > 0) { + const ePreguntaCerradaCollectionIdentifiers = ePreguntaCerradaCollection.map( + ePreguntaCerradaItem => getEPreguntaCerradaIdentifier(ePreguntaCerradaItem)! + ); + const ePreguntaCerradasToAdd = ePreguntaCerradas.filter(ePreguntaCerradaItem => { + const ePreguntaCerradaIdentifier = getEPreguntaCerradaIdentifier(ePreguntaCerradaItem); + if (ePreguntaCerradaIdentifier == null || ePreguntaCerradaCollectionIdentifiers.includes(ePreguntaCerradaIdentifier)) { + return false; + } + ePreguntaCerradaCollectionIdentifiers.push(ePreguntaCerradaIdentifier); + return true; + }); + return [...ePreguntaCerradasToAdd, ...ePreguntaCerradaCollection]; + } + return ePreguntaCerradaCollection; + } +} diff --git a/src/main/webapp/app/entities/e-pregunta-cerrada/update/e-pregunta-cerrada-update.component.html b/src/main/webapp/app/entities/e-pregunta-cerrada/update/e-pregunta-cerrada-update.component.html new file mode 100644 index 0000000..9e72613 --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-cerrada/update/e-pregunta-cerrada-update.component.html @@ -0,0 +1,118 @@ +
+
+
+

+ Create or edit a E Pregunta Cerrada +

+ +
+ + +
+ + +
+ +
+ + +
+ + This field is required. + + + This field is required to be at least 1 characters. + + + This field cannot be longer than 500 characters. + +
+
+ +
+ + +
+ + This field is required. + +
+
+ +
+ + +
+ + This field is required. + +
+
+ +
+ + +
+ + This field is required. + + + This field should be a number. + +
+
+ +
+ + +
+
+ +
+ + + +
+
+
+
diff --git a/src/main/webapp/app/entities/e-pregunta-cerrada/update/e-pregunta-cerrada-update.component.spec.ts b/src/main/webapp/app/entities/e-pregunta-cerrada/update/e-pregunta-cerrada-update.component.spec.ts new file mode 100644 index 0000000..d899c8d --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-cerrada/update/e-pregunta-cerrada-update.component.spec.ts @@ -0,0 +1,149 @@ +jest.mock('@angular/router'); + +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { FormBuilder } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; +import { of, Subject } from 'rxjs'; + +import { EPreguntaCerradaService } from '../service/e-pregunta-cerrada.service'; +import { IEPreguntaCerrada, EPreguntaCerrada } from '../e-pregunta-cerrada.model'; +import { IEncuesta } from 'app/entities/encuesta/encuesta.model'; +import { EncuestaService } from 'app/entities/encuesta/service/encuesta.service'; + +import { EPreguntaCerradaUpdateComponent } from './e-pregunta-cerrada-update.component'; + +describe('Component Tests', () => { + describe('EPreguntaCerrada Management Update Component', () => { + let comp: EPreguntaCerradaUpdateComponent; + let fixture: ComponentFixture; + let activatedRoute: ActivatedRoute; + let ePreguntaCerradaService: EPreguntaCerradaService; + let encuestaService: EncuestaService; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [EPreguntaCerradaUpdateComponent], + providers: [FormBuilder, ActivatedRoute], + }) + .overrideTemplate(EPreguntaCerradaUpdateComponent, '') + .compileComponents(); + + fixture = TestBed.createComponent(EPreguntaCerradaUpdateComponent); + activatedRoute = TestBed.inject(ActivatedRoute); + ePreguntaCerradaService = TestBed.inject(EPreguntaCerradaService); + encuestaService = TestBed.inject(EncuestaService); + + comp = fixture.componentInstance; + }); + + describe('ngOnInit', () => { + it('Should call Encuesta query and add missing value', () => { + const ePreguntaCerrada: IEPreguntaCerrada = { id: 456 }; + const encuesta: IEncuesta = { id: 27208 }; + ePreguntaCerrada.encuesta = encuesta; + + const encuestaCollection: IEncuesta[] = [{ id: 3120 }]; + jest.spyOn(encuestaService, 'query').mockReturnValue(of(new HttpResponse({ body: encuestaCollection }))); + const additionalEncuestas = [encuesta]; + const expectedCollection: IEncuesta[] = [...additionalEncuestas, ...encuestaCollection]; + jest.spyOn(encuestaService, 'addEncuestaToCollectionIfMissing').mockReturnValue(expectedCollection); + + activatedRoute.data = of({ ePreguntaCerrada }); + comp.ngOnInit(); + + expect(encuestaService.query).toHaveBeenCalled(); + expect(encuestaService.addEncuestaToCollectionIfMissing).toHaveBeenCalledWith(encuestaCollection, ...additionalEncuestas); + expect(comp.encuestasSharedCollection).toEqual(expectedCollection); + }); + + it('Should update editForm', () => { + const ePreguntaCerrada: IEPreguntaCerrada = { id: 456 }; + const encuesta: IEncuesta = { id: 4358 }; + ePreguntaCerrada.encuesta = encuesta; + + activatedRoute.data = of({ ePreguntaCerrada }); + comp.ngOnInit(); + + expect(comp.editForm.value).toEqual(expect.objectContaining(ePreguntaCerrada)); + expect(comp.encuestasSharedCollection).toContain(encuesta); + }); + }); + + describe('save', () => { + it('Should call update service on save for existing entity', () => { + // GIVEN + const saveSubject = new Subject>(); + const ePreguntaCerrada = { id: 123 }; + jest.spyOn(ePreguntaCerradaService, 'update').mockReturnValue(saveSubject); + jest.spyOn(comp, 'previousState'); + activatedRoute.data = of({ ePreguntaCerrada }); + comp.ngOnInit(); + + // WHEN + comp.save(); + expect(comp.isSaving).toEqual(true); + saveSubject.next(new HttpResponse({ body: ePreguntaCerrada })); + saveSubject.complete(); + + // THEN + expect(comp.previousState).toHaveBeenCalled(); + expect(ePreguntaCerradaService.update).toHaveBeenCalledWith(ePreguntaCerrada); + expect(comp.isSaving).toEqual(false); + }); + + it('Should call create service on save for new entity', () => { + // GIVEN + const saveSubject = new Subject>(); + const ePreguntaCerrada = new EPreguntaCerrada(); + jest.spyOn(ePreguntaCerradaService, 'create').mockReturnValue(saveSubject); + jest.spyOn(comp, 'previousState'); + activatedRoute.data = of({ ePreguntaCerrada }); + comp.ngOnInit(); + + // WHEN + comp.save(); + expect(comp.isSaving).toEqual(true); + saveSubject.next(new HttpResponse({ body: ePreguntaCerrada })); + saveSubject.complete(); + + // THEN + expect(ePreguntaCerradaService.create).toHaveBeenCalledWith(ePreguntaCerrada); + expect(comp.isSaving).toEqual(false); + expect(comp.previousState).toHaveBeenCalled(); + }); + + it('Should set isSaving to false on error', () => { + // GIVEN + const saveSubject = new Subject>(); + const ePreguntaCerrada = { id: 123 }; + jest.spyOn(ePreguntaCerradaService, 'update').mockReturnValue(saveSubject); + jest.spyOn(comp, 'previousState'); + activatedRoute.data = of({ ePreguntaCerrada }); + comp.ngOnInit(); + + // WHEN + comp.save(); + expect(comp.isSaving).toEqual(true); + saveSubject.error('This is an error!'); + + // THEN + expect(ePreguntaCerradaService.update).toHaveBeenCalledWith(ePreguntaCerrada); + expect(comp.isSaving).toEqual(false); + expect(comp.previousState).not.toHaveBeenCalled(); + }); + }); + + describe('Tracking relationships identifiers', () => { + describe('trackEncuestaById', () => { + it('Should return tracked Encuesta primary key', () => { + const entity = { id: 123 }; + const trackResult = comp.trackEncuestaById(0, entity); + expect(trackResult).toEqual(entity.id); + }); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/e-pregunta-cerrada/update/e-pregunta-cerrada-update.component.ts b/src/main/webapp/app/entities/e-pregunta-cerrada/update/e-pregunta-cerrada-update.component.ts new file mode 100644 index 0000000..b865dbe --- /dev/null +++ b/src/main/webapp/app/entities/e-pregunta-cerrada/update/e-pregunta-cerrada-update.component.ts @@ -0,0 +1,122 @@ +import { Component, OnInit } from '@angular/core'; +import { HttpResponse } from '@angular/common/http'; +import { FormBuilder, Validators } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; +import { Observable } from 'rxjs'; +import { finalize, map } from 'rxjs/operators'; + +import { IEPreguntaCerrada, EPreguntaCerrada } from '../e-pregunta-cerrada.model'; +import { EPreguntaCerradaService } from '../service/e-pregunta-cerrada.service'; +import { IEncuesta } from 'app/entities/encuesta/encuesta.model'; +import { EncuestaService } from 'app/entities/encuesta/service/encuesta.service'; + +@Component({ + selector: 'jhi-e-pregunta-cerrada-update', + templateUrl: './e-pregunta-cerrada-update.component.html', +}) +export class EPreguntaCerradaUpdateComponent implements OnInit { + isSaving = false; + + encuestasSharedCollection: IEncuesta[] = []; + + editForm = this.fb.group({ + id: [], + nombre: [null, [Validators.required, Validators.minLength(1), Validators.maxLength(500)]], + tipo: [null, [Validators.required]], + opcional: [null, [Validators.required]], + orden: [null, [Validators.required]], + encuesta: [], + }); + + constructor( + protected ePreguntaCerradaService: EPreguntaCerradaService, + protected encuestaService: EncuestaService, + protected activatedRoute: ActivatedRoute, + protected fb: FormBuilder + ) {} + + ngOnInit(): void { + this.activatedRoute.data.subscribe(({ ePreguntaCerrada }) => { + this.updateForm(ePreguntaCerrada); + + this.loadRelationshipsOptions(); + }); + } + + previousState(): void { + window.history.back(); + } + + save(): void { + this.isSaving = true; + const ePreguntaCerrada = this.createFromForm(); + if (ePreguntaCerrada.id !== undefined) { + this.subscribeToSaveResponse(this.ePreguntaCerradaService.update(ePreguntaCerrada)); + } else { + this.subscribeToSaveResponse(this.ePreguntaCerradaService.create(ePreguntaCerrada)); + } + } + + trackEncuestaById(index: number, item: IEncuesta): number { + return item.id!; + } + + protected subscribeToSaveResponse(result: Observable>): void { + result.pipe(finalize(() => this.onSaveFinalize())).subscribe( + () => this.onSaveSuccess(), + () => this.onSaveError() + ); + } + + protected onSaveSuccess(): void { + this.previousState(); + } + + protected onSaveError(): void { + // Api for inheritance. + } + + protected onSaveFinalize(): void { + this.isSaving = false; + } + + protected updateForm(ePreguntaCerrada: IEPreguntaCerrada): void { + this.editForm.patchValue({ + id: ePreguntaCerrada.id, + nombre: ePreguntaCerrada.nombre, + tipo: ePreguntaCerrada.tipo, + opcional: ePreguntaCerrada.opcional, + orden: ePreguntaCerrada.orden, + encuesta: ePreguntaCerrada.encuesta, + }); + + this.encuestasSharedCollection = this.encuestaService.addEncuestaToCollectionIfMissing( + this.encuestasSharedCollection, + ePreguntaCerrada.encuesta + ); + } + + protected loadRelationshipsOptions(): void { + this.encuestaService + .query() + .pipe(map((res: HttpResponse) => res.body ?? [])) + .pipe( + map((encuestas: IEncuesta[]) => + this.encuestaService.addEncuestaToCollectionIfMissing(encuestas, this.editForm.get('encuesta')!.value) + ) + ) + .subscribe((encuestas: IEncuesta[]) => (this.encuestasSharedCollection = encuestas)); + } + + protected createFromForm(): IEPreguntaCerrada { + return { + ...new EPreguntaCerrada(), + id: this.editForm.get(['id'])!.value, + nombre: this.editForm.get(['nombre'])!.value, + tipo: this.editForm.get(['tipo'])!.value, + opcional: this.editForm.get(['opcional'])!.value, + orden: this.editForm.get(['orden'])!.value, + encuesta: this.editForm.get(['encuesta'])!.value, + }; + } +} diff --git a/src/main/webapp/app/entities/encuesta/delete/encuesta-delete-dialog.component.html b/src/main/webapp/app/entities/encuesta/delete/encuesta-delete-dialog.component.html new file mode 100644 index 0000000..dfe7349 --- /dev/null +++ b/src/main/webapp/app/entities/encuesta/delete/encuesta-delete-dialog.component.html @@ -0,0 +1,25 @@ +
+ + + + + +
diff --git a/src/main/webapp/app/entities/encuesta/delete/encuesta-delete-dialog.component.spec.ts b/src/main/webapp/app/entities/encuesta/delete/encuesta-delete-dialog.component.spec.ts new file mode 100644 index 0000000..cee92bc --- /dev/null +++ b/src/main/webapp/app/entities/encuesta/delete/encuesta-delete-dialog.component.spec.ts @@ -0,0 +1,65 @@ +jest.mock('@ng-bootstrap/ng-bootstrap'); + +import { ComponentFixture, TestBed, inject, fakeAsync, tick } from '@angular/core/testing'; +import { HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { of } from 'rxjs'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; + +import { EncuestaService } from '../service/encuesta.service'; + +import { EncuestaDeleteDialogComponent } from './encuesta-delete-dialog.component'; + +describe('Component Tests', () => { + describe('Encuesta Management Delete Component', () => { + let comp: EncuestaDeleteDialogComponent; + let fixture: ComponentFixture; + let service: EncuestaService; + let mockActiveModal: NgbActiveModal; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [EncuestaDeleteDialogComponent], + providers: [NgbActiveModal], + }) + .overrideTemplate(EncuestaDeleteDialogComponent, '') + .compileComponents(); + fixture = TestBed.createComponent(EncuestaDeleteDialogComponent); + comp = fixture.componentInstance; + service = TestBed.inject(EncuestaService); + mockActiveModal = TestBed.inject(NgbActiveModal); + }); + + describe('confirmDelete', () => { + it('Should call delete service on confirmDelete', inject( + [], + fakeAsync(() => { + // GIVEN + jest.spyOn(service, 'delete').mockReturnValue(of(new HttpResponse({}))); + + // WHEN + comp.confirmDelete(123); + tick(); + + // THEN + expect(service.delete).toHaveBeenCalledWith(123); + expect(mockActiveModal.close).toHaveBeenCalledWith('deleted'); + }) + )); + + it('Should not call delete service on clear', () => { + // GIVEN + jest.spyOn(service, 'delete'); + + // WHEN + comp.cancel(); + + // THEN + expect(service.delete).not.toHaveBeenCalled(); + expect(mockActiveModal.close).not.toHaveBeenCalled(); + expect(mockActiveModal.dismiss).toHaveBeenCalled(); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/encuesta/delete/encuesta-delete-dialog.component.ts b/src/main/webapp/app/entities/encuesta/delete/encuesta-delete-dialog.component.ts new file mode 100644 index 0000000..573c319 --- /dev/null +++ b/src/main/webapp/app/entities/encuesta/delete/encuesta-delete-dialog.component.ts @@ -0,0 +1,24 @@ +import { Component } from '@angular/core'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; + +import { IEncuesta } from '../encuesta.model'; +import { EncuestaService } from '../service/encuesta.service'; + +@Component({ + templateUrl: './encuesta-delete-dialog.component.html', +}) +export class EncuestaDeleteDialogComponent { + encuesta?: IEncuesta; + + constructor(protected encuestaService: EncuestaService, protected activeModal: NgbActiveModal) {} + + cancel(): void { + this.activeModal.dismiss(); + } + + confirmDelete(id: number): void { + this.encuestaService.delete(id).subscribe(() => { + this.activeModal.close('deleted'); + }); + } +} diff --git a/src/main/webapp/app/entities/encuesta/detail/encuesta-detail.component.html b/src/main/webapp/app/entities/encuesta/detail/encuesta-detail.component.html new file mode 100644 index 0000000..6873d16 --- /dev/null +++ b/src/main/webapp/app/entities/encuesta/detail/encuesta-detail.component.html @@ -0,0 +1,80 @@ +
+
+
+

Encuesta

+ +
+ + + + + +
+
ID
+
+ {{ encuesta.id }} +
+
Nombre
+
+ {{ encuesta.nombre }} +
+
Descripcion
+
+ {{ encuesta.descripcion }} +
+
Fecha Creacion
+
+ {{ encuesta.fechaCreacion | formatMediumDatetime }} +
+
Fecha Publicacion
+
+ {{ encuesta.fechaPublicacion | formatMediumDatetime }} +
+
Fecha Finalizar
+
+ {{ encuesta.fechaFinalizar | formatMediumDatetime }} +
+
Fecha Finalizada
+
+ {{ encuesta.fechaFinalizada | formatMediumDatetime }} +
+
Calificacion
+
+ {{ encuesta.calificacion }} +
+
Acceso
+
+ {{ encuesta.acceso }} +
+
Contrasenna
+
+ {{ encuesta.contrasenna }} +
+
Estado
+
+ {{ encuesta.estado }} +
+
Categoria
+
+ +
+
Usuario Extra
+
+ +
+
+ + + + +
+
+
diff --git a/src/main/webapp/app/entities/encuesta/detail/encuesta-detail.component.spec.ts b/src/main/webapp/app/entities/encuesta/detail/encuesta-detail.component.spec.ts new file mode 100644 index 0000000..512dad8 --- /dev/null +++ b/src/main/webapp/app/entities/encuesta/detail/encuesta-detail.component.spec.ts @@ -0,0 +1,38 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { ActivatedRoute } from '@angular/router'; +import { of } from 'rxjs'; + +import { EncuestaDetailComponent } from './encuesta-detail.component'; + +describe('Component Tests', () => { + describe('Encuesta Management Detail Component', () => { + let comp: EncuestaDetailComponent; + let fixture: ComponentFixture; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [EncuestaDetailComponent], + providers: [ + { + provide: ActivatedRoute, + useValue: { data: of({ encuesta: { id: 123 } }) }, + }, + ], + }) + .overrideTemplate(EncuestaDetailComponent, '') + .compileComponents(); + fixture = TestBed.createComponent(EncuestaDetailComponent); + comp = fixture.componentInstance; + }); + + describe('OnInit', () => { + it('Should load encuesta on init', () => { + // WHEN + comp.ngOnInit(); + + // THEN + expect(comp.encuesta).toEqual(expect.objectContaining({ id: 123 })); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/encuesta/detail/encuesta-detail.component.ts b/src/main/webapp/app/entities/encuesta/detail/encuesta-detail.component.ts new file mode 100644 index 0000000..f04d377 --- /dev/null +++ b/src/main/webapp/app/entities/encuesta/detail/encuesta-detail.component.ts @@ -0,0 +1,24 @@ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; + +import { IEncuesta } from '../encuesta.model'; + +@Component({ + selector: 'jhi-encuesta-detail', + templateUrl: './encuesta-detail.component.html', +}) +export class EncuestaDetailComponent implements OnInit { + encuesta: IEncuesta | null = null; + + constructor(protected activatedRoute: ActivatedRoute) {} + + ngOnInit(): void { + this.activatedRoute.data.subscribe(({ encuesta }) => { + this.encuesta = encuesta; + }); + } + + previousState(): void { + window.history.back(); + } +} diff --git a/src/main/webapp/app/entities/encuesta/encuesta.model.ts b/src/main/webapp/app/entities/encuesta/encuesta.model.ts new file mode 100644 index 0000000..1127b13 --- /dev/null +++ b/src/main/webapp/app/entities/encuesta/encuesta.model.ts @@ -0,0 +1,52 @@ +import * as dayjs from 'dayjs'; +import { IUsuarioEncuesta } from 'app/entities/usuario-encuesta/usuario-encuesta.model'; +import { IEPreguntaAbierta } from 'app/entities/e-pregunta-abierta/e-pregunta-abierta.model'; +import { IEPreguntaCerrada } from 'app/entities/e-pregunta-cerrada/e-pregunta-cerrada.model'; +import { ICategoria } from 'app/entities/categoria/categoria.model'; +import { IUsuarioExtra } from 'app/entities/usuario-extra/usuario-extra.model'; +import { AccesoEncuesta } from 'app/entities/enumerations/acceso-encuesta.model'; +import { EstadoEncuesta } from 'app/entities/enumerations/estado-encuesta.model'; + +export interface IEncuesta { + id?: number; + nombre?: string; + descripcion?: string | null; + fechaCreacion?: dayjs.Dayjs; + fechaPublicacion?: dayjs.Dayjs | null; + fechaFinalizar?: dayjs.Dayjs | null; + fechaFinalizada?: dayjs.Dayjs | null; + calificacion?: number; + acceso?: AccesoEncuesta; + contrasenna?: string | null; + estado?: EstadoEncuesta; + usuarioEncuestas?: IUsuarioEncuesta[] | null; + ePreguntaAbiertas?: IEPreguntaAbierta[] | null; + ePreguntaCerradas?: IEPreguntaCerrada[] | null; + categoria?: ICategoria | null; + usuarioExtra?: IUsuarioExtra | null; +} + +export class Encuesta implements IEncuesta { + constructor( + public id?: number, + public nombre?: string, + public descripcion?: string | null, + public fechaCreacion?: dayjs.Dayjs, + public fechaPublicacion?: dayjs.Dayjs | null, + public fechaFinalizar?: dayjs.Dayjs | null, + public fechaFinalizada?: dayjs.Dayjs | null, + public calificacion?: number, + public acceso?: AccesoEncuesta, + public contrasenna?: string | null, + public estado?: EstadoEncuesta, + public usuarioEncuestas?: IUsuarioEncuesta[] | null, + public ePreguntaAbiertas?: IEPreguntaAbierta[] | null, + public ePreguntaCerradas?: IEPreguntaCerrada[] | null, + public categoria?: ICategoria | null, + public usuarioExtra?: IUsuarioExtra | null + ) {} +} + +export function getEncuestaIdentifier(encuesta: IEncuesta): number | undefined { + return encuesta.id; +} diff --git a/src/main/webapp/app/entities/encuesta/encuesta.module.ts b/src/main/webapp/app/entities/encuesta/encuesta.module.ts new file mode 100644 index 0000000..c78f7dc --- /dev/null +++ b/src/main/webapp/app/entities/encuesta/encuesta.module.ts @@ -0,0 +1,14 @@ +import { NgModule } from '@angular/core'; +import { SharedModule } from 'app/shared/shared.module'; +import { EncuestaComponent } from './list/encuesta.component'; +import { EncuestaDetailComponent } from './detail/encuesta-detail.component'; +import { EncuestaUpdateComponent } from './update/encuesta-update.component'; +import { EncuestaDeleteDialogComponent } from './delete/encuesta-delete-dialog.component'; +import { EncuestaRoutingModule } from './route/encuesta-routing.module'; + +@NgModule({ + imports: [SharedModule, EncuestaRoutingModule], + declarations: [EncuestaComponent, EncuestaDetailComponent, EncuestaUpdateComponent, EncuestaDeleteDialogComponent], + entryComponents: [EncuestaDeleteDialogComponent], +}) +export class EncuestaModule {} diff --git a/src/main/webapp/app/entities/encuesta/list/encuesta.component.html b/src/main/webapp/app/entities/encuesta/list/encuesta.component.html new file mode 100644 index 0000000..bc4bc51 --- /dev/null +++ b/src/main/webapp/app/entities/encuesta/list/encuesta.component.html @@ -0,0 +1,108 @@ +
+

+ Encuestas + +
+ + + +
+

+ + + + + +
+ No encuestas found +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IDNombreDescripcionFecha CreacionFecha PublicacionFecha FinalizarFecha FinalizadaCalificacionAccesoContrasennaEstadoCategoriaUsuario Extra
+ {{ encuesta.id }} + {{ encuesta.nombre }}{{ encuesta.descripcion }}{{ encuesta.fechaCreacion | formatMediumDatetime }}{{ encuesta.fechaPublicacion | formatMediumDatetime }}{{ encuesta.fechaFinalizar | formatMediumDatetime }}{{ encuesta.fechaFinalizada | formatMediumDatetime }}{{ encuesta.calificacion }}{{ encuesta.acceso }}{{ encuesta.contrasenna }}{{ encuesta.estado }} + + + + +
+ + + + + +
+
+
+
diff --git a/src/main/webapp/app/entities/encuesta/list/encuesta.component.spec.ts b/src/main/webapp/app/entities/encuesta/list/encuesta.component.spec.ts new file mode 100644 index 0000000..9c680e0 --- /dev/null +++ b/src/main/webapp/app/entities/encuesta/list/encuesta.component.spec.ts @@ -0,0 +1,48 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { HttpHeaders, HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { of } from 'rxjs'; + +import { EncuestaService } from '../service/encuesta.service'; + +import { EncuestaComponent } from './encuesta.component'; + +describe('Component Tests', () => { + describe('Encuesta Management Component', () => { + let comp: EncuestaComponent; + let fixture: ComponentFixture; + let service: EncuestaService; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [EncuestaComponent], + }) + .overrideTemplate(EncuestaComponent, '') + .compileComponents(); + + fixture = TestBed.createComponent(EncuestaComponent); + comp = fixture.componentInstance; + service = TestBed.inject(EncuestaService); + + const headers = new HttpHeaders().append('link', 'link;link'); + jest.spyOn(service, 'query').mockReturnValue( + of( + new HttpResponse({ + body: [{ id: 123 }], + headers, + }) + ) + ); + }); + + it('Should call load all on init', () => { + // WHEN + comp.ngOnInit(); + + // THEN + expect(service.query).toHaveBeenCalled(); + expect(comp.encuestas?.[0]).toEqual(expect.objectContaining({ id: 123 })); + }); + }); +}); diff --git a/src/main/webapp/app/entities/encuesta/list/encuesta.component.ts b/src/main/webapp/app/entities/encuesta/list/encuesta.component.ts new file mode 100644 index 0000000..d3dbbb5 --- /dev/null +++ b/src/main/webapp/app/entities/encuesta/list/encuesta.component.ts @@ -0,0 +1,51 @@ +import { Component, OnInit } from '@angular/core'; +import { HttpResponse } from '@angular/common/http'; +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; + +import { IEncuesta } from '../encuesta.model'; +import { EncuestaService } from '../service/encuesta.service'; +import { EncuestaDeleteDialogComponent } from '../delete/encuesta-delete-dialog.component'; + +@Component({ + selector: 'jhi-encuesta', + templateUrl: './encuesta.component.html', +}) +export class EncuestaComponent implements OnInit { + encuestas?: IEncuesta[]; + isLoading = false; + + constructor(protected encuestaService: EncuestaService, protected modalService: NgbModal) {} + + loadAll(): void { + this.isLoading = true; + + this.encuestaService.query().subscribe( + (res: HttpResponse) => { + this.isLoading = false; + this.encuestas = res.body ?? []; + }, + () => { + this.isLoading = false; + } + ); + } + + ngOnInit(): void { + this.loadAll(); + } + + trackId(index: number, item: IEncuesta): number { + return item.id!; + } + + delete(encuesta: IEncuesta): void { + const modalRef = this.modalService.open(EncuestaDeleteDialogComponent, { size: 'lg', backdrop: 'static' }); + modalRef.componentInstance.encuesta = encuesta; + // unsubscribe not needed because closed completes on modal close + modalRef.closed.subscribe(reason => { + if (reason === 'deleted') { + this.loadAll(); + } + }); + } +} diff --git a/src/main/webapp/app/entities/encuesta/route/encuesta-routing-resolve.service.spec.ts b/src/main/webapp/app/entities/encuesta/route/encuesta-routing-resolve.service.spec.ts new file mode 100644 index 0000000..c658abb --- /dev/null +++ b/src/main/webapp/app/entities/encuesta/route/encuesta-routing-resolve.service.spec.ts @@ -0,0 +1,82 @@ +jest.mock('@angular/router'); + +import { TestBed } from '@angular/core/testing'; +import { HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { ActivatedRouteSnapshot, Router } from '@angular/router'; +import { of } from 'rxjs'; + +import { IEncuesta, Encuesta } from '../encuesta.model'; +import { EncuestaService } from '../service/encuesta.service'; + +import { EncuestaRoutingResolveService } from './encuesta-routing-resolve.service'; + +describe('Service Tests', () => { + describe('Encuesta routing resolve service', () => { + let mockRouter: Router; + let mockActivatedRouteSnapshot: ActivatedRouteSnapshot; + let routingResolveService: EncuestaRoutingResolveService; + let service: EncuestaService; + let resultEncuesta: IEncuesta | undefined; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [Router, ActivatedRouteSnapshot], + }); + mockRouter = TestBed.inject(Router); + mockActivatedRouteSnapshot = TestBed.inject(ActivatedRouteSnapshot); + routingResolveService = TestBed.inject(EncuestaRoutingResolveService); + service = TestBed.inject(EncuestaService); + resultEncuesta = undefined; + }); + + describe('resolve', () => { + it('should return IEncuesta returned by find', () => { + // GIVEN + service.find = jest.fn(id => of(new HttpResponse({ body: { id } }))); + mockActivatedRouteSnapshot.params = { id: 123 }; + + // WHEN + routingResolveService.resolve(mockActivatedRouteSnapshot).subscribe(result => { + resultEncuesta = result; + }); + + // THEN + expect(service.find).toBeCalledWith(123); + expect(resultEncuesta).toEqual({ id: 123 }); + }); + + it('should return new IEncuesta if id is not provided', () => { + // GIVEN + service.find = jest.fn(); + mockActivatedRouteSnapshot.params = {}; + + // WHEN + routingResolveService.resolve(mockActivatedRouteSnapshot).subscribe(result => { + resultEncuesta = result; + }); + + // THEN + expect(service.find).not.toBeCalled(); + expect(resultEncuesta).toEqual(new Encuesta()); + }); + + it('should route to 404 page if data not found in server', () => { + // GIVEN + jest.spyOn(service, 'find').mockReturnValue(of(new HttpResponse({ body: null as unknown as Encuesta }))); + mockActivatedRouteSnapshot.params = { id: 123 }; + + // WHEN + routingResolveService.resolve(mockActivatedRouteSnapshot).subscribe(result => { + resultEncuesta = result; + }); + + // THEN + expect(service.find).toBeCalledWith(123); + expect(resultEncuesta).toEqual(undefined); + expect(mockRouter.navigate).toHaveBeenCalledWith(['404']); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/encuesta/route/encuesta-routing-resolve.service.ts b/src/main/webapp/app/entities/encuesta/route/encuesta-routing-resolve.service.ts new file mode 100644 index 0000000..21176c6 --- /dev/null +++ b/src/main/webapp/app/entities/encuesta/route/encuesta-routing-resolve.service.ts @@ -0,0 +1,30 @@ +import { Injectable } from '@angular/core'; +import { HttpResponse } from '@angular/common/http'; +import { Resolve, ActivatedRouteSnapshot, Router } from '@angular/router'; +import { Observable, of, EMPTY } from 'rxjs'; +import { mergeMap } from 'rxjs/operators'; + +import { IEncuesta, Encuesta } from '../encuesta.model'; +import { EncuestaService } from '../service/encuesta.service'; + +@Injectable({ providedIn: 'root' }) +export class EncuestaRoutingResolveService implements Resolve { + constructor(protected service: EncuestaService, protected router: Router) {} + + resolve(route: ActivatedRouteSnapshot): Observable | Observable { + const id = route.params['id']; + if (id) { + return this.service.find(id).pipe( + mergeMap((encuesta: HttpResponse) => { + if (encuesta.body) { + return of(encuesta.body); + } else { + this.router.navigate(['404']); + return EMPTY; + } + }) + ); + } + return of(new Encuesta()); + } +} diff --git a/src/main/webapp/app/entities/encuesta/route/encuesta-routing.module.ts b/src/main/webapp/app/entities/encuesta/route/encuesta-routing.module.ts new file mode 100644 index 0000000..56c3558 --- /dev/null +++ b/src/main/webapp/app/entities/encuesta/route/encuesta-routing.module.ts @@ -0,0 +1,46 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; + +import { UserRouteAccessService } from 'app/core/auth/user-route-access.service'; +import { EncuestaComponent } from '../list/encuesta.component'; +import { EncuestaDetailComponent } from '../detail/encuesta-detail.component'; +import { EncuestaUpdateComponent } from '../update/encuesta-update.component'; +import { EncuestaRoutingResolveService } from './encuesta-routing-resolve.service'; + +const encuestaRoute: Routes = [ + { + path: '', + component: EncuestaComponent, + canActivate: [UserRouteAccessService], + }, + { + path: ':id/view', + component: EncuestaDetailComponent, + resolve: { + encuesta: EncuestaRoutingResolveService, + }, + canActivate: [UserRouteAccessService], + }, + { + path: 'new', + component: EncuestaUpdateComponent, + resolve: { + encuesta: EncuestaRoutingResolveService, + }, + canActivate: [UserRouteAccessService], + }, + { + path: ':id/edit', + component: EncuestaUpdateComponent, + resolve: { + encuesta: EncuestaRoutingResolveService, + }, + canActivate: [UserRouteAccessService], + }, +]; + +@NgModule({ + imports: [RouterModule.forChild(encuestaRoute)], + exports: [RouterModule], +}) +export class EncuestaRoutingModule {} diff --git a/src/main/webapp/app/entities/encuesta/service/encuesta.service.spec.ts b/src/main/webapp/app/entities/encuesta/service/encuesta.service.spec.ts new file mode 100644 index 0000000..8bef273 --- /dev/null +++ b/src/main/webapp/app/entities/encuesta/service/encuesta.service.spec.ts @@ -0,0 +1,264 @@ +import { TestBed } from '@angular/core/testing'; +import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; +import * as dayjs from 'dayjs'; + +import { DATE_TIME_FORMAT } from 'app/config/input.constants'; +import { AccesoEncuesta } from 'app/entities/enumerations/acceso-encuesta.model'; +import { EstadoEncuesta } from 'app/entities/enumerations/estado-encuesta.model'; +import { IEncuesta, Encuesta } from '../encuesta.model'; + +import { EncuestaService } from './encuesta.service'; + +describe('Service Tests', () => { + describe('Encuesta Service', () => { + let service: EncuestaService; + let httpMock: HttpTestingController; + let elemDefault: IEncuesta; + let expectedResult: IEncuesta | IEncuesta[] | boolean | null; + let currentDate: dayjs.Dayjs; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + }); + expectedResult = null; + service = TestBed.inject(EncuestaService); + httpMock = TestBed.inject(HttpTestingController); + currentDate = dayjs(); + + elemDefault = { + id: 0, + nombre: 'AAAAAAA', + descripcion: 'AAAAAAA', + fechaCreacion: currentDate, + fechaPublicacion: currentDate, + fechaFinalizar: currentDate, + fechaFinalizada: currentDate, + calificacion: 0, + acceso: AccesoEncuesta.PUBLIC, + contrasenna: 'AAAAAAA', + estado: EstadoEncuesta.DRAFT, + }; + }); + + describe('Service methods', () => { + it('should find an element', () => { + const returnedFromService = Object.assign( + { + fechaCreacion: currentDate.format(DATE_TIME_FORMAT), + fechaPublicacion: currentDate.format(DATE_TIME_FORMAT), + fechaFinalizar: currentDate.format(DATE_TIME_FORMAT), + fechaFinalizada: currentDate.format(DATE_TIME_FORMAT), + }, + elemDefault + ); + + service.find(123).subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'GET' }); + req.flush(returnedFromService); + expect(expectedResult).toMatchObject(elemDefault); + }); + + it('should create a Encuesta', () => { + const returnedFromService = Object.assign( + { + id: 0, + fechaCreacion: currentDate.format(DATE_TIME_FORMAT), + fechaPublicacion: currentDate.format(DATE_TIME_FORMAT), + fechaFinalizar: currentDate.format(DATE_TIME_FORMAT), + fechaFinalizada: currentDate.format(DATE_TIME_FORMAT), + }, + elemDefault + ); + + const expected = Object.assign( + { + fechaCreacion: currentDate, + fechaPublicacion: currentDate, + fechaFinalizar: currentDate, + fechaFinalizada: currentDate, + }, + returnedFromService + ); + + service.create(new Encuesta()).subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'POST' }); + req.flush(returnedFromService); + expect(expectedResult).toMatchObject(expected); + }); + + it('should update a Encuesta', () => { + const returnedFromService = Object.assign( + { + id: 1, + nombre: 'BBBBBB', + descripcion: 'BBBBBB', + fechaCreacion: currentDate.format(DATE_TIME_FORMAT), + fechaPublicacion: currentDate.format(DATE_TIME_FORMAT), + fechaFinalizar: currentDate.format(DATE_TIME_FORMAT), + fechaFinalizada: currentDate.format(DATE_TIME_FORMAT), + calificacion: 1, + acceso: 'BBBBBB', + contrasenna: 'BBBBBB', + estado: 'BBBBBB', + }, + elemDefault + ); + + const expected = Object.assign( + { + fechaCreacion: currentDate, + fechaPublicacion: currentDate, + fechaFinalizar: currentDate, + fechaFinalizada: currentDate, + }, + returnedFromService + ); + + service.update(expected).subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'PUT' }); + req.flush(returnedFromService); + expect(expectedResult).toMatchObject(expected); + }); + + it('should partial update a Encuesta', () => { + const patchObject = Object.assign( + { + nombre: 'BBBBBB', + descripcion: 'BBBBBB', + fechaCreacion: currentDate.format(DATE_TIME_FORMAT), + fechaPublicacion: currentDate.format(DATE_TIME_FORMAT), + }, + new Encuesta() + ); + + const returnedFromService = Object.assign(patchObject, elemDefault); + + const expected = Object.assign( + { + fechaCreacion: currentDate, + fechaPublicacion: currentDate, + fechaFinalizar: currentDate, + fechaFinalizada: currentDate, + }, + returnedFromService + ); + + service.partialUpdate(patchObject).subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'PATCH' }); + req.flush(returnedFromService); + expect(expectedResult).toMatchObject(expected); + }); + + it('should return a list of Encuesta', () => { + const returnedFromService = Object.assign( + { + id: 1, + nombre: 'BBBBBB', + descripcion: 'BBBBBB', + fechaCreacion: currentDate.format(DATE_TIME_FORMAT), + fechaPublicacion: currentDate.format(DATE_TIME_FORMAT), + fechaFinalizar: currentDate.format(DATE_TIME_FORMAT), + fechaFinalizada: currentDate.format(DATE_TIME_FORMAT), + calificacion: 1, + acceso: 'BBBBBB', + contrasenna: 'BBBBBB', + estado: 'BBBBBB', + }, + elemDefault + ); + + const expected = Object.assign( + { + fechaCreacion: currentDate, + fechaPublicacion: currentDate, + fechaFinalizar: currentDate, + fechaFinalizada: currentDate, + }, + returnedFromService + ); + + service.query().subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'GET' }); + req.flush([returnedFromService]); + httpMock.verify(); + expect(expectedResult).toContainEqual(expected); + }); + + it('should delete a Encuesta', () => { + service.delete(123).subscribe(resp => (expectedResult = resp.ok)); + + const req = httpMock.expectOne({ method: 'DELETE' }); + req.flush({ status: 200 }); + expect(expectedResult); + }); + + describe('addEncuestaToCollectionIfMissing', () => { + it('should add a Encuesta to an empty array', () => { + const encuesta: IEncuesta = { id: 123 }; + expectedResult = service.addEncuestaToCollectionIfMissing([], encuesta); + expect(expectedResult).toHaveLength(1); + expect(expectedResult).toContain(encuesta); + }); + + it('should not add a Encuesta to an array that contains it', () => { + const encuesta: IEncuesta = { id: 123 }; + const encuestaCollection: IEncuesta[] = [ + { + ...encuesta, + }, + { id: 456 }, + ]; + expectedResult = service.addEncuestaToCollectionIfMissing(encuestaCollection, encuesta); + expect(expectedResult).toHaveLength(2); + }); + + it("should add a Encuesta to an array that doesn't contain it", () => { + const encuesta: IEncuesta = { id: 123 }; + const encuestaCollection: IEncuesta[] = [{ id: 456 }]; + expectedResult = service.addEncuestaToCollectionIfMissing(encuestaCollection, encuesta); + expect(expectedResult).toHaveLength(2); + expect(expectedResult).toContain(encuesta); + }); + + it('should add only unique Encuesta to an array', () => { + const encuestaArray: IEncuesta[] = [{ id: 123 }, { id: 456 }, { id: 68819 }]; + const encuestaCollection: IEncuesta[] = [{ id: 123 }]; + expectedResult = service.addEncuestaToCollectionIfMissing(encuestaCollection, ...encuestaArray); + expect(expectedResult).toHaveLength(3); + }); + + it('should accept varargs', () => { + const encuesta: IEncuesta = { id: 123 }; + const encuesta2: IEncuesta = { id: 456 }; + expectedResult = service.addEncuestaToCollectionIfMissing([], encuesta, encuesta2); + expect(expectedResult).toHaveLength(2); + expect(expectedResult).toContain(encuesta); + expect(expectedResult).toContain(encuesta2); + }); + + it('should accept null and undefined values', () => { + const encuesta: IEncuesta = { id: 123 }; + expectedResult = service.addEncuestaToCollectionIfMissing([], null, encuesta, undefined); + expect(expectedResult).toHaveLength(1); + expect(expectedResult).toContain(encuesta); + }); + + it('should return initial array if no Encuesta is added', () => { + const encuestaCollection: IEncuesta[] = [{ id: 123 }]; + expectedResult = service.addEncuestaToCollectionIfMissing(encuestaCollection, undefined, null); + expect(expectedResult).toEqual(encuestaCollection); + }); + }); + }); + + afterEach(() => { + httpMock.verify(); + }); + }); +}); diff --git a/src/main/webapp/app/entities/encuesta/service/encuesta.service.ts b/src/main/webapp/app/entities/encuesta/service/encuesta.service.ts new file mode 100644 index 0000000..ef95403 --- /dev/null +++ b/src/main/webapp/app/entities/encuesta/service/encuesta.service.ts @@ -0,0 +1,106 @@ +import { Injectable } from '@angular/core'; +import { HttpClient, HttpResponse } from '@angular/common/http'; +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; +import * as dayjs from 'dayjs'; + +import { isPresent } from 'app/core/util/operators'; +import { ApplicationConfigService } from 'app/core/config/application-config.service'; +import { createRequestOption } from 'app/core/request/request-util'; +import { IEncuesta, getEncuestaIdentifier } from '../encuesta.model'; + +export type EntityResponseType = HttpResponse; +export type EntityArrayResponseType = HttpResponse; + +@Injectable({ providedIn: 'root' }) +export class EncuestaService { + protected resourceUrl = this.applicationConfigService.getEndpointFor('api/encuestas'); + + constructor(protected http: HttpClient, protected applicationConfigService: ApplicationConfigService) {} + + create(encuesta: IEncuesta): Observable { + const copy = this.convertDateFromClient(encuesta); + return this.http + .post(this.resourceUrl, copy, { observe: 'response' }) + .pipe(map((res: EntityResponseType) => this.convertDateFromServer(res))); + } + + update(encuesta: IEncuesta): Observable { + const copy = this.convertDateFromClient(encuesta); + return this.http + .put(`${this.resourceUrl}/${getEncuestaIdentifier(encuesta) as number}`, copy, { observe: 'response' }) + .pipe(map((res: EntityResponseType) => this.convertDateFromServer(res))); + } + + partialUpdate(encuesta: IEncuesta): Observable { + const copy = this.convertDateFromClient(encuesta); + return this.http + .patch(`${this.resourceUrl}/${getEncuestaIdentifier(encuesta) as number}`, copy, { observe: 'response' }) + .pipe(map((res: EntityResponseType) => this.convertDateFromServer(res))); + } + + find(id: number): Observable { + return this.http + .get(`${this.resourceUrl}/${id}`, { observe: 'response' }) + .pipe(map((res: EntityResponseType) => this.convertDateFromServer(res))); + } + + query(req?: any): Observable { + const options = createRequestOption(req); + return this.http + .get(this.resourceUrl, { params: options, observe: 'response' }) + .pipe(map((res: EntityArrayResponseType) => this.convertDateArrayFromServer(res))); + } + + delete(id: number): Observable> { + return this.http.delete(`${this.resourceUrl}/${id}`, { observe: 'response' }); + } + + addEncuestaToCollectionIfMissing(encuestaCollection: IEncuesta[], ...encuestasToCheck: (IEncuesta | null | undefined)[]): IEncuesta[] { + const encuestas: IEncuesta[] = encuestasToCheck.filter(isPresent); + if (encuestas.length > 0) { + const encuestaCollectionIdentifiers = encuestaCollection.map(encuestaItem => getEncuestaIdentifier(encuestaItem)!); + const encuestasToAdd = encuestas.filter(encuestaItem => { + const encuestaIdentifier = getEncuestaIdentifier(encuestaItem); + if (encuestaIdentifier == null || encuestaCollectionIdentifiers.includes(encuestaIdentifier)) { + return false; + } + encuestaCollectionIdentifiers.push(encuestaIdentifier); + return true; + }); + return [...encuestasToAdd, ...encuestaCollection]; + } + return encuestaCollection; + } + + protected convertDateFromClient(encuesta: IEncuesta): IEncuesta { + return Object.assign({}, encuesta, { + fechaCreacion: encuesta.fechaCreacion?.isValid() ? encuesta.fechaCreacion.toJSON() : undefined, + fechaPublicacion: encuesta.fechaPublicacion?.isValid() ? encuesta.fechaPublicacion.toJSON() : undefined, + fechaFinalizar: encuesta.fechaFinalizar?.isValid() ? encuesta.fechaFinalizar.toJSON() : undefined, + fechaFinalizada: encuesta.fechaFinalizada?.isValid() ? encuesta.fechaFinalizada.toJSON() : undefined, + }); + } + + protected convertDateFromServer(res: EntityResponseType): EntityResponseType { + if (res.body) { + res.body.fechaCreacion = res.body.fechaCreacion ? dayjs(res.body.fechaCreacion) : undefined; + res.body.fechaPublicacion = res.body.fechaPublicacion ? dayjs(res.body.fechaPublicacion) : undefined; + res.body.fechaFinalizar = res.body.fechaFinalizar ? dayjs(res.body.fechaFinalizar) : undefined; + res.body.fechaFinalizada = res.body.fechaFinalizada ? dayjs(res.body.fechaFinalizada) : undefined; + } + return res; + } + + protected convertDateArrayFromServer(res: EntityArrayResponseType): EntityArrayResponseType { + if (res.body) { + res.body.forEach((encuesta: IEncuesta) => { + encuesta.fechaCreacion = encuesta.fechaCreacion ? dayjs(encuesta.fechaCreacion) : undefined; + encuesta.fechaPublicacion = encuesta.fechaPublicacion ? dayjs(encuesta.fechaPublicacion) : undefined; + encuesta.fechaFinalizar = encuesta.fechaFinalizar ? dayjs(encuesta.fechaFinalizar) : undefined; + encuesta.fechaFinalizada = encuesta.fechaFinalizada ? dayjs(encuesta.fechaFinalizada) : undefined; + }); + } + return res; + } +} diff --git a/src/main/webapp/app/entities/encuesta/update/encuesta-update.component.html b/src/main/webapp/app/entities/encuesta/update/encuesta-update.component.html new file mode 100644 index 0000000..f097553 --- /dev/null +++ b/src/main/webapp/app/entities/encuesta/update/encuesta-update.component.html @@ -0,0 +1,262 @@ +
+
+
+

+ Create or edit a Encuesta +

+ +
+ + +
+ + +
+ +
+ + +
+ + This field is required. + + + This field is required to be at least 1 characters. + + + This field cannot be longer than 50 characters. + +
+
+ +
+ + +
+ +
+ +
+ +
+
+ + This field is required. + + + This field should be a date and time. + +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ + +
+ + This field is required. + + + This field should be a number. + +
+
+ +
+ + +
+ + This field is required. + +
+
+ +
+ + +
+ +
+ + +
+ + This field is required. + +
+
+ +
+ + +
+ +
+ + +
+
+ +
+ + + +
+
+
+
diff --git a/src/main/webapp/app/entities/encuesta/update/encuesta-update.component.spec.ts b/src/main/webapp/app/entities/encuesta/update/encuesta-update.component.spec.ts new file mode 100644 index 0000000..2003942 --- /dev/null +++ b/src/main/webapp/app/entities/encuesta/update/encuesta-update.component.spec.ts @@ -0,0 +1,186 @@ +jest.mock('@angular/router'); + +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { FormBuilder } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; +import { of, Subject } from 'rxjs'; + +import { EncuestaService } from '../service/encuesta.service'; +import { IEncuesta, Encuesta } from '../encuesta.model'; +import { ICategoria } from 'app/entities/categoria/categoria.model'; +import { CategoriaService } from 'app/entities/categoria/service/categoria.service'; +import { IUsuarioExtra } from 'app/entities/usuario-extra/usuario-extra.model'; +import { UsuarioExtraService } from 'app/entities/usuario-extra/service/usuario-extra.service'; + +import { EncuestaUpdateComponent } from './encuesta-update.component'; + +describe('Component Tests', () => { + describe('Encuesta Management Update Component', () => { + let comp: EncuestaUpdateComponent; + let fixture: ComponentFixture; + let activatedRoute: ActivatedRoute; + let encuestaService: EncuestaService; + let categoriaService: CategoriaService; + let usuarioExtraService: UsuarioExtraService; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [EncuestaUpdateComponent], + providers: [FormBuilder, ActivatedRoute], + }) + .overrideTemplate(EncuestaUpdateComponent, '') + .compileComponents(); + + fixture = TestBed.createComponent(EncuestaUpdateComponent); + activatedRoute = TestBed.inject(ActivatedRoute); + encuestaService = TestBed.inject(EncuestaService); + categoriaService = TestBed.inject(CategoriaService); + usuarioExtraService = TestBed.inject(UsuarioExtraService); + + comp = fixture.componentInstance; + }); + + describe('ngOnInit', () => { + it('Should call Categoria query and add missing value', () => { + const encuesta: IEncuesta = { id: 456 }; + const categoria: ICategoria = { id: 88802 }; + encuesta.categoria = categoria; + + const categoriaCollection: ICategoria[] = [{ id: 15790 }]; + jest.spyOn(categoriaService, 'query').mockReturnValue(of(new HttpResponse({ body: categoriaCollection }))); + const additionalCategorias = [categoria]; + const expectedCollection: ICategoria[] = [...additionalCategorias, ...categoriaCollection]; + jest.spyOn(categoriaService, 'addCategoriaToCollectionIfMissing').mockReturnValue(expectedCollection); + + activatedRoute.data = of({ encuesta }); + comp.ngOnInit(); + + expect(categoriaService.query).toHaveBeenCalled(); + expect(categoriaService.addCategoriaToCollectionIfMissing).toHaveBeenCalledWith(categoriaCollection, ...additionalCategorias); + expect(comp.categoriasSharedCollection).toEqual(expectedCollection); + }); + + it('Should call UsuarioExtra query and add missing value', () => { + const encuesta: IEncuesta = { id: 456 }; + const usuarioExtra: IUsuarioExtra = { id: 83581 }; + encuesta.usuarioExtra = usuarioExtra; + + const usuarioExtraCollection: IUsuarioExtra[] = [{ id: 89078 }]; + jest.spyOn(usuarioExtraService, 'query').mockReturnValue(of(new HttpResponse({ body: usuarioExtraCollection }))); + const additionalUsuarioExtras = [usuarioExtra]; + const expectedCollection: IUsuarioExtra[] = [...additionalUsuarioExtras, ...usuarioExtraCollection]; + jest.spyOn(usuarioExtraService, 'addUsuarioExtraToCollectionIfMissing').mockReturnValue(expectedCollection); + + activatedRoute.data = of({ encuesta }); + comp.ngOnInit(); + + expect(usuarioExtraService.query).toHaveBeenCalled(); + expect(usuarioExtraService.addUsuarioExtraToCollectionIfMissing).toHaveBeenCalledWith( + usuarioExtraCollection, + ...additionalUsuarioExtras + ); + expect(comp.usuarioExtrasSharedCollection).toEqual(expectedCollection); + }); + + it('Should update editForm', () => { + const encuesta: IEncuesta = { id: 456 }; + const categoria: ICategoria = { id: 7805 }; + encuesta.categoria = categoria; + const usuarioExtra: IUsuarioExtra = { id: 34590 }; + encuesta.usuarioExtra = usuarioExtra; + + activatedRoute.data = of({ encuesta }); + comp.ngOnInit(); + + expect(comp.editForm.value).toEqual(expect.objectContaining(encuesta)); + expect(comp.categoriasSharedCollection).toContain(categoria); + expect(comp.usuarioExtrasSharedCollection).toContain(usuarioExtra); + }); + }); + + describe('save', () => { + it('Should call update service on save for existing entity', () => { + // GIVEN + const saveSubject = new Subject>(); + const encuesta = { id: 123 }; + jest.spyOn(encuestaService, 'update').mockReturnValue(saveSubject); + jest.spyOn(comp, 'previousState'); + activatedRoute.data = of({ encuesta }); + comp.ngOnInit(); + + // WHEN + comp.save(); + expect(comp.isSaving).toEqual(true); + saveSubject.next(new HttpResponse({ body: encuesta })); + saveSubject.complete(); + + // THEN + expect(comp.previousState).toHaveBeenCalled(); + expect(encuestaService.update).toHaveBeenCalledWith(encuesta); + expect(comp.isSaving).toEqual(false); + }); + + it('Should call create service on save for new entity', () => { + // GIVEN + const saveSubject = new Subject>(); + const encuesta = new Encuesta(); + jest.spyOn(encuestaService, 'create').mockReturnValue(saveSubject); + jest.spyOn(comp, 'previousState'); + activatedRoute.data = of({ encuesta }); + comp.ngOnInit(); + + // WHEN + comp.save(); + expect(comp.isSaving).toEqual(true); + saveSubject.next(new HttpResponse({ body: encuesta })); + saveSubject.complete(); + + // THEN + expect(encuestaService.create).toHaveBeenCalledWith(encuesta); + expect(comp.isSaving).toEqual(false); + expect(comp.previousState).toHaveBeenCalled(); + }); + + it('Should set isSaving to false on error', () => { + // GIVEN + const saveSubject = new Subject>(); + const encuesta = { id: 123 }; + jest.spyOn(encuestaService, 'update').mockReturnValue(saveSubject); + jest.spyOn(comp, 'previousState'); + activatedRoute.data = of({ encuesta }); + comp.ngOnInit(); + + // WHEN + comp.save(); + expect(comp.isSaving).toEqual(true); + saveSubject.error('This is an error!'); + + // THEN + expect(encuestaService.update).toHaveBeenCalledWith(encuesta); + expect(comp.isSaving).toEqual(false); + expect(comp.previousState).not.toHaveBeenCalled(); + }); + }); + + describe('Tracking relationships identifiers', () => { + describe('trackCategoriaById', () => { + it('Should return tracked Categoria primary key', () => { + const entity = { id: 123 }; + const trackResult = comp.trackCategoriaById(0, entity); + expect(trackResult).toEqual(entity.id); + }); + }); + + describe('trackUsuarioExtraById', () => { + it('Should return tracked UsuarioExtra primary key', () => { + const entity = { id: 123 }; + const trackResult = comp.trackUsuarioExtraById(0, entity); + expect(trackResult).toEqual(entity.id); + }); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/encuesta/update/encuesta-update.component.ts b/src/main/webapp/app/entities/encuesta/update/encuesta-update.component.ts new file mode 100644 index 0000000..1f9b2ee --- /dev/null +++ b/src/main/webapp/app/entities/encuesta/update/encuesta-update.component.ts @@ -0,0 +1,184 @@ +import { Component, OnInit } from '@angular/core'; +import { HttpResponse } from '@angular/common/http'; +import { FormBuilder, Validators } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; +import { Observable } from 'rxjs'; +import { finalize, map } from 'rxjs/operators'; + +import * as dayjs from 'dayjs'; +import { DATE_TIME_FORMAT } from 'app/config/input.constants'; + +import { IEncuesta, Encuesta } from '../encuesta.model'; +import { EncuestaService } from '../service/encuesta.service'; +import { ICategoria } from 'app/entities/categoria/categoria.model'; +import { CategoriaService } from 'app/entities/categoria/service/categoria.service'; +import { IUsuarioExtra } from 'app/entities/usuario-extra/usuario-extra.model'; +import { UsuarioExtraService } from 'app/entities/usuario-extra/service/usuario-extra.service'; + +@Component({ + selector: 'jhi-encuesta-update', + templateUrl: './encuesta-update.component.html', +}) +export class EncuestaUpdateComponent implements OnInit { + isSaving = false; + + categoriasSharedCollection: ICategoria[] = []; + usuarioExtrasSharedCollection: IUsuarioExtra[] = []; + + editForm = this.fb.group({ + id: [], + nombre: [null, [Validators.required, Validators.minLength(1), Validators.maxLength(50)]], + descripcion: [], + fechaCreacion: [null, [Validators.required]], + fechaPublicacion: [], + fechaFinalizar: [], + fechaFinalizada: [], + calificacion: [null, [Validators.required]], + acceso: [null, [Validators.required]], + contrasenna: [], + estado: [null, [Validators.required]], + categoria: [], + usuarioExtra: [], + }); + + constructor( + protected encuestaService: EncuestaService, + protected categoriaService: CategoriaService, + protected usuarioExtraService: UsuarioExtraService, + protected activatedRoute: ActivatedRoute, + protected fb: FormBuilder + ) {} + + ngOnInit(): void { + this.activatedRoute.data.subscribe(({ encuesta }) => { + if (encuesta.id === undefined) { + const today = dayjs().startOf('day'); + encuesta.fechaCreacion = today; + encuesta.fechaPublicacion = today; + encuesta.fechaFinalizar = today; + encuesta.fechaFinalizada = today; + } + + this.updateForm(encuesta); + + this.loadRelationshipsOptions(); + }); + } + + previousState(): void { + window.history.back(); + } + + save(): void { + this.isSaving = true; + const encuesta = this.createFromForm(); + if (encuesta.id !== undefined) { + this.subscribeToSaveResponse(this.encuestaService.update(encuesta)); + } else { + this.subscribeToSaveResponse(this.encuestaService.create(encuesta)); + } + } + + trackCategoriaById(index: number, item: ICategoria): number { + return item.id!; + } + + trackUsuarioExtraById(index: number, item: IUsuarioExtra): number { + return item.id!; + } + + protected subscribeToSaveResponse(result: Observable>): void { + result.pipe(finalize(() => this.onSaveFinalize())).subscribe( + () => this.onSaveSuccess(), + () => this.onSaveError() + ); + } + + protected onSaveSuccess(): void { + this.previousState(); + } + + protected onSaveError(): void { + // Api for inheritance. + } + + protected onSaveFinalize(): void { + this.isSaving = false; + } + + protected updateForm(encuesta: IEncuesta): void { + this.editForm.patchValue({ + id: encuesta.id, + nombre: encuesta.nombre, + descripcion: encuesta.descripcion, + fechaCreacion: encuesta.fechaCreacion ? encuesta.fechaCreacion.format(DATE_TIME_FORMAT) : null, + fechaPublicacion: encuesta.fechaPublicacion ? encuesta.fechaPublicacion.format(DATE_TIME_FORMAT) : null, + fechaFinalizar: encuesta.fechaFinalizar ? encuesta.fechaFinalizar.format(DATE_TIME_FORMAT) : null, + fechaFinalizada: encuesta.fechaFinalizada ? encuesta.fechaFinalizada.format(DATE_TIME_FORMAT) : null, + calificacion: encuesta.calificacion, + acceso: encuesta.acceso, + contrasenna: encuesta.contrasenna, + estado: encuesta.estado, + categoria: encuesta.categoria, + usuarioExtra: encuesta.usuarioExtra, + }); + + this.categoriasSharedCollection = this.categoriaService.addCategoriaToCollectionIfMissing( + this.categoriasSharedCollection, + encuesta.categoria + ); + this.usuarioExtrasSharedCollection = this.usuarioExtraService.addUsuarioExtraToCollectionIfMissing( + this.usuarioExtrasSharedCollection, + encuesta.usuarioExtra + ); + } + + protected loadRelationshipsOptions(): void { + this.categoriaService + .query() + .pipe(map((res: HttpResponse) => res.body ?? [])) + .pipe( + map((categorias: ICategoria[]) => + this.categoriaService.addCategoriaToCollectionIfMissing(categorias, this.editForm.get('categoria')!.value) + ) + ) + .subscribe((categorias: ICategoria[]) => (this.categoriasSharedCollection = categorias)); + + this.usuarioExtraService + .query() + .pipe(map((res: HttpResponse) => res.body ?? [])) + .pipe( + map((usuarioExtras: IUsuarioExtra[]) => + this.usuarioExtraService.addUsuarioExtraToCollectionIfMissing(usuarioExtras, this.editForm.get('usuarioExtra')!.value) + ) + ) + .subscribe((usuarioExtras: IUsuarioExtra[]) => (this.usuarioExtrasSharedCollection = usuarioExtras)); + } + + protected createFromForm(): IEncuesta { + return { + ...new Encuesta(), + id: this.editForm.get(['id'])!.value, + nombre: this.editForm.get(['nombre'])!.value, + descripcion: this.editForm.get(['descripcion'])!.value, + fechaCreacion: this.editForm.get(['fechaCreacion'])!.value + ? dayjs(this.editForm.get(['fechaCreacion'])!.value, DATE_TIME_FORMAT) + : undefined, + fechaPublicacion: this.editForm.get(['fechaPublicacion'])!.value + ? dayjs(this.editForm.get(['fechaPublicacion'])!.value, DATE_TIME_FORMAT) + : undefined, + fechaFinalizar: this.editForm.get(['fechaFinalizar'])!.value + ? dayjs(this.editForm.get(['fechaFinalizar'])!.value, DATE_TIME_FORMAT) + : undefined, + fechaFinalizada: this.editForm.get(['fechaFinalizada'])!.value + ? dayjs(this.editForm.get(['fechaFinalizada'])!.value, DATE_TIME_FORMAT) + : undefined, + calificacion: this.editForm.get(['calificacion'])!.value, + acceso: this.editForm.get(['acceso'])!.value, + contrasenna: this.editForm.get(['contrasenna'])!.value, + estado: this.editForm.get(['estado'])!.value, + categoria: this.editForm.get(['categoria'])!.value, + usuarioExtra: this.editForm.get(['usuarioExtra'])!.value, + }; + } +} diff --git a/src/main/webapp/app/entities/entity-routing.module.ts b/src/main/webapp/app/entities/entity-routing.module.ts new file mode 100644 index 0000000..eb24fc4 --- /dev/null +++ b/src/main/webapp/app/entities/entity-routing.module.ts @@ -0,0 +1,84 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +@NgModule({ + imports: [ + RouterModule.forChild([ + { + path: 'parametro-aplicacion', + data: { pageTitle: 'dataSurveyApp.parametroAplicacion.home.title' }, + loadChildren: () => import('./parametro-aplicacion/parametro-aplicacion.module').then(m => m.ParametroAplicacionModule), + }, + { + path: 'usuario-extra', + data: { pageTitle: 'dataSurveyApp.usuarioExtra.home.title' }, + loadChildren: () => import('./usuario-extra/usuario-extra.module').then(m => m.UsuarioExtraModule), + }, + { + path: 'encuesta', + data: { pageTitle: 'dataSurveyApp.encuesta.home.title' }, + loadChildren: () => import('./encuesta/encuesta.module').then(m => m.EncuestaModule), + }, + { + path: 'e-pregunta-abierta', + data: { pageTitle: 'dataSurveyApp.ePreguntaAbierta.home.title' }, + loadChildren: () => import('./e-pregunta-abierta/e-pregunta-abierta.module').then(m => m.EPreguntaAbiertaModule), + }, + { + path: 'e-pregunta-abierta-respuesta', + data: { pageTitle: 'dataSurveyApp.ePreguntaAbiertaRespuesta.home.title' }, + loadChildren: () => + import('./e-pregunta-abierta-respuesta/e-pregunta-abierta-respuesta.module').then(m => m.EPreguntaAbiertaRespuestaModule), + }, + { + path: 'e-pregunta-cerrada', + data: { pageTitle: 'dataSurveyApp.ePreguntaCerrada.home.title' }, + loadChildren: () => import('./e-pregunta-cerrada/e-pregunta-cerrada.module').then(m => m.EPreguntaCerradaModule), + }, + { + path: 'e-pregunta-cerrada-opcion', + data: { pageTitle: 'dataSurveyApp.ePreguntaCerradaOpcion.home.title' }, + loadChildren: () => + import('./e-pregunta-cerrada-opcion/e-pregunta-cerrada-opcion.module').then(m => m.EPreguntaCerradaOpcionModule), + }, + { + path: 'usuario-encuesta', + data: { pageTitle: 'dataSurveyApp.usuarioEncuesta.home.title' }, + loadChildren: () => import('./usuario-encuesta/usuario-encuesta.module').then(m => m.UsuarioEncuestaModule), + }, + { + path: 'categoria', + data: { pageTitle: 'dataSurveyApp.categoria.home.title' }, + loadChildren: () => import('./categoria/categoria.module').then(m => m.CategoriaModule), + }, + { + path: 'factura', + data: { pageTitle: 'dataSurveyApp.factura.home.title' }, + loadChildren: () => import('./factura/factura.module').then(m => m.FacturaModule), + }, + { + path: 'plantilla', + data: { pageTitle: 'dataSurveyApp.plantilla.home.title' }, + loadChildren: () => import('./plantilla/plantilla.module').then(m => m.PlantillaModule), + }, + { + path: 'p-pregunta-abierta', + data: { pageTitle: 'dataSurveyApp.pPreguntaAbierta.home.title' }, + loadChildren: () => import('./p-pregunta-abierta/p-pregunta-abierta.module').then(m => m.PPreguntaAbiertaModule), + }, + { + path: 'p-pregunta-cerrada', + data: { pageTitle: 'dataSurveyApp.pPreguntaCerrada.home.title' }, + loadChildren: () => import('./p-pregunta-cerrada/p-pregunta-cerrada.module').then(m => m.PPreguntaCerradaModule), + }, + { + path: 'p-pregunta-cerrada-opcion', + data: { pageTitle: 'dataSurveyApp.pPreguntaCerradaOpcion.home.title' }, + loadChildren: () => + import('./p-pregunta-cerrada-opcion/p-pregunta-cerrada-opcion.module').then(m => m.PPreguntaCerradaOpcionModule), + }, + /* jhipster-needle-add-entity-route - JHipster will add entity modules routes here */ + ]), + ], +}) +export class EntityRoutingModule {} diff --git a/src/main/webapp/app/entities/enumerations/acceso-encuesta.model.ts b/src/main/webapp/app/entities/enumerations/acceso-encuesta.model.ts new file mode 100644 index 0000000..9e14168 --- /dev/null +++ b/src/main/webapp/app/entities/enumerations/acceso-encuesta.model.ts @@ -0,0 +1,5 @@ +export enum AccesoEncuesta { + PUBLIC = 'PUBLIC', + + PRIVATE = 'PRIVATE', +} diff --git a/src/main/webapp/app/entities/enumerations/estado-categoria.model.ts b/src/main/webapp/app/entities/enumerations/estado-categoria.model.ts new file mode 100644 index 0000000..07a4b01 --- /dev/null +++ b/src/main/webapp/app/entities/enumerations/estado-categoria.model.ts @@ -0,0 +1,5 @@ +export enum EstadoCategoria { + ACTIVE = 'ACTIVE', + + INACTIVE = 'INACTIVE', +} diff --git a/src/main/webapp/app/entities/enumerations/estado-colaborador.model.ts b/src/main/webapp/app/entities/enumerations/estado-colaborador.model.ts new file mode 100644 index 0000000..8bfed45 --- /dev/null +++ b/src/main/webapp/app/entities/enumerations/estado-colaborador.model.ts @@ -0,0 +1,5 @@ +export enum EstadoColaborador { + PENDING = 'PENDING', + + ACTIVE = 'ACTIVE', +} diff --git a/src/main/webapp/app/entities/enumerations/estado-encuesta.model.ts b/src/main/webapp/app/entities/enumerations/estado-encuesta.model.ts new file mode 100644 index 0000000..172adb3 --- /dev/null +++ b/src/main/webapp/app/entities/enumerations/estado-encuesta.model.ts @@ -0,0 +1,9 @@ +export enum EstadoEncuesta { + DRAFT = 'DRAFT', + + ACTIVE = 'ACTIVE', + + FINISHED = 'FINISHED', + + DELETED = 'DELETED', +} diff --git a/src/main/webapp/app/entities/enumerations/estado-plantilla.model.ts b/src/main/webapp/app/entities/enumerations/estado-plantilla.model.ts new file mode 100644 index 0000000..d547dd1 --- /dev/null +++ b/src/main/webapp/app/entities/enumerations/estado-plantilla.model.ts @@ -0,0 +1,9 @@ +export enum EstadoPlantilla { + DRAFT = 'DRAFT', + + ACTIVE = 'ACTIVE', + + DELETED = 'DELETED', + + DISABLED = 'DISABLED', +} diff --git a/src/main/webapp/app/entities/enumerations/estado-usuario.model.ts b/src/main/webapp/app/entities/enumerations/estado-usuario.model.ts new file mode 100644 index 0000000..b32dcff --- /dev/null +++ b/src/main/webapp/app/entities/enumerations/estado-usuario.model.ts @@ -0,0 +1,5 @@ +export enum EstadoUsuario { + ACTIVE = 'ACTIVE', + + SUSPENDED = 'SUSPENDED', +} diff --git a/src/main/webapp/app/entities/enumerations/pregunta-cerrada-tipo.model.ts b/src/main/webapp/app/entities/enumerations/pregunta-cerrada-tipo.model.ts new file mode 100644 index 0000000..3a4e571 --- /dev/null +++ b/src/main/webapp/app/entities/enumerations/pregunta-cerrada-tipo.model.ts @@ -0,0 +1,5 @@ +export enum PreguntaCerradaTipo { + SINGLE = 'SINGLE', + + MULTIPLE = 'MULTIPLE', +} diff --git a/src/main/webapp/app/entities/enumerations/rol-colaborador.model.ts b/src/main/webapp/app/entities/enumerations/rol-colaborador.model.ts new file mode 100644 index 0000000..4dcc926 --- /dev/null +++ b/src/main/webapp/app/entities/enumerations/rol-colaborador.model.ts @@ -0,0 +1,5 @@ +export enum RolColaborador { + READ = 'READ', + + WRITE = 'WRITE', +} diff --git a/src/main/webapp/app/entities/factura/delete/factura-delete-dialog.component.html b/src/main/webapp/app/entities/factura/delete/factura-delete-dialog.component.html new file mode 100644 index 0000000..9a3d0a5 --- /dev/null +++ b/src/main/webapp/app/entities/factura/delete/factura-delete-dialog.component.html @@ -0,0 +1,25 @@ +
+ + + + + +
diff --git a/src/main/webapp/app/entities/factura/delete/factura-delete-dialog.component.spec.ts b/src/main/webapp/app/entities/factura/delete/factura-delete-dialog.component.spec.ts new file mode 100644 index 0000000..2287020 --- /dev/null +++ b/src/main/webapp/app/entities/factura/delete/factura-delete-dialog.component.spec.ts @@ -0,0 +1,65 @@ +jest.mock('@ng-bootstrap/ng-bootstrap'); + +import { ComponentFixture, TestBed, inject, fakeAsync, tick } from '@angular/core/testing'; +import { HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { of } from 'rxjs'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; + +import { FacturaService } from '../service/factura.service'; + +import { FacturaDeleteDialogComponent } from './factura-delete-dialog.component'; + +describe('Component Tests', () => { + describe('Factura Management Delete Component', () => { + let comp: FacturaDeleteDialogComponent; + let fixture: ComponentFixture; + let service: FacturaService; + let mockActiveModal: NgbActiveModal; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [FacturaDeleteDialogComponent], + providers: [NgbActiveModal], + }) + .overrideTemplate(FacturaDeleteDialogComponent, '') + .compileComponents(); + fixture = TestBed.createComponent(FacturaDeleteDialogComponent); + comp = fixture.componentInstance; + service = TestBed.inject(FacturaService); + mockActiveModal = TestBed.inject(NgbActiveModal); + }); + + describe('confirmDelete', () => { + it('Should call delete service on confirmDelete', inject( + [], + fakeAsync(() => { + // GIVEN + jest.spyOn(service, 'delete').mockReturnValue(of(new HttpResponse({}))); + + // WHEN + comp.confirmDelete(123); + tick(); + + // THEN + expect(service.delete).toHaveBeenCalledWith(123); + expect(mockActiveModal.close).toHaveBeenCalledWith('deleted'); + }) + )); + + it('Should not call delete service on clear', () => { + // GIVEN + jest.spyOn(service, 'delete'); + + // WHEN + comp.cancel(); + + // THEN + expect(service.delete).not.toHaveBeenCalled(); + expect(mockActiveModal.close).not.toHaveBeenCalled(); + expect(mockActiveModal.dismiss).toHaveBeenCalled(); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/factura/delete/factura-delete-dialog.component.ts b/src/main/webapp/app/entities/factura/delete/factura-delete-dialog.component.ts new file mode 100644 index 0000000..67d6ce1 --- /dev/null +++ b/src/main/webapp/app/entities/factura/delete/factura-delete-dialog.component.ts @@ -0,0 +1,24 @@ +import { Component } from '@angular/core'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; + +import { IFactura } from '../factura.model'; +import { FacturaService } from '../service/factura.service'; + +@Component({ + templateUrl: './factura-delete-dialog.component.html', +}) +export class FacturaDeleteDialogComponent { + factura?: IFactura; + + constructor(protected facturaService: FacturaService, protected activeModal: NgbActiveModal) {} + + cancel(): void { + this.activeModal.dismiss(); + } + + confirmDelete(id: number): void { + this.facturaService.delete(id).subscribe(() => { + this.activeModal.close('deleted'); + }); + } +} diff --git a/src/main/webapp/app/entities/factura/detail/factura-detail.component.html b/src/main/webapp/app/entities/factura/detail/factura-detail.component.html new file mode 100644 index 0000000..6ff9a0b --- /dev/null +++ b/src/main/webapp/app/entities/factura/detail/factura-detail.component.html @@ -0,0 +1,44 @@ +
+
+
+

Factura

+ +
+ + + + + +
+
ID
+
+ {{ factura.id }} +
+
Nombre Usuario
+
+ {{ factura.nombreUsuario }} +
+
Nombre Plantilla
+
+ {{ factura.nombrePlantilla }} +
+
Costo
+
+ {{ factura.costo }} +
+
Fecha
+
+ {{ factura.fecha | formatMediumDatetime }} +
+
+ + + + +
+
+
diff --git a/src/main/webapp/app/entities/factura/detail/factura-detail.component.spec.ts b/src/main/webapp/app/entities/factura/detail/factura-detail.component.spec.ts new file mode 100644 index 0000000..b22e1bc --- /dev/null +++ b/src/main/webapp/app/entities/factura/detail/factura-detail.component.spec.ts @@ -0,0 +1,38 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { ActivatedRoute } from '@angular/router'; +import { of } from 'rxjs'; + +import { FacturaDetailComponent } from './factura-detail.component'; + +describe('Component Tests', () => { + describe('Factura Management Detail Component', () => { + let comp: FacturaDetailComponent; + let fixture: ComponentFixture; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [FacturaDetailComponent], + providers: [ + { + provide: ActivatedRoute, + useValue: { data: of({ factura: { id: 123 } }) }, + }, + ], + }) + .overrideTemplate(FacturaDetailComponent, '') + .compileComponents(); + fixture = TestBed.createComponent(FacturaDetailComponent); + comp = fixture.componentInstance; + }); + + describe('OnInit', () => { + it('Should load factura on init', () => { + // WHEN + comp.ngOnInit(); + + // THEN + expect(comp.factura).toEqual(expect.objectContaining({ id: 123 })); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/factura/detail/factura-detail.component.ts b/src/main/webapp/app/entities/factura/detail/factura-detail.component.ts new file mode 100644 index 0000000..bef0e33 --- /dev/null +++ b/src/main/webapp/app/entities/factura/detail/factura-detail.component.ts @@ -0,0 +1,24 @@ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; + +import { IFactura } from '../factura.model'; + +@Component({ + selector: 'jhi-factura-detail', + templateUrl: './factura-detail.component.html', +}) +export class FacturaDetailComponent implements OnInit { + factura: IFactura | null = null; + + constructor(protected activatedRoute: ActivatedRoute) {} + + ngOnInit(): void { + this.activatedRoute.data.subscribe(({ factura }) => { + this.factura = factura; + }); + } + + previousState(): void { + window.history.back(); + } +} diff --git a/src/main/webapp/app/entities/factura/factura.model.ts b/src/main/webapp/app/entities/factura/factura.model.ts new file mode 100644 index 0000000..9cd7e4b --- /dev/null +++ b/src/main/webapp/app/entities/factura/factura.model.ts @@ -0,0 +1,23 @@ +import * as dayjs from 'dayjs'; + +export interface IFactura { + id?: number; + nombreUsuario?: string; + nombrePlantilla?: string; + costo?: number; + fecha?: dayjs.Dayjs; +} + +export class Factura implements IFactura { + constructor( + public id?: number, + public nombreUsuario?: string, + public nombrePlantilla?: string, + public costo?: number, + public fecha?: dayjs.Dayjs + ) {} +} + +export function getFacturaIdentifier(factura: IFactura): number | undefined { + return factura.id; +} diff --git a/src/main/webapp/app/entities/factura/factura.module.ts b/src/main/webapp/app/entities/factura/factura.module.ts new file mode 100644 index 0000000..06b979f --- /dev/null +++ b/src/main/webapp/app/entities/factura/factura.module.ts @@ -0,0 +1,14 @@ +import { NgModule } from '@angular/core'; +import { SharedModule } from 'app/shared/shared.module'; +import { FacturaComponent } from './list/factura.component'; +import { FacturaDetailComponent } from './detail/factura-detail.component'; +import { FacturaUpdateComponent } from './update/factura-update.component'; +import { FacturaDeleteDialogComponent } from './delete/factura-delete-dialog.component'; +import { FacturaRoutingModule } from './route/factura-routing.module'; + +@NgModule({ + imports: [SharedModule, FacturaRoutingModule], + declarations: [FacturaComponent, FacturaDetailComponent, FacturaUpdateComponent, FacturaDeleteDialogComponent], + entryComponents: [FacturaDeleteDialogComponent], +}) +export class FacturaModule {} diff --git a/src/main/webapp/app/entities/factura/list/factura.component.html b/src/main/webapp/app/entities/factura/list/factura.component.html new file mode 100644 index 0000000..d847480 --- /dev/null +++ b/src/main/webapp/app/entities/factura/list/factura.component.html @@ -0,0 +1,84 @@ +
+

+ Facturas + +
+ + + +
+

+ + + + + +
+ No facturas found +
+ +
+ + + + + + + + + + + + + + + + + + + + + +
IDNombre UsuarioNombre PlantillaCostoFecha
+ {{ factura.id }} + {{ factura.nombreUsuario }}{{ factura.nombrePlantilla }}{{ factura.costo }}{{ factura.fecha | formatMediumDatetime }} +
+ + + + + +
+
+
+
diff --git a/src/main/webapp/app/entities/factura/list/factura.component.spec.ts b/src/main/webapp/app/entities/factura/list/factura.component.spec.ts new file mode 100644 index 0000000..6b59b2a --- /dev/null +++ b/src/main/webapp/app/entities/factura/list/factura.component.spec.ts @@ -0,0 +1,48 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { HttpHeaders, HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { of } from 'rxjs'; + +import { FacturaService } from '../service/factura.service'; + +import { FacturaComponent } from './factura.component'; + +describe('Component Tests', () => { + describe('Factura Management Component', () => { + let comp: FacturaComponent; + let fixture: ComponentFixture; + let service: FacturaService; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [FacturaComponent], + }) + .overrideTemplate(FacturaComponent, '') + .compileComponents(); + + fixture = TestBed.createComponent(FacturaComponent); + comp = fixture.componentInstance; + service = TestBed.inject(FacturaService); + + const headers = new HttpHeaders().append('link', 'link;link'); + jest.spyOn(service, 'query').mockReturnValue( + of( + new HttpResponse({ + body: [{ id: 123 }], + headers, + }) + ) + ); + }); + + it('Should call load all on init', () => { + // WHEN + comp.ngOnInit(); + + // THEN + expect(service.query).toHaveBeenCalled(); + expect(comp.facturas?.[0]).toEqual(expect.objectContaining({ id: 123 })); + }); + }); +}); diff --git a/src/main/webapp/app/entities/factura/list/factura.component.ts b/src/main/webapp/app/entities/factura/list/factura.component.ts new file mode 100644 index 0000000..4503a82 --- /dev/null +++ b/src/main/webapp/app/entities/factura/list/factura.component.ts @@ -0,0 +1,51 @@ +import { Component, OnInit } from '@angular/core'; +import { HttpResponse } from '@angular/common/http'; +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; + +import { IFactura } from '../factura.model'; +import { FacturaService } from '../service/factura.service'; +import { FacturaDeleteDialogComponent } from '../delete/factura-delete-dialog.component'; + +@Component({ + selector: 'jhi-factura', + templateUrl: './factura.component.html', +}) +export class FacturaComponent implements OnInit { + facturas?: IFactura[]; + isLoading = false; + + constructor(protected facturaService: FacturaService, protected modalService: NgbModal) {} + + loadAll(): void { + this.isLoading = true; + + this.facturaService.query().subscribe( + (res: HttpResponse) => { + this.isLoading = false; + this.facturas = res.body ?? []; + }, + () => { + this.isLoading = false; + } + ); + } + + ngOnInit(): void { + this.loadAll(); + } + + trackId(index: number, item: IFactura): number { + return item.id!; + } + + delete(factura: IFactura): void { + const modalRef = this.modalService.open(FacturaDeleteDialogComponent, { size: 'lg', backdrop: 'static' }); + modalRef.componentInstance.factura = factura; + // unsubscribe not needed because closed completes on modal close + modalRef.closed.subscribe(reason => { + if (reason === 'deleted') { + this.loadAll(); + } + }); + } +} diff --git a/src/main/webapp/app/entities/factura/route/factura-routing-resolve.service.spec.ts b/src/main/webapp/app/entities/factura/route/factura-routing-resolve.service.spec.ts new file mode 100644 index 0000000..f4b31e4 --- /dev/null +++ b/src/main/webapp/app/entities/factura/route/factura-routing-resolve.service.spec.ts @@ -0,0 +1,82 @@ +jest.mock('@angular/router'); + +import { TestBed } from '@angular/core/testing'; +import { HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { ActivatedRouteSnapshot, Router } from '@angular/router'; +import { of } from 'rxjs'; + +import { IFactura, Factura } from '../factura.model'; +import { FacturaService } from '../service/factura.service'; + +import { FacturaRoutingResolveService } from './factura-routing-resolve.service'; + +describe('Service Tests', () => { + describe('Factura routing resolve service', () => { + let mockRouter: Router; + let mockActivatedRouteSnapshot: ActivatedRouteSnapshot; + let routingResolveService: FacturaRoutingResolveService; + let service: FacturaService; + let resultFactura: IFactura | undefined; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [Router, ActivatedRouteSnapshot], + }); + mockRouter = TestBed.inject(Router); + mockActivatedRouteSnapshot = TestBed.inject(ActivatedRouteSnapshot); + routingResolveService = TestBed.inject(FacturaRoutingResolveService); + service = TestBed.inject(FacturaService); + resultFactura = undefined; + }); + + describe('resolve', () => { + it('should return IFactura returned by find', () => { + // GIVEN + service.find = jest.fn(id => of(new HttpResponse({ body: { id } }))); + mockActivatedRouteSnapshot.params = { id: 123 }; + + // WHEN + routingResolveService.resolve(mockActivatedRouteSnapshot).subscribe(result => { + resultFactura = result; + }); + + // THEN + expect(service.find).toBeCalledWith(123); + expect(resultFactura).toEqual({ id: 123 }); + }); + + it('should return new IFactura if id is not provided', () => { + // GIVEN + service.find = jest.fn(); + mockActivatedRouteSnapshot.params = {}; + + // WHEN + routingResolveService.resolve(mockActivatedRouteSnapshot).subscribe(result => { + resultFactura = result; + }); + + // THEN + expect(service.find).not.toBeCalled(); + expect(resultFactura).toEqual(new Factura()); + }); + + it('should route to 404 page if data not found in server', () => { + // GIVEN + jest.spyOn(service, 'find').mockReturnValue(of(new HttpResponse({ body: null as unknown as Factura }))); + mockActivatedRouteSnapshot.params = { id: 123 }; + + // WHEN + routingResolveService.resolve(mockActivatedRouteSnapshot).subscribe(result => { + resultFactura = result; + }); + + // THEN + expect(service.find).toBeCalledWith(123); + expect(resultFactura).toEqual(undefined); + expect(mockRouter.navigate).toHaveBeenCalledWith(['404']); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/factura/route/factura-routing-resolve.service.ts b/src/main/webapp/app/entities/factura/route/factura-routing-resolve.service.ts new file mode 100644 index 0000000..b105d4e --- /dev/null +++ b/src/main/webapp/app/entities/factura/route/factura-routing-resolve.service.ts @@ -0,0 +1,30 @@ +import { Injectable } from '@angular/core'; +import { HttpResponse } from '@angular/common/http'; +import { Resolve, ActivatedRouteSnapshot, Router } from '@angular/router'; +import { Observable, of, EMPTY } from 'rxjs'; +import { mergeMap } from 'rxjs/operators'; + +import { IFactura, Factura } from '../factura.model'; +import { FacturaService } from '../service/factura.service'; + +@Injectable({ providedIn: 'root' }) +export class FacturaRoutingResolveService implements Resolve { + constructor(protected service: FacturaService, protected router: Router) {} + + resolve(route: ActivatedRouteSnapshot): Observable | Observable { + const id = route.params['id']; + if (id) { + return this.service.find(id).pipe( + mergeMap((factura: HttpResponse) => { + if (factura.body) { + return of(factura.body); + } else { + this.router.navigate(['404']); + return EMPTY; + } + }) + ); + } + return of(new Factura()); + } +} diff --git a/src/main/webapp/app/entities/factura/route/factura-routing.module.ts b/src/main/webapp/app/entities/factura/route/factura-routing.module.ts new file mode 100644 index 0000000..89edcd4 --- /dev/null +++ b/src/main/webapp/app/entities/factura/route/factura-routing.module.ts @@ -0,0 +1,46 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; + +import { UserRouteAccessService } from 'app/core/auth/user-route-access.service'; +import { FacturaComponent } from '../list/factura.component'; +import { FacturaDetailComponent } from '../detail/factura-detail.component'; +import { FacturaUpdateComponent } from '../update/factura-update.component'; +import { FacturaRoutingResolveService } from './factura-routing-resolve.service'; + +const facturaRoute: Routes = [ + { + path: '', + component: FacturaComponent, + canActivate: [UserRouteAccessService], + }, + { + path: ':id/view', + component: FacturaDetailComponent, + resolve: { + factura: FacturaRoutingResolveService, + }, + canActivate: [UserRouteAccessService], + }, + { + path: 'new', + component: FacturaUpdateComponent, + resolve: { + factura: FacturaRoutingResolveService, + }, + canActivate: [UserRouteAccessService], + }, + { + path: ':id/edit', + component: FacturaUpdateComponent, + resolve: { + factura: FacturaRoutingResolveService, + }, + canActivate: [UserRouteAccessService], + }, +]; + +@NgModule({ + imports: [RouterModule.forChild(facturaRoute)], + exports: [RouterModule], +}) +export class FacturaRoutingModule {} diff --git a/src/main/webapp/app/entities/factura/service/factura.service.spec.ts b/src/main/webapp/app/entities/factura/service/factura.service.spec.ts new file mode 100644 index 0000000..9d47ee8 --- /dev/null +++ b/src/main/webapp/app/entities/factura/service/factura.service.spec.ts @@ -0,0 +1,225 @@ +import { TestBed } from '@angular/core/testing'; +import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; +import * as dayjs from 'dayjs'; + +import { DATE_TIME_FORMAT } from 'app/config/input.constants'; +import { IFactura, Factura } from '../factura.model'; + +import { FacturaService } from './factura.service'; + +describe('Service Tests', () => { + describe('Factura Service', () => { + let service: FacturaService; + let httpMock: HttpTestingController; + let elemDefault: IFactura; + let expectedResult: IFactura | IFactura[] | boolean | null; + let currentDate: dayjs.Dayjs; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + }); + expectedResult = null; + service = TestBed.inject(FacturaService); + httpMock = TestBed.inject(HttpTestingController); + currentDate = dayjs(); + + elemDefault = { + id: 0, + nombreUsuario: 'AAAAAAA', + nombrePlantilla: 'AAAAAAA', + costo: 0, + fecha: currentDate, + }; + }); + + describe('Service methods', () => { + it('should find an element', () => { + const returnedFromService = Object.assign( + { + fecha: currentDate.format(DATE_TIME_FORMAT), + }, + elemDefault + ); + + service.find(123).subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'GET' }); + req.flush(returnedFromService); + expect(expectedResult).toMatchObject(elemDefault); + }); + + it('should create a Factura', () => { + const returnedFromService = Object.assign( + { + id: 0, + fecha: currentDate.format(DATE_TIME_FORMAT), + }, + elemDefault + ); + + const expected = Object.assign( + { + fecha: currentDate, + }, + returnedFromService + ); + + service.create(new Factura()).subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'POST' }); + req.flush(returnedFromService); + expect(expectedResult).toMatchObject(expected); + }); + + it('should update a Factura', () => { + const returnedFromService = Object.assign( + { + id: 1, + nombreUsuario: 'BBBBBB', + nombrePlantilla: 'BBBBBB', + costo: 1, + fecha: currentDate.format(DATE_TIME_FORMAT), + }, + elemDefault + ); + + const expected = Object.assign( + { + fecha: currentDate, + }, + returnedFromService + ); + + service.update(expected).subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'PUT' }); + req.flush(returnedFromService); + expect(expectedResult).toMatchObject(expected); + }); + + it('should partial update a Factura', () => { + const patchObject = Object.assign( + { + nombreUsuario: 'BBBBBB', + nombrePlantilla: 'BBBBBB', + fecha: currentDate.format(DATE_TIME_FORMAT), + }, + new Factura() + ); + + const returnedFromService = Object.assign(patchObject, elemDefault); + + const expected = Object.assign( + { + fecha: currentDate, + }, + returnedFromService + ); + + service.partialUpdate(patchObject).subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'PATCH' }); + req.flush(returnedFromService); + expect(expectedResult).toMatchObject(expected); + }); + + it('should return a list of Factura', () => { + const returnedFromService = Object.assign( + { + id: 1, + nombreUsuario: 'BBBBBB', + nombrePlantilla: 'BBBBBB', + costo: 1, + fecha: currentDate.format(DATE_TIME_FORMAT), + }, + elemDefault + ); + + const expected = Object.assign( + { + fecha: currentDate, + }, + returnedFromService + ); + + service.query().subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'GET' }); + req.flush([returnedFromService]); + httpMock.verify(); + expect(expectedResult).toContainEqual(expected); + }); + + it('should delete a Factura', () => { + service.delete(123).subscribe(resp => (expectedResult = resp.ok)); + + const req = httpMock.expectOne({ method: 'DELETE' }); + req.flush({ status: 200 }); + expect(expectedResult); + }); + + describe('addFacturaToCollectionIfMissing', () => { + it('should add a Factura to an empty array', () => { + const factura: IFactura = { id: 123 }; + expectedResult = service.addFacturaToCollectionIfMissing([], factura); + expect(expectedResult).toHaveLength(1); + expect(expectedResult).toContain(factura); + }); + + it('should not add a Factura to an array that contains it', () => { + const factura: IFactura = { id: 123 }; + const facturaCollection: IFactura[] = [ + { + ...factura, + }, + { id: 456 }, + ]; + expectedResult = service.addFacturaToCollectionIfMissing(facturaCollection, factura); + expect(expectedResult).toHaveLength(2); + }); + + it("should add a Factura to an array that doesn't contain it", () => { + const factura: IFactura = { id: 123 }; + const facturaCollection: IFactura[] = [{ id: 456 }]; + expectedResult = service.addFacturaToCollectionIfMissing(facturaCollection, factura); + expect(expectedResult).toHaveLength(2); + expect(expectedResult).toContain(factura); + }); + + it('should add only unique Factura to an array', () => { + const facturaArray: IFactura[] = [{ id: 123 }, { id: 456 }, { id: 18201 }]; + const facturaCollection: IFactura[] = [{ id: 123 }]; + expectedResult = service.addFacturaToCollectionIfMissing(facturaCollection, ...facturaArray); + expect(expectedResult).toHaveLength(3); + }); + + it('should accept varargs', () => { + const factura: IFactura = { id: 123 }; + const factura2: IFactura = { id: 456 }; + expectedResult = service.addFacturaToCollectionIfMissing([], factura, factura2); + expect(expectedResult).toHaveLength(2); + expect(expectedResult).toContain(factura); + expect(expectedResult).toContain(factura2); + }); + + it('should accept null and undefined values', () => { + const factura: IFactura = { id: 123 }; + expectedResult = service.addFacturaToCollectionIfMissing([], null, factura, undefined); + expect(expectedResult).toHaveLength(1); + expect(expectedResult).toContain(factura); + }); + + it('should return initial array if no Factura is added', () => { + const facturaCollection: IFactura[] = [{ id: 123 }]; + expectedResult = service.addFacturaToCollectionIfMissing(facturaCollection, undefined, null); + expect(expectedResult).toEqual(facturaCollection); + }); + }); + }); + + afterEach(() => { + httpMock.verify(); + }); + }); +}); diff --git a/src/main/webapp/app/entities/factura/service/factura.service.ts b/src/main/webapp/app/entities/factura/service/factura.service.ts new file mode 100644 index 0000000..07ed844 --- /dev/null +++ b/src/main/webapp/app/entities/factura/service/factura.service.ts @@ -0,0 +1,97 @@ +import { Injectable } from '@angular/core'; +import { HttpClient, HttpResponse } from '@angular/common/http'; +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; +import * as dayjs from 'dayjs'; + +import { isPresent } from 'app/core/util/operators'; +import { ApplicationConfigService } from 'app/core/config/application-config.service'; +import { createRequestOption } from 'app/core/request/request-util'; +import { IFactura, getFacturaIdentifier } from '../factura.model'; + +export type EntityResponseType = HttpResponse; +export type EntityArrayResponseType = HttpResponse; + +@Injectable({ providedIn: 'root' }) +export class FacturaService { + protected resourceUrl = this.applicationConfigService.getEndpointFor('api/facturas'); + + constructor(protected http: HttpClient, protected applicationConfigService: ApplicationConfigService) {} + + create(factura: IFactura): Observable { + const copy = this.convertDateFromClient(factura); + return this.http + .post(this.resourceUrl, copy, { observe: 'response' }) + .pipe(map((res: EntityResponseType) => this.convertDateFromServer(res))); + } + + update(factura: IFactura): Observable { + const copy = this.convertDateFromClient(factura); + return this.http + .put(`${this.resourceUrl}/${getFacturaIdentifier(factura) as number}`, copy, { observe: 'response' }) + .pipe(map((res: EntityResponseType) => this.convertDateFromServer(res))); + } + + partialUpdate(factura: IFactura): Observable { + const copy = this.convertDateFromClient(factura); + return this.http + .patch(`${this.resourceUrl}/${getFacturaIdentifier(factura) as number}`, copy, { observe: 'response' }) + .pipe(map((res: EntityResponseType) => this.convertDateFromServer(res))); + } + + find(id: number): Observable { + return this.http + .get(`${this.resourceUrl}/${id}`, { observe: 'response' }) + .pipe(map((res: EntityResponseType) => this.convertDateFromServer(res))); + } + + query(req?: any): Observable { + const options = createRequestOption(req); + return this.http + .get(this.resourceUrl, { params: options, observe: 'response' }) + .pipe(map((res: EntityArrayResponseType) => this.convertDateArrayFromServer(res))); + } + + delete(id: number): Observable> { + return this.http.delete(`${this.resourceUrl}/${id}`, { observe: 'response' }); + } + + addFacturaToCollectionIfMissing(facturaCollection: IFactura[], ...facturasToCheck: (IFactura | null | undefined)[]): IFactura[] { + const facturas: IFactura[] = facturasToCheck.filter(isPresent); + if (facturas.length > 0) { + const facturaCollectionIdentifiers = facturaCollection.map(facturaItem => getFacturaIdentifier(facturaItem)!); + const facturasToAdd = facturas.filter(facturaItem => { + const facturaIdentifier = getFacturaIdentifier(facturaItem); + if (facturaIdentifier == null || facturaCollectionIdentifiers.includes(facturaIdentifier)) { + return false; + } + facturaCollectionIdentifiers.push(facturaIdentifier); + return true; + }); + return [...facturasToAdd, ...facturaCollection]; + } + return facturaCollection; + } + + protected convertDateFromClient(factura: IFactura): IFactura { + return Object.assign({}, factura, { + fecha: factura.fecha?.isValid() ? factura.fecha.toJSON() : undefined, + }); + } + + protected convertDateFromServer(res: EntityResponseType): EntityResponseType { + if (res.body) { + res.body.fecha = res.body.fecha ? dayjs(res.body.fecha) : undefined; + } + return res; + } + + protected convertDateArrayFromServer(res: EntityArrayResponseType): EntityArrayResponseType { + if (res.body) { + res.body.forEach((factura: IFactura) => { + factura.fecha = factura.fecha ? dayjs(factura.fecha) : undefined; + }); + } + return res; + } +} diff --git a/src/main/webapp/app/entities/factura/update/factura-update.component.html b/src/main/webapp/app/entities/factura/update/factura-update.component.html new file mode 100644 index 0000000..1caa4dd --- /dev/null +++ b/src/main/webapp/app/entities/factura/update/factura-update.component.html @@ -0,0 +1,129 @@ +
+
+
+

+ Create or edit a Factura +

+ +
+ + +
+ + +
+ +
+ + +
+ + This field is required. + +
+
+ +
+ + +
+ + This field is required. + +
+
+ +
+ + +
+ + This field is required. + + + This field should be a number. + +
+
+ +
+ +
+ +
+
+ + This field is required. + + + This field should be a date and time. + +
+
+
+ +
+ + + +
+
+
+
diff --git a/src/main/webapp/app/entities/factura/update/factura-update.component.spec.ts b/src/main/webapp/app/entities/factura/update/factura-update.component.spec.ts new file mode 100644 index 0000000..fc2923a --- /dev/null +++ b/src/main/webapp/app/entities/factura/update/factura-update.component.spec.ts @@ -0,0 +1,113 @@ +jest.mock('@angular/router'); + +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { FormBuilder } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; +import { of, Subject } from 'rxjs'; + +import { FacturaService } from '../service/factura.service'; +import { IFactura, Factura } from '../factura.model'; + +import { FacturaUpdateComponent } from './factura-update.component'; + +describe('Component Tests', () => { + describe('Factura Management Update Component', () => { + let comp: FacturaUpdateComponent; + let fixture: ComponentFixture; + let activatedRoute: ActivatedRoute; + let facturaService: FacturaService; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [FacturaUpdateComponent], + providers: [FormBuilder, ActivatedRoute], + }) + .overrideTemplate(FacturaUpdateComponent, '') + .compileComponents(); + + fixture = TestBed.createComponent(FacturaUpdateComponent); + activatedRoute = TestBed.inject(ActivatedRoute); + facturaService = TestBed.inject(FacturaService); + + comp = fixture.componentInstance; + }); + + describe('ngOnInit', () => { + it('Should update editForm', () => { + const factura: IFactura = { id: 456 }; + + activatedRoute.data = of({ factura }); + comp.ngOnInit(); + + expect(comp.editForm.value).toEqual(expect.objectContaining(factura)); + }); + }); + + describe('save', () => { + it('Should call update service on save for existing entity', () => { + // GIVEN + const saveSubject = new Subject>(); + const factura = { id: 123 }; + jest.spyOn(facturaService, 'update').mockReturnValue(saveSubject); + jest.spyOn(comp, 'previousState'); + activatedRoute.data = of({ factura }); + comp.ngOnInit(); + + // WHEN + comp.save(); + expect(comp.isSaving).toEqual(true); + saveSubject.next(new HttpResponse({ body: factura })); + saveSubject.complete(); + + // THEN + expect(comp.previousState).toHaveBeenCalled(); + expect(facturaService.update).toHaveBeenCalledWith(factura); + expect(comp.isSaving).toEqual(false); + }); + + it('Should call create service on save for new entity', () => { + // GIVEN + const saveSubject = new Subject>(); + const factura = new Factura(); + jest.spyOn(facturaService, 'create').mockReturnValue(saveSubject); + jest.spyOn(comp, 'previousState'); + activatedRoute.data = of({ factura }); + comp.ngOnInit(); + + // WHEN + comp.save(); + expect(comp.isSaving).toEqual(true); + saveSubject.next(new HttpResponse({ body: factura })); + saveSubject.complete(); + + // THEN + expect(facturaService.create).toHaveBeenCalledWith(factura); + expect(comp.isSaving).toEqual(false); + expect(comp.previousState).toHaveBeenCalled(); + }); + + it('Should set isSaving to false on error', () => { + // GIVEN + const saveSubject = new Subject>(); + const factura = { id: 123 }; + jest.spyOn(facturaService, 'update').mockReturnValue(saveSubject); + jest.spyOn(comp, 'previousState'); + activatedRoute.data = of({ factura }); + comp.ngOnInit(); + + // WHEN + comp.save(); + expect(comp.isSaving).toEqual(true); + saveSubject.error('This is an error!'); + + // THEN + expect(facturaService.update).toHaveBeenCalledWith(factura); + expect(comp.isSaving).toEqual(false); + expect(comp.previousState).not.toHaveBeenCalled(); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/factura/update/factura-update.component.ts b/src/main/webapp/app/entities/factura/update/factura-update.component.ts new file mode 100644 index 0000000..b604f51 --- /dev/null +++ b/src/main/webapp/app/entities/factura/update/factura-update.component.ts @@ -0,0 +1,95 @@ +import { Component, OnInit } from '@angular/core'; +import { HttpResponse } from '@angular/common/http'; +import { FormBuilder, Validators } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; +import { Observable } from 'rxjs'; +import { finalize } from 'rxjs/operators'; + +import * as dayjs from 'dayjs'; +import { DATE_TIME_FORMAT } from 'app/config/input.constants'; + +import { IFactura, Factura } from '../factura.model'; +import { FacturaService } from '../service/factura.service'; + +@Component({ + selector: 'jhi-factura-update', + templateUrl: './factura-update.component.html', +}) +export class FacturaUpdateComponent implements OnInit { + isSaving = false; + + editForm = this.fb.group({ + id: [], + nombreUsuario: [null, [Validators.required]], + nombrePlantilla: [null, [Validators.required]], + costo: [null, [Validators.required]], + fecha: [null, [Validators.required]], + }); + + constructor(protected facturaService: FacturaService, protected activatedRoute: ActivatedRoute, protected fb: FormBuilder) {} + + ngOnInit(): void { + this.activatedRoute.data.subscribe(({ factura }) => { + if (factura.id === undefined) { + const today = dayjs().startOf('day'); + factura.fecha = today; + } + + this.updateForm(factura); + }); + } + + previousState(): void { + window.history.back(); + } + + save(): void { + this.isSaving = true; + const factura = this.createFromForm(); + if (factura.id !== undefined) { + this.subscribeToSaveResponse(this.facturaService.update(factura)); + } else { + this.subscribeToSaveResponse(this.facturaService.create(factura)); + } + } + + protected subscribeToSaveResponse(result: Observable>): void { + result.pipe(finalize(() => this.onSaveFinalize())).subscribe( + () => this.onSaveSuccess(), + () => this.onSaveError() + ); + } + + protected onSaveSuccess(): void { + this.previousState(); + } + + protected onSaveError(): void { + // Api for inheritance. + } + + protected onSaveFinalize(): void { + this.isSaving = false; + } + + protected updateForm(factura: IFactura): void { + this.editForm.patchValue({ + id: factura.id, + nombreUsuario: factura.nombreUsuario, + nombrePlantilla: factura.nombrePlantilla, + costo: factura.costo, + fecha: factura.fecha ? factura.fecha.format(DATE_TIME_FORMAT) : null, + }); + } + + protected createFromForm(): IFactura { + return { + ...new Factura(), + id: this.editForm.get(['id'])!.value, + nombreUsuario: this.editForm.get(['nombreUsuario'])!.value, + nombrePlantilla: this.editForm.get(['nombrePlantilla'])!.value, + costo: this.editForm.get(['costo'])!.value, + fecha: this.editForm.get(['fecha'])!.value ? dayjs(this.editForm.get(['fecha'])!.value, DATE_TIME_FORMAT) : undefined, + }; + } +} diff --git a/src/main/webapp/app/entities/p-pregunta-abierta/delete/p-pregunta-abierta-delete-dialog.component.html b/src/main/webapp/app/entities/p-pregunta-abierta/delete/p-pregunta-abierta-delete-dialog.component.html new file mode 100644 index 0000000..ef1fed5 --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-abierta/delete/p-pregunta-abierta-delete-dialog.component.html @@ -0,0 +1,29 @@ +
+ + + + + +
diff --git a/src/main/webapp/app/entities/p-pregunta-abierta/delete/p-pregunta-abierta-delete-dialog.component.spec.ts b/src/main/webapp/app/entities/p-pregunta-abierta/delete/p-pregunta-abierta-delete-dialog.component.spec.ts new file mode 100644 index 0000000..821d0a6 --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-abierta/delete/p-pregunta-abierta-delete-dialog.component.spec.ts @@ -0,0 +1,65 @@ +jest.mock('@ng-bootstrap/ng-bootstrap'); + +import { ComponentFixture, TestBed, inject, fakeAsync, tick } from '@angular/core/testing'; +import { HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { of } from 'rxjs'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; + +import { PPreguntaAbiertaService } from '../service/p-pregunta-abierta.service'; + +import { PPreguntaAbiertaDeleteDialogComponent } from './p-pregunta-abierta-delete-dialog.component'; + +describe('Component Tests', () => { + describe('PPreguntaAbierta Management Delete Component', () => { + let comp: PPreguntaAbiertaDeleteDialogComponent; + let fixture: ComponentFixture; + let service: PPreguntaAbiertaService; + let mockActiveModal: NgbActiveModal; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [PPreguntaAbiertaDeleteDialogComponent], + providers: [NgbActiveModal], + }) + .overrideTemplate(PPreguntaAbiertaDeleteDialogComponent, '') + .compileComponents(); + fixture = TestBed.createComponent(PPreguntaAbiertaDeleteDialogComponent); + comp = fixture.componentInstance; + service = TestBed.inject(PPreguntaAbiertaService); + mockActiveModal = TestBed.inject(NgbActiveModal); + }); + + describe('confirmDelete', () => { + it('Should call delete service on confirmDelete', inject( + [], + fakeAsync(() => { + // GIVEN + jest.spyOn(service, 'delete').mockReturnValue(of(new HttpResponse({}))); + + // WHEN + comp.confirmDelete(123); + tick(); + + // THEN + expect(service.delete).toHaveBeenCalledWith(123); + expect(mockActiveModal.close).toHaveBeenCalledWith('deleted'); + }) + )); + + it('Should not call delete service on clear', () => { + // GIVEN + jest.spyOn(service, 'delete'); + + // WHEN + comp.cancel(); + + // THEN + expect(service.delete).not.toHaveBeenCalled(); + expect(mockActiveModal.close).not.toHaveBeenCalled(); + expect(mockActiveModal.dismiss).toHaveBeenCalled(); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/p-pregunta-abierta/delete/p-pregunta-abierta-delete-dialog.component.ts b/src/main/webapp/app/entities/p-pregunta-abierta/delete/p-pregunta-abierta-delete-dialog.component.ts new file mode 100644 index 0000000..6817b51 --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-abierta/delete/p-pregunta-abierta-delete-dialog.component.ts @@ -0,0 +1,24 @@ +import { Component } from '@angular/core'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; + +import { IPPreguntaAbierta } from '../p-pregunta-abierta.model'; +import { PPreguntaAbiertaService } from '../service/p-pregunta-abierta.service'; + +@Component({ + templateUrl: './p-pregunta-abierta-delete-dialog.component.html', +}) +export class PPreguntaAbiertaDeleteDialogComponent { + pPreguntaAbierta?: IPPreguntaAbierta; + + constructor(protected pPreguntaAbiertaService: PPreguntaAbiertaService, protected activeModal: NgbActiveModal) {} + + cancel(): void { + this.activeModal.dismiss(); + } + + confirmDelete(id: number): void { + this.pPreguntaAbiertaService.delete(id).subscribe(() => { + this.activeModal.close('deleted'); + }); + } +} diff --git a/src/main/webapp/app/entities/p-pregunta-abierta/detail/p-pregunta-abierta-detail.component.html b/src/main/webapp/app/entities/p-pregunta-abierta/detail/p-pregunta-abierta-detail.component.html new file mode 100644 index 0000000..cc9976f --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-abierta/detail/p-pregunta-abierta-detail.component.html @@ -0,0 +1,48 @@ +
+
+
+

+ P Pregunta Abierta +

+ +
+ + + + + +
+
ID
+
+ {{ pPreguntaAbierta.id }} +
+
Nombre
+
+ {{ pPreguntaAbierta.nombre }} +
+
Opcional
+
+ {{ pPreguntaAbierta.opcional }} +
+
Orden
+
+ {{ pPreguntaAbierta.orden }} +
+
Plantilla
+
+ +
+
+ + + + +
+
+
diff --git a/src/main/webapp/app/entities/p-pregunta-abierta/detail/p-pregunta-abierta-detail.component.spec.ts b/src/main/webapp/app/entities/p-pregunta-abierta/detail/p-pregunta-abierta-detail.component.spec.ts new file mode 100644 index 0000000..f89ac82 --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-abierta/detail/p-pregunta-abierta-detail.component.spec.ts @@ -0,0 +1,38 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { ActivatedRoute } from '@angular/router'; +import { of } from 'rxjs'; + +import { PPreguntaAbiertaDetailComponent } from './p-pregunta-abierta-detail.component'; + +describe('Component Tests', () => { + describe('PPreguntaAbierta Management Detail Component', () => { + let comp: PPreguntaAbiertaDetailComponent; + let fixture: ComponentFixture; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [PPreguntaAbiertaDetailComponent], + providers: [ + { + provide: ActivatedRoute, + useValue: { data: of({ pPreguntaAbierta: { id: 123 } }) }, + }, + ], + }) + .overrideTemplate(PPreguntaAbiertaDetailComponent, '') + .compileComponents(); + fixture = TestBed.createComponent(PPreguntaAbiertaDetailComponent); + comp = fixture.componentInstance; + }); + + describe('OnInit', () => { + it('Should load pPreguntaAbierta on init', () => { + // WHEN + comp.ngOnInit(); + + // THEN + expect(comp.pPreguntaAbierta).toEqual(expect.objectContaining({ id: 123 })); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/p-pregunta-abierta/detail/p-pregunta-abierta-detail.component.ts b/src/main/webapp/app/entities/p-pregunta-abierta/detail/p-pregunta-abierta-detail.component.ts new file mode 100644 index 0000000..f381e3d --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-abierta/detail/p-pregunta-abierta-detail.component.ts @@ -0,0 +1,24 @@ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; + +import { IPPreguntaAbierta } from '../p-pregunta-abierta.model'; + +@Component({ + selector: 'jhi-p-pregunta-abierta-detail', + templateUrl: './p-pregunta-abierta-detail.component.html', +}) +export class PPreguntaAbiertaDetailComponent implements OnInit { + pPreguntaAbierta: IPPreguntaAbierta | null = null; + + constructor(protected activatedRoute: ActivatedRoute) {} + + ngOnInit(): void { + this.activatedRoute.data.subscribe(({ pPreguntaAbierta }) => { + this.pPreguntaAbierta = pPreguntaAbierta; + }); + } + + previousState(): void { + window.history.back(); + } +} diff --git a/src/main/webapp/app/entities/p-pregunta-abierta/list/p-pregunta-abierta.component.html b/src/main/webapp/app/entities/p-pregunta-abierta/list/p-pregunta-abierta.component.html new file mode 100644 index 0000000..1f36de1 --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-abierta/list/p-pregunta-abierta.component.html @@ -0,0 +1,88 @@ +
+

+ P Pregunta Abiertas + +
+ + + +
+

+ + + + + +
+ No pPreguntaAbiertas found +
+ +
+ + + + + + + + + + + + + + + + + + + + + +
IDNombreOpcionalOrdenPlantilla
+ {{ pPreguntaAbierta.id }} + {{ pPreguntaAbierta.nombre }}{{ pPreguntaAbierta.opcional }}{{ pPreguntaAbierta.orden }} + + +
+ + + + + +
+
+
+
diff --git a/src/main/webapp/app/entities/p-pregunta-abierta/list/p-pregunta-abierta.component.spec.ts b/src/main/webapp/app/entities/p-pregunta-abierta/list/p-pregunta-abierta.component.spec.ts new file mode 100644 index 0000000..9253c90 --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-abierta/list/p-pregunta-abierta.component.spec.ts @@ -0,0 +1,48 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { HttpHeaders, HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { of } from 'rxjs'; + +import { PPreguntaAbiertaService } from '../service/p-pregunta-abierta.service'; + +import { PPreguntaAbiertaComponent } from './p-pregunta-abierta.component'; + +describe('Component Tests', () => { + describe('PPreguntaAbierta Management Component', () => { + let comp: PPreguntaAbiertaComponent; + let fixture: ComponentFixture; + let service: PPreguntaAbiertaService; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [PPreguntaAbiertaComponent], + }) + .overrideTemplate(PPreguntaAbiertaComponent, '') + .compileComponents(); + + fixture = TestBed.createComponent(PPreguntaAbiertaComponent); + comp = fixture.componentInstance; + service = TestBed.inject(PPreguntaAbiertaService); + + const headers = new HttpHeaders().append('link', 'link;link'); + jest.spyOn(service, 'query').mockReturnValue( + of( + new HttpResponse({ + body: [{ id: 123 }], + headers, + }) + ) + ); + }); + + it('Should call load all on init', () => { + // WHEN + comp.ngOnInit(); + + // THEN + expect(service.query).toHaveBeenCalled(); + expect(comp.pPreguntaAbiertas?.[0]).toEqual(expect.objectContaining({ id: 123 })); + }); + }); +}); diff --git a/src/main/webapp/app/entities/p-pregunta-abierta/list/p-pregunta-abierta.component.ts b/src/main/webapp/app/entities/p-pregunta-abierta/list/p-pregunta-abierta.component.ts new file mode 100644 index 0000000..9eb713c --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-abierta/list/p-pregunta-abierta.component.ts @@ -0,0 +1,51 @@ +import { Component, OnInit } from '@angular/core'; +import { HttpResponse } from '@angular/common/http'; +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; + +import { IPPreguntaAbierta } from '../p-pregunta-abierta.model'; +import { PPreguntaAbiertaService } from '../service/p-pregunta-abierta.service'; +import { PPreguntaAbiertaDeleteDialogComponent } from '../delete/p-pregunta-abierta-delete-dialog.component'; + +@Component({ + selector: 'jhi-p-pregunta-abierta', + templateUrl: './p-pregunta-abierta.component.html', +}) +export class PPreguntaAbiertaComponent implements OnInit { + pPreguntaAbiertas?: IPPreguntaAbierta[]; + isLoading = false; + + constructor(protected pPreguntaAbiertaService: PPreguntaAbiertaService, protected modalService: NgbModal) {} + + loadAll(): void { + this.isLoading = true; + + this.pPreguntaAbiertaService.query().subscribe( + (res: HttpResponse) => { + this.isLoading = false; + this.pPreguntaAbiertas = res.body ?? []; + }, + () => { + this.isLoading = false; + } + ); + } + + ngOnInit(): void { + this.loadAll(); + } + + trackId(index: number, item: IPPreguntaAbierta): number { + return item.id!; + } + + delete(pPreguntaAbierta: IPPreguntaAbierta): void { + const modalRef = this.modalService.open(PPreguntaAbiertaDeleteDialogComponent, { size: 'lg', backdrop: 'static' }); + modalRef.componentInstance.pPreguntaAbierta = pPreguntaAbierta; + // unsubscribe not needed because closed completes on modal close + modalRef.closed.subscribe(reason => { + if (reason === 'deleted') { + this.loadAll(); + } + }); + } +} diff --git a/src/main/webapp/app/entities/p-pregunta-abierta/p-pregunta-abierta.model.ts b/src/main/webapp/app/entities/p-pregunta-abierta/p-pregunta-abierta.model.ts new file mode 100644 index 0000000..a541a90 --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-abierta/p-pregunta-abierta.model.ts @@ -0,0 +1,25 @@ +import { IPlantilla } from 'app/entities/plantilla/plantilla.model'; + +export interface IPPreguntaAbierta { + id?: number; + nombre?: string; + opcional?: boolean; + orden?: number; + plantilla?: IPlantilla | null; +} + +export class PPreguntaAbierta implements IPPreguntaAbierta { + constructor( + public id?: number, + public nombre?: string, + public opcional?: boolean, + public orden?: number, + public plantilla?: IPlantilla | null + ) { + this.opcional = this.opcional ?? false; + } +} + +export function getPPreguntaAbiertaIdentifier(pPreguntaAbierta: IPPreguntaAbierta): number | undefined { + return pPreguntaAbierta.id; +} diff --git a/src/main/webapp/app/entities/p-pregunta-abierta/p-pregunta-abierta.module.ts b/src/main/webapp/app/entities/p-pregunta-abierta/p-pregunta-abierta.module.ts new file mode 100644 index 0000000..b4169d7 --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-abierta/p-pregunta-abierta.module.ts @@ -0,0 +1,19 @@ +import { NgModule } from '@angular/core'; +import { SharedModule } from 'app/shared/shared.module'; +import { PPreguntaAbiertaComponent } from './list/p-pregunta-abierta.component'; +import { PPreguntaAbiertaDetailComponent } from './detail/p-pregunta-abierta-detail.component'; +import { PPreguntaAbiertaUpdateComponent } from './update/p-pregunta-abierta-update.component'; +import { PPreguntaAbiertaDeleteDialogComponent } from './delete/p-pregunta-abierta-delete-dialog.component'; +import { PPreguntaAbiertaRoutingModule } from './route/p-pregunta-abierta-routing.module'; + +@NgModule({ + imports: [SharedModule, PPreguntaAbiertaRoutingModule], + declarations: [ + PPreguntaAbiertaComponent, + PPreguntaAbiertaDetailComponent, + PPreguntaAbiertaUpdateComponent, + PPreguntaAbiertaDeleteDialogComponent, + ], + entryComponents: [PPreguntaAbiertaDeleteDialogComponent], +}) +export class PPreguntaAbiertaModule {} diff --git a/src/main/webapp/app/entities/p-pregunta-abierta/route/p-pregunta-abierta-routing-resolve.service.spec.ts b/src/main/webapp/app/entities/p-pregunta-abierta/route/p-pregunta-abierta-routing-resolve.service.spec.ts new file mode 100644 index 0000000..4a4be03 --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-abierta/route/p-pregunta-abierta-routing-resolve.service.spec.ts @@ -0,0 +1,82 @@ +jest.mock('@angular/router'); + +import { TestBed } from '@angular/core/testing'; +import { HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { ActivatedRouteSnapshot, Router } from '@angular/router'; +import { of } from 'rxjs'; + +import { IPPreguntaAbierta, PPreguntaAbierta } from '../p-pregunta-abierta.model'; +import { PPreguntaAbiertaService } from '../service/p-pregunta-abierta.service'; + +import { PPreguntaAbiertaRoutingResolveService } from './p-pregunta-abierta-routing-resolve.service'; + +describe('Service Tests', () => { + describe('PPreguntaAbierta routing resolve service', () => { + let mockRouter: Router; + let mockActivatedRouteSnapshot: ActivatedRouteSnapshot; + let routingResolveService: PPreguntaAbiertaRoutingResolveService; + let service: PPreguntaAbiertaService; + let resultPPreguntaAbierta: IPPreguntaAbierta | undefined; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [Router, ActivatedRouteSnapshot], + }); + mockRouter = TestBed.inject(Router); + mockActivatedRouteSnapshot = TestBed.inject(ActivatedRouteSnapshot); + routingResolveService = TestBed.inject(PPreguntaAbiertaRoutingResolveService); + service = TestBed.inject(PPreguntaAbiertaService); + resultPPreguntaAbierta = undefined; + }); + + describe('resolve', () => { + it('should return IPPreguntaAbierta returned by find', () => { + // GIVEN + service.find = jest.fn(id => of(new HttpResponse({ body: { id } }))); + mockActivatedRouteSnapshot.params = { id: 123 }; + + // WHEN + routingResolveService.resolve(mockActivatedRouteSnapshot).subscribe(result => { + resultPPreguntaAbierta = result; + }); + + // THEN + expect(service.find).toBeCalledWith(123); + expect(resultPPreguntaAbierta).toEqual({ id: 123 }); + }); + + it('should return new IPPreguntaAbierta if id is not provided', () => { + // GIVEN + service.find = jest.fn(); + mockActivatedRouteSnapshot.params = {}; + + // WHEN + routingResolveService.resolve(mockActivatedRouteSnapshot).subscribe(result => { + resultPPreguntaAbierta = result; + }); + + // THEN + expect(service.find).not.toBeCalled(); + expect(resultPPreguntaAbierta).toEqual(new PPreguntaAbierta()); + }); + + it('should route to 404 page if data not found in server', () => { + // GIVEN + jest.spyOn(service, 'find').mockReturnValue(of(new HttpResponse({ body: null as unknown as PPreguntaAbierta }))); + mockActivatedRouteSnapshot.params = { id: 123 }; + + // WHEN + routingResolveService.resolve(mockActivatedRouteSnapshot).subscribe(result => { + resultPPreguntaAbierta = result; + }); + + // THEN + expect(service.find).toBeCalledWith(123); + expect(resultPPreguntaAbierta).toEqual(undefined); + expect(mockRouter.navigate).toHaveBeenCalledWith(['404']); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/p-pregunta-abierta/route/p-pregunta-abierta-routing-resolve.service.ts b/src/main/webapp/app/entities/p-pregunta-abierta/route/p-pregunta-abierta-routing-resolve.service.ts new file mode 100644 index 0000000..05163c2 --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-abierta/route/p-pregunta-abierta-routing-resolve.service.ts @@ -0,0 +1,30 @@ +import { Injectable } from '@angular/core'; +import { HttpResponse } from '@angular/common/http'; +import { Resolve, ActivatedRouteSnapshot, Router } from '@angular/router'; +import { Observable, of, EMPTY } from 'rxjs'; +import { mergeMap } from 'rxjs/operators'; + +import { IPPreguntaAbierta, PPreguntaAbierta } from '../p-pregunta-abierta.model'; +import { PPreguntaAbiertaService } from '../service/p-pregunta-abierta.service'; + +@Injectable({ providedIn: 'root' }) +export class PPreguntaAbiertaRoutingResolveService implements Resolve { + constructor(protected service: PPreguntaAbiertaService, protected router: Router) {} + + resolve(route: ActivatedRouteSnapshot): Observable | Observable { + const id = route.params['id']; + if (id) { + return this.service.find(id).pipe( + mergeMap((pPreguntaAbierta: HttpResponse) => { + if (pPreguntaAbierta.body) { + return of(pPreguntaAbierta.body); + } else { + this.router.navigate(['404']); + return EMPTY; + } + }) + ); + } + return of(new PPreguntaAbierta()); + } +} diff --git a/src/main/webapp/app/entities/p-pregunta-abierta/route/p-pregunta-abierta-routing.module.ts b/src/main/webapp/app/entities/p-pregunta-abierta/route/p-pregunta-abierta-routing.module.ts new file mode 100644 index 0000000..343dd9b --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-abierta/route/p-pregunta-abierta-routing.module.ts @@ -0,0 +1,46 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; + +import { UserRouteAccessService } from 'app/core/auth/user-route-access.service'; +import { PPreguntaAbiertaComponent } from '../list/p-pregunta-abierta.component'; +import { PPreguntaAbiertaDetailComponent } from '../detail/p-pregunta-abierta-detail.component'; +import { PPreguntaAbiertaUpdateComponent } from '../update/p-pregunta-abierta-update.component'; +import { PPreguntaAbiertaRoutingResolveService } from './p-pregunta-abierta-routing-resolve.service'; + +const pPreguntaAbiertaRoute: Routes = [ + { + path: '', + component: PPreguntaAbiertaComponent, + canActivate: [UserRouteAccessService], + }, + { + path: ':id/view', + component: PPreguntaAbiertaDetailComponent, + resolve: { + pPreguntaAbierta: PPreguntaAbiertaRoutingResolveService, + }, + canActivate: [UserRouteAccessService], + }, + { + path: 'new', + component: PPreguntaAbiertaUpdateComponent, + resolve: { + pPreguntaAbierta: PPreguntaAbiertaRoutingResolveService, + }, + canActivate: [UserRouteAccessService], + }, + { + path: ':id/edit', + component: PPreguntaAbiertaUpdateComponent, + resolve: { + pPreguntaAbierta: PPreguntaAbiertaRoutingResolveService, + }, + canActivate: [UserRouteAccessService], + }, +]; + +@NgModule({ + imports: [RouterModule.forChild(pPreguntaAbiertaRoute)], + exports: [RouterModule], +}) +export class PPreguntaAbiertaRoutingModule {} diff --git a/src/main/webapp/app/entities/p-pregunta-abierta/service/p-pregunta-abierta.service.spec.ts b/src/main/webapp/app/entities/p-pregunta-abierta/service/p-pregunta-abierta.service.spec.ts new file mode 100644 index 0000000..cc68c5b --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-abierta/service/p-pregunta-abierta.service.spec.ts @@ -0,0 +1,190 @@ +import { TestBed } from '@angular/core/testing'; +import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; + +import { IPPreguntaAbierta, PPreguntaAbierta } from '../p-pregunta-abierta.model'; + +import { PPreguntaAbiertaService } from './p-pregunta-abierta.service'; + +describe('Service Tests', () => { + describe('PPreguntaAbierta Service', () => { + let service: PPreguntaAbiertaService; + let httpMock: HttpTestingController; + let elemDefault: IPPreguntaAbierta; + let expectedResult: IPPreguntaAbierta | IPPreguntaAbierta[] | boolean | null; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + }); + expectedResult = null; + service = TestBed.inject(PPreguntaAbiertaService); + httpMock = TestBed.inject(HttpTestingController); + + elemDefault = { + id: 0, + nombre: 'AAAAAAA', + opcional: false, + orden: 0, + }; + }); + + describe('Service methods', () => { + it('should find an element', () => { + const returnedFromService = Object.assign({}, elemDefault); + + service.find(123).subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'GET' }); + req.flush(returnedFromService); + expect(expectedResult).toMatchObject(elemDefault); + }); + + it('should create a PPreguntaAbierta', () => { + const returnedFromService = Object.assign( + { + id: 0, + }, + elemDefault + ); + + const expected = Object.assign({}, returnedFromService); + + service.create(new PPreguntaAbierta()).subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'POST' }); + req.flush(returnedFromService); + expect(expectedResult).toMatchObject(expected); + }); + + it('should update a PPreguntaAbierta', () => { + const returnedFromService = Object.assign( + { + id: 1, + nombre: 'BBBBBB', + opcional: true, + orden: 1, + }, + elemDefault + ); + + const expected = Object.assign({}, returnedFromService); + + service.update(expected).subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'PUT' }); + req.flush(returnedFromService); + expect(expectedResult).toMatchObject(expected); + }); + + it('should partial update a PPreguntaAbierta', () => { + const patchObject = Object.assign( + { + nombre: 'BBBBBB', + }, + new PPreguntaAbierta() + ); + + const returnedFromService = Object.assign(patchObject, elemDefault); + + const expected = Object.assign({}, returnedFromService); + + service.partialUpdate(patchObject).subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'PATCH' }); + req.flush(returnedFromService); + expect(expectedResult).toMatchObject(expected); + }); + + it('should return a list of PPreguntaAbierta', () => { + const returnedFromService = Object.assign( + { + id: 1, + nombre: 'BBBBBB', + opcional: true, + orden: 1, + }, + elemDefault + ); + + const expected = Object.assign({}, returnedFromService); + + service.query().subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'GET' }); + req.flush([returnedFromService]); + httpMock.verify(); + expect(expectedResult).toContainEqual(expected); + }); + + it('should delete a PPreguntaAbierta', () => { + service.delete(123).subscribe(resp => (expectedResult = resp.ok)); + + const req = httpMock.expectOne({ method: 'DELETE' }); + req.flush({ status: 200 }); + expect(expectedResult); + }); + + describe('addPPreguntaAbiertaToCollectionIfMissing', () => { + it('should add a PPreguntaAbierta to an empty array', () => { + const pPreguntaAbierta: IPPreguntaAbierta = { id: 123 }; + expectedResult = service.addPPreguntaAbiertaToCollectionIfMissing([], pPreguntaAbierta); + expect(expectedResult).toHaveLength(1); + expect(expectedResult).toContain(pPreguntaAbierta); + }); + + it('should not add a PPreguntaAbierta to an array that contains it', () => { + const pPreguntaAbierta: IPPreguntaAbierta = { id: 123 }; + const pPreguntaAbiertaCollection: IPPreguntaAbierta[] = [ + { + ...pPreguntaAbierta, + }, + { id: 456 }, + ]; + expectedResult = service.addPPreguntaAbiertaToCollectionIfMissing(pPreguntaAbiertaCollection, pPreguntaAbierta); + expect(expectedResult).toHaveLength(2); + }); + + it("should add a PPreguntaAbierta to an array that doesn't contain it", () => { + const pPreguntaAbierta: IPPreguntaAbierta = { id: 123 }; + const pPreguntaAbiertaCollection: IPPreguntaAbierta[] = [{ id: 456 }]; + expectedResult = service.addPPreguntaAbiertaToCollectionIfMissing(pPreguntaAbiertaCollection, pPreguntaAbierta); + expect(expectedResult).toHaveLength(2); + expect(expectedResult).toContain(pPreguntaAbierta); + }); + + it('should add only unique PPreguntaAbierta to an array', () => { + const pPreguntaAbiertaArray: IPPreguntaAbierta[] = [{ id: 123 }, { id: 456 }, { id: 34879 }]; + const pPreguntaAbiertaCollection: IPPreguntaAbierta[] = [{ id: 123 }]; + expectedResult = service.addPPreguntaAbiertaToCollectionIfMissing(pPreguntaAbiertaCollection, ...pPreguntaAbiertaArray); + expect(expectedResult).toHaveLength(3); + }); + + it('should accept varargs', () => { + const pPreguntaAbierta: IPPreguntaAbierta = { id: 123 }; + const pPreguntaAbierta2: IPPreguntaAbierta = { id: 456 }; + expectedResult = service.addPPreguntaAbiertaToCollectionIfMissing([], pPreguntaAbierta, pPreguntaAbierta2); + expect(expectedResult).toHaveLength(2); + expect(expectedResult).toContain(pPreguntaAbierta); + expect(expectedResult).toContain(pPreguntaAbierta2); + }); + + it('should accept null and undefined values', () => { + const pPreguntaAbierta: IPPreguntaAbierta = { id: 123 }; + expectedResult = service.addPPreguntaAbiertaToCollectionIfMissing([], null, pPreguntaAbierta, undefined); + expect(expectedResult).toHaveLength(1); + expect(expectedResult).toContain(pPreguntaAbierta); + }); + + it('should return initial array if no PPreguntaAbierta is added', () => { + const pPreguntaAbiertaCollection: IPPreguntaAbierta[] = [{ id: 123 }]; + expectedResult = service.addPPreguntaAbiertaToCollectionIfMissing(pPreguntaAbiertaCollection, undefined, null); + expect(expectedResult).toEqual(pPreguntaAbiertaCollection); + }); + }); + }); + + afterEach(() => { + httpMock.verify(); + }); + }); +}); diff --git a/src/main/webapp/app/entities/p-pregunta-abierta/service/p-pregunta-abierta.service.ts b/src/main/webapp/app/entities/p-pregunta-abierta/service/p-pregunta-abierta.service.ts new file mode 100644 index 0000000..2d55c04 --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-abierta/service/p-pregunta-abierta.service.ts @@ -0,0 +1,73 @@ +import { Injectable } from '@angular/core'; +import { HttpClient, HttpResponse } from '@angular/common/http'; +import { Observable } from 'rxjs'; + +import { isPresent } from 'app/core/util/operators'; +import { ApplicationConfigService } from 'app/core/config/application-config.service'; +import { createRequestOption } from 'app/core/request/request-util'; +import { IPPreguntaAbierta, getPPreguntaAbiertaIdentifier } from '../p-pregunta-abierta.model'; + +export type EntityResponseType = HttpResponse; +export type EntityArrayResponseType = HttpResponse; + +@Injectable({ providedIn: 'root' }) +export class PPreguntaAbiertaService { + protected resourceUrl = this.applicationConfigService.getEndpointFor('api/p-pregunta-abiertas'); + + constructor(protected http: HttpClient, protected applicationConfigService: ApplicationConfigService) {} + + create(pPreguntaAbierta: IPPreguntaAbierta): Observable { + return this.http.post(this.resourceUrl, pPreguntaAbierta, { observe: 'response' }); + } + + update(pPreguntaAbierta: IPPreguntaAbierta): Observable { + return this.http.put( + `${this.resourceUrl}/${getPPreguntaAbiertaIdentifier(pPreguntaAbierta) as number}`, + pPreguntaAbierta, + { observe: 'response' } + ); + } + + partialUpdate(pPreguntaAbierta: IPPreguntaAbierta): Observable { + return this.http.patch( + `${this.resourceUrl}/${getPPreguntaAbiertaIdentifier(pPreguntaAbierta) as number}`, + pPreguntaAbierta, + { observe: 'response' } + ); + } + + find(id: number): Observable { + return this.http.get(`${this.resourceUrl}/${id}`, { observe: 'response' }); + } + + query(req?: any): Observable { + const options = createRequestOption(req); + return this.http.get(this.resourceUrl, { params: options, observe: 'response' }); + } + + delete(id: number): Observable> { + return this.http.delete(`${this.resourceUrl}/${id}`, { observe: 'response' }); + } + + addPPreguntaAbiertaToCollectionIfMissing( + pPreguntaAbiertaCollection: IPPreguntaAbierta[], + ...pPreguntaAbiertasToCheck: (IPPreguntaAbierta | null | undefined)[] + ): IPPreguntaAbierta[] { + const pPreguntaAbiertas: IPPreguntaAbierta[] = pPreguntaAbiertasToCheck.filter(isPresent); + if (pPreguntaAbiertas.length > 0) { + const pPreguntaAbiertaCollectionIdentifiers = pPreguntaAbiertaCollection.map( + pPreguntaAbiertaItem => getPPreguntaAbiertaIdentifier(pPreguntaAbiertaItem)! + ); + const pPreguntaAbiertasToAdd = pPreguntaAbiertas.filter(pPreguntaAbiertaItem => { + const pPreguntaAbiertaIdentifier = getPPreguntaAbiertaIdentifier(pPreguntaAbiertaItem); + if (pPreguntaAbiertaIdentifier == null || pPreguntaAbiertaCollectionIdentifiers.includes(pPreguntaAbiertaIdentifier)) { + return false; + } + pPreguntaAbiertaCollectionIdentifiers.push(pPreguntaAbiertaIdentifier); + return true; + }); + return [...pPreguntaAbiertasToAdd, ...pPreguntaAbiertaCollection]; + } + return pPreguntaAbiertaCollection; + } +} diff --git a/src/main/webapp/app/entities/p-pregunta-abierta/update/p-pregunta-abierta-update.component.html b/src/main/webapp/app/entities/p-pregunta-abierta/update/p-pregunta-abierta-update.component.html new file mode 100644 index 0000000..d5ced92 --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-abierta/update/p-pregunta-abierta-update.component.html @@ -0,0 +1,104 @@ +
+
+
+

+ Create or edit a P Pregunta Abierta +

+ +
+ + +
+ + +
+ +
+ + +
+ + This field is required. + + + This field is required to be at least 1 characters. + + + This field cannot be longer than 500 characters. + +
+
+ +
+ + +
+ + This field is required. + +
+
+ +
+ + +
+ + This field is required. + + + This field should be a number. + +
+
+ +
+ + +
+
+ +
+ + + +
+
+
+
diff --git a/src/main/webapp/app/entities/p-pregunta-abierta/update/p-pregunta-abierta-update.component.spec.ts b/src/main/webapp/app/entities/p-pregunta-abierta/update/p-pregunta-abierta-update.component.spec.ts new file mode 100644 index 0000000..3aa7adc --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-abierta/update/p-pregunta-abierta-update.component.spec.ts @@ -0,0 +1,149 @@ +jest.mock('@angular/router'); + +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { FormBuilder } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; +import { of, Subject } from 'rxjs'; + +import { PPreguntaAbiertaService } from '../service/p-pregunta-abierta.service'; +import { IPPreguntaAbierta, PPreguntaAbierta } from '../p-pregunta-abierta.model'; +import { IPlantilla } from 'app/entities/plantilla/plantilla.model'; +import { PlantillaService } from 'app/entities/plantilla/service/plantilla.service'; + +import { PPreguntaAbiertaUpdateComponent } from './p-pregunta-abierta-update.component'; + +describe('Component Tests', () => { + describe('PPreguntaAbierta Management Update Component', () => { + let comp: PPreguntaAbiertaUpdateComponent; + let fixture: ComponentFixture; + let activatedRoute: ActivatedRoute; + let pPreguntaAbiertaService: PPreguntaAbiertaService; + let plantillaService: PlantillaService; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [PPreguntaAbiertaUpdateComponent], + providers: [FormBuilder, ActivatedRoute], + }) + .overrideTemplate(PPreguntaAbiertaUpdateComponent, '') + .compileComponents(); + + fixture = TestBed.createComponent(PPreguntaAbiertaUpdateComponent); + activatedRoute = TestBed.inject(ActivatedRoute); + pPreguntaAbiertaService = TestBed.inject(PPreguntaAbiertaService); + plantillaService = TestBed.inject(PlantillaService); + + comp = fixture.componentInstance; + }); + + describe('ngOnInit', () => { + it('Should call Plantilla query and add missing value', () => { + const pPreguntaAbierta: IPPreguntaAbierta = { id: 456 }; + const plantilla: IPlantilla = { id: 89636 }; + pPreguntaAbierta.plantilla = plantilla; + + const plantillaCollection: IPlantilla[] = [{ id: 65124 }]; + jest.spyOn(plantillaService, 'query').mockReturnValue(of(new HttpResponse({ body: plantillaCollection }))); + const additionalPlantillas = [plantilla]; + const expectedCollection: IPlantilla[] = [...additionalPlantillas, ...plantillaCollection]; + jest.spyOn(plantillaService, 'addPlantillaToCollectionIfMissing').mockReturnValue(expectedCollection); + + activatedRoute.data = of({ pPreguntaAbierta }); + comp.ngOnInit(); + + expect(plantillaService.query).toHaveBeenCalled(); + expect(plantillaService.addPlantillaToCollectionIfMissing).toHaveBeenCalledWith(plantillaCollection, ...additionalPlantillas); + expect(comp.plantillasSharedCollection).toEqual(expectedCollection); + }); + + it('Should update editForm', () => { + const pPreguntaAbierta: IPPreguntaAbierta = { id: 456 }; + const plantilla: IPlantilla = { id: 15037 }; + pPreguntaAbierta.plantilla = plantilla; + + activatedRoute.data = of({ pPreguntaAbierta }); + comp.ngOnInit(); + + expect(comp.editForm.value).toEqual(expect.objectContaining(pPreguntaAbierta)); + expect(comp.plantillasSharedCollection).toContain(plantilla); + }); + }); + + describe('save', () => { + it('Should call update service on save for existing entity', () => { + // GIVEN + const saveSubject = new Subject>(); + const pPreguntaAbierta = { id: 123 }; + jest.spyOn(pPreguntaAbiertaService, 'update').mockReturnValue(saveSubject); + jest.spyOn(comp, 'previousState'); + activatedRoute.data = of({ pPreguntaAbierta }); + comp.ngOnInit(); + + // WHEN + comp.save(); + expect(comp.isSaving).toEqual(true); + saveSubject.next(new HttpResponse({ body: pPreguntaAbierta })); + saveSubject.complete(); + + // THEN + expect(comp.previousState).toHaveBeenCalled(); + expect(pPreguntaAbiertaService.update).toHaveBeenCalledWith(pPreguntaAbierta); + expect(comp.isSaving).toEqual(false); + }); + + it('Should call create service on save for new entity', () => { + // GIVEN + const saveSubject = new Subject>(); + const pPreguntaAbierta = new PPreguntaAbierta(); + jest.spyOn(pPreguntaAbiertaService, 'create').mockReturnValue(saveSubject); + jest.spyOn(comp, 'previousState'); + activatedRoute.data = of({ pPreguntaAbierta }); + comp.ngOnInit(); + + // WHEN + comp.save(); + expect(comp.isSaving).toEqual(true); + saveSubject.next(new HttpResponse({ body: pPreguntaAbierta })); + saveSubject.complete(); + + // THEN + expect(pPreguntaAbiertaService.create).toHaveBeenCalledWith(pPreguntaAbierta); + expect(comp.isSaving).toEqual(false); + expect(comp.previousState).toHaveBeenCalled(); + }); + + it('Should set isSaving to false on error', () => { + // GIVEN + const saveSubject = new Subject>(); + const pPreguntaAbierta = { id: 123 }; + jest.spyOn(pPreguntaAbiertaService, 'update').mockReturnValue(saveSubject); + jest.spyOn(comp, 'previousState'); + activatedRoute.data = of({ pPreguntaAbierta }); + comp.ngOnInit(); + + // WHEN + comp.save(); + expect(comp.isSaving).toEqual(true); + saveSubject.error('This is an error!'); + + // THEN + expect(pPreguntaAbiertaService.update).toHaveBeenCalledWith(pPreguntaAbierta); + expect(comp.isSaving).toEqual(false); + expect(comp.previousState).not.toHaveBeenCalled(); + }); + }); + + describe('Tracking relationships identifiers', () => { + describe('trackPlantillaById', () => { + it('Should return tracked Plantilla primary key', () => { + const entity = { id: 123 }; + const trackResult = comp.trackPlantillaById(0, entity); + expect(trackResult).toEqual(entity.id); + }); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/p-pregunta-abierta/update/p-pregunta-abierta-update.component.ts b/src/main/webapp/app/entities/p-pregunta-abierta/update/p-pregunta-abierta-update.component.ts new file mode 100644 index 0000000..73b67ee --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-abierta/update/p-pregunta-abierta-update.component.ts @@ -0,0 +1,119 @@ +import { Component, OnInit } from '@angular/core'; +import { HttpResponse } from '@angular/common/http'; +import { FormBuilder, Validators } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; +import { Observable } from 'rxjs'; +import { finalize, map } from 'rxjs/operators'; + +import { IPPreguntaAbierta, PPreguntaAbierta } from '../p-pregunta-abierta.model'; +import { PPreguntaAbiertaService } from '../service/p-pregunta-abierta.service'; +import { IPlantilla } from 'app/entities/plantilla/plantilla.model'; +import { PlantillaService } from 'app/entities/plantilla/service/plantilla.service'; + +@Component({ + selector: 'jhi-p-pregunta-abierta-update', + templateUrl: './p-pregunta-abierta-update.component.html', +}) +export class PPreguntaAbiertaUpdateComponent implements OnInit { + isSaving = false; + + plantillasSharedCollection: IPlantilla[] = []; + + editForm = this.fb.group({ + id: [], + nombre: [null, [Validators.required, Validators.minLength(1), Validators.maxLength(500)]], + opcional: [null, [Validators.required]], + orden: [null, [Validators.required]], + plantilla: [], + }); + + constructor( + protected pPreguntaAbiertaService: PPreguntaAbiertaService, + protected plantillaService: PlantillaService, + protected activatedRoute: ActivatedRoute, + protected fb: FormBuilder + ) {} + + ngOnInit(): void { + this.activatedRoute.data.subscribe(({ pPreguntaAbierta }) => { + this.updateForm(pPreguntaAbierta); + + this.loadRelationshipsOptions(); + }); + } + + previousState(): void { + window.history.back(); + } + + save(): void { + this.isSaving = true; + const pPreguntaAbierta = this.createFromForm(); + if (pPreguntaAbierta.id !== undefined) { + this.subscribeToSaveResponse(this.pPreguntaAbiertaService.update(pPreguntaAbierta)); + } else { + this.subscribeToSaveResponse(this.pPreguntaAbiertaService.create(pPreguntaAbierta)); + } + } + + trackPlantillaById(index: number, item: IPlantilla): number { + return item.id!; + } + + protected subscribeToSaveResponse(result: Observable>): void { + result.pipe(finalize(() => this.onSaveFinalize())).subscribe( + () => this.onSaveSuccess(), + () => this.onSaveError() + ); + } + + protected onSaveSuccess(): void { + this.previousState(); + } + + protected onSaveError(): void { + // Api for inheritance. + } + + protected onSaveFinalize(): void { + this.isSaving = false; + } + + protected updateForm(pPreguntaAbierta: IPPreguntaAbierta): void { + this.editForm.patchValue({ + id: pPreguntaAbierta.id, + nombre: pPreguntaAbierta.nombre, + opcional: pPreguntaAbierta.opcional, + orden: pPreguntaAbierta.orden, + plantilla: pPreguntaAbierta.plantilla, + }); + + this.plantillasSharedCollection = this.plantillaService.addPlantillaToCollectionIfMissing( + this.plantillasSharedCollection, + pPreguntaAbierta.plantilla + ); + } + + protected loadRelationshipsOptions(): void { + this.plantillaService + .query() + .pipe(map((res: HttpResponse) => res.body ?? [])) + .pipe( + map((plantillas: IPlantilla[]) => + this.plantillaService.addPlantillaToCollectionIfMissing(plantillas, this.editForm.get('plantilla')!.value) + ) + ) + .subscribe((plantillas: IPlantilla[]) => (this.plantillasSharedCollection = plantillas)); + } + + protected createFromForm(): IPPreguntaAbierta { + return { + ...new PPreguntaAbierta(), + id: this.editForm.get(['id'])!.value, + nombre: this.editForm.get(['nombre'])!.value, + opcional: this.editForm.get(['opcional'])!.value, + orden: this.editForm.get(['orden'])!.value, + plantilla: this.editForm.get(['plantilla'])!.value, + }; + } +} diff --git a/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/delete/p-pregunta-cerrada-opcion-delete-dialog.component.html b/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/delete/p-pregunta-cerrada-opcion-delete-dialog.component.html new file mode 100644 index 0000000..7bcffc0 --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/delete/p-pregunta-cerrada-opcion-delete-dialog.component.html @@ -0,0 +1,31 @@ +
+ + + + + +
diff --git a/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/delete/p-pregunta-cerrada-opcion-delete-dialog.component.spec.ts b/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/delete/p-pregunta-cerrada-opcion-delete-dialog.component.spec.ts new file mode 100644 index 0000000..4e8c760 --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/delete/p-pregunta-cerrada-opcion-delete-dialog.component.spec.ts @@ -0,0 +1,65 @@ +jest.mock('@ng-bootstrap/ng-bootstrap'); + +import { ComponentFixture, TestBed, inject, fakeAsync, tick } from '@angular/core/testing'; +import { HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { of } from 'rxjs'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; + +import { PPreguntaCerradaOpcionService } from '../service/p-pregunta-cerrada-opcion.service'; + +import { PPreguntaCerradaOpcionDeleteDialogComponent } from './p-pregunta-cerrada-opcion-delete-dialog.component'; + +describe('Component Tests', () => { + describe('PPreguntaCerradaOpcion Management Delete Component', () => { + let comp: PPreguntaCerradaOpcionDeleteDialogComponent; + let fixture: ComponentFixture; + let service: PPreguntaCerradaOpcionService; + let mockActiveModal: NgbActiveModal; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [PPreguntaCerradaOpcionDeleteDialogComponent], + providers: [NgbActiveModal], + }) + .overrideTemplate(PPreguntaCerradaOpcionDeleteDialogComponent, '') + .compileComponents(); + fixture = TestBed.createComponent(PPreguntaCerradaOpcionDeleteDialogComponent); + comp = fixture.componentInstance; + service = TestBed.inject(PPreguntaCerradaOpcionService); + mockActiveModal = TestBed.inject(NgbActiveModal); + }); + + describe('confirmDelete', () => { + it('Should call delete service on confirmDelete', inject( + [], + fakeAsync(() => { + // GIVEN + jest.spyOn(service, 'delete').mockReturnValue(of(new HttpResponse({}))); + + // WHEN + comp.confirmDelete(123); + tick(); + + // THEN + expect(service.delete).toHaveBeenCalledWith(123); + expect(mockActiveModal.close).toHaveBeenCalledWith('deleted'); + }) + )); + + it('Should not call delete service on clear', () => { + // GIVEN + jest.spyOn(service, 'delete'); + + // WHEN + comp.cancel(); + + // THEN + expect(service.delete).not.toHaveBeenCalled(); + expect(mockActiveModal.close).not.toHaveBeenCalled(); + expect(mockActiveModal.dismiss).toHaveBeenCalled(); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/delete/p-pregunta-cerrada-opcion-delete-dialog.component.ts b/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/delete/p-pregunta-cerrada-opcion-delete-dialog.component.ts new file mode 100644 index 0000000..a68f8ef --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/delete/p-pregunta-cerrada-opcion-delete-dialog.component.ts @@ -0,0 +1,24 @@ +import { Component } from '@angular/core'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; + +import { IPPreguntaCerradaOpcion } from '../p-pregunta-cerrada-opcion.model'; +import { PPreguntaCerradaOpcionService } from '../service/p-pregunta-cerrada-opcion.service'; + +@Component({ + templateUrl: './p-pregunta-cerrada-opcion-delete-dialog.component.html', +}) +export class PPreguntaCerradaOpcionDeleteDialogComponent { + pPreguntaCerradaOpcion?: IPPreguntaCerradaOpcion; + + constructor(protected pPreguntaCerradaOpcionService: PPreguntaCerradaOpcionService, protected activeModal: NgbActiveModal) {} + + cancel(): void { + this.activeModal.dismiss(); + } + + confirmDelete(id: number): void { + this.pPreguntaCerradaOpcionService.delete(id).subscribe(() => { + this.activeModal.close('deleted'); + }); + } +} diff --git a/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/detail/p-pregunta-cerrada-opcion-detail.component.html b/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/detail/p-pregunta-cerrada-opcion-detail.component.html new file mode 100644 index 0000000..c3f6016 --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/detail/p-pregunta-cerrada-opcion-detail.component.html @@ -0,0 +1,46 @@ +
+
+
+

+ P Pregunta Cerrada Opcion +

+ +
+ + + + + +
+
ID
+
+ {{ pPreguntaCerradaOpcion.id }} +
+
Nombre
+
+ {{ pPreguntaCerradaOpcion.nombre }} +
+
Orden
+
+ {{ pPreguntaCerradaOpcion.orden }} +
+
P Pregunta Cerrada
+
+ +
+
+ + + + +
+
+
diff --git a/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/detail/p-pregunta-cerrada-opcion-detail.component.spec.ts b/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/detail/p-pregunta-cerrada-opcion-detail.component.spec.ts new file mode 100644 index 0000000..c27ab27 --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/detail/p-pregunta-cerrada-opcion-detail.component.spec.ts @@ -0,0 +1,38 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { ActivatedRoute } from '@angular/router'; +import { of } from 'rxjs'; + +import { PPreguntaCerradaOpcionDetailComponent } from './p-pregunta-cerrada-opcion-detail.component'; + +describe('Component Tests', () => { + describe('PPreguntaCerradaOpcion Management Detail Component', () => { + let comp: PPreguntaCerradaOpcionDetailComponent; + let fixture: ComponentFixture; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [PPreguntaCerradaOpcionDetailComponent], + providers: [ + { + provide: ActivatedRoute, + useValue: { data: of({ pPreguntaCerradaOpcion: { id: 123 } }) }, + }, + ], + }) + .overrideTemplate(PPreguntaCerradaOpcionDetailComponent, '') + .compileComponents(); + fixture = TestBed.createComponent(PPreguntaCerradaOpcionDetailComponent); + comp = fixture.componentInstance; + }); + + describe('OnInit', () => { + it('Should load pPreguntaCerradaOpcion on init', () => { + // WHEN + comp.ngOnInit(); + + // THEN + expect(comp.pPreguntaCerradaOpcion).toEqual(expect.objectContaining({ id: 123 })); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/detail/p-pregunta-cerrada-opcion-detail.component.ts b/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/detail/p-pregunta-cerrada-opcion-detail.component.ts new file mode 100644 index 0000000..b8f7d50 --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/detail/p-pregunta-cerrada-opcion-detail.component.ts @@ -0,0 +1,24 @@ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; + +import { IPPreguntaCerradaOpcion } from '../p-pregunta-cerrada-opcion.model'; + +@Component({ + selector: 'jhi-p-pregunta-cerrada-opcion-detail', + templateUrl: './p-pregunta-cerrada-opcion-detail.component.html', +}) +export class PPreguntaCerradaOpcionDetailComponent implements OnInit { + pPreguntaCerradaOpcion: IPPreguntaCerradaOpcion | null = null; + + constructor(protected activatedRoute: ActivatedRoute) {} + + ngOnInit(): void { + this.activatedRoute.data.subscribe(({ pPreguntaCerradaOpcion }) => { + this.pPreguntaCerradaOpcion = pPreguntaCerradaOpcion; + }); + } + + previousState(): void { + window.history.back(); + } +} diff --git a/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/list/p-pregunta-cerrada-opcion.component.html b/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/list/p-pregunta-cerrada-opcion.component.html new file mode 100644 index 0000000..0708b7e --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/list/p-pregunta-cerrada-opcion.component.html @@ -0,0 +1,88 @@ +
+

+ P Pregunta Cerrada Opcions + +
+ + + +
+

+ + + + + +
+ No pPreguntaCerradaOpcions found +
+ +
+ + + + + + + + + + + + + + + + + + + +
IDNombreOrdenP Pregunta Cerrada
+ {{ pPreguntaCerradaOpcion.id }} + {{ pPreguntaCerradaOpcion.nombre }}{{ pPreguntaCerradaOpcion.orden }} + + +
+ + + + + +
+
+
+
diff --git a/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/list/p-pregunta-cerrada-opcion.component.spec.ts b/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/list/p-pregunta-cerrada-opcion.component.spec.ts new file mode 100644 index 0000000..40eea30 --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/list/p-pregunta-cerrada-opcion.component.spec.ts @@ -0,0 +1,48 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { HttpHeaders, HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { of } from 'rxjs'; + +import { PPreguntaCerradaOpcionService } from '../service/p-pregunta-cerrada-opcion.service'; + +import { PPreguntaCerradaOpcionComponent } from './p-pregunta-cerrada-opcion.component'; + +describe('Component Tests', () => { + describe('PPreguntaCerradaOpcion Management Component', () => { + let comp: PPreguntaCerradaOpcionComponent; + let fixture: ComponentFixture; + let service: PPreguntaCerradaOpcionService; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [PPreguntaCerradaOpcionComponent], + }) + .overrideTemplate(PPreguntaCerradaOpcionComponent, '') + .compileComponents(); + + fixture = TestBed.createComponent(PPreguntaCerradaOpcionComponent); + comp = fixture.componentInstance; + service = TestBed.inject(PPreguntaCerradaOpcionService); + + const headers = new HttpHeaders().append('link', 'link;link'); + jest.spyOn(service, 'query').mockReturnValue( + of( + new HttpResponse({ + body: [{ id: 123 }], + headers, + }) + ) + ); + }); + + it('Should call load all on init', () => { + // WHEN + comp.ngOnInit(); + + // THEN + expect(service.query).toHaveBeenCalled(); + expect(comp.pPreguntaCerradaOpcions?.[0]).toEqual(expect.objectContaining({ id: 123 })); + }); + }); +}); diff --git a/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/list/p-pregunta-cerrada-opcion.component.ts b/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/list/p-pregunta-cerrada-opcion.component.ts new file mode 100644 index 0000000..6c4a99f --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/list/p-pregunta-cerrada-opcion.component.ts @@ -0,0 +1,51 @@ +import { Component, OnInit } from '@angular/core'; +import { HttpResponse } from '@angular/common/http'; +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; + +import { IPPreguntaCerradaOpcion } from '../p-pregunta-cerrada-opcion.model'; +import { PPreguntaCerradaOpcionService } from '../service/p-pregunta-cerrada-opcion.service'; +import { PPreguntaCerradaOpcionDeleteDialogComponent } from '../delete/p-pregunta-cerrada-opcion-delete-dialog.component'; + +@Component({ + selector: 'jhi-p-pregunta-cerrada-opcion', + templateUrl: './p-pregunta-cerrada-opcion.component.html', +}) +export class PPreguntaCerradaOpcionComponent implements OnInit { + pPreguntaCerradaOpcions?: IPPreguntaCerradaOpcion[]; + isLoading = false; + + constructor(protected pPreguntaCerradaOpcionService: PPreguntaCerradaOpcionService, protected modalService: NgbModal) {} + + loadAll(): void { + this.isLoading = true; + + this.pPreguntaCerradaOpcionService.query().subscribe( + (res: HttpResponse) => { + this.isLoading = false; + this.pPreguntaCerradaOpcions = res.body ?? []; + }, + () => { + this.isLoading = false; + } + ); + } + + ngOnInit(): void { + this.loadAll(); + } + + trackId(index: number, item: IPPreguntaCerradaOpcion): number { + return item.id!; + } + + delete(pPreguntaCerradaOpcion: IPPreguntaCerradaOpcion): void { + const modalRef = this.modalService.open(PPreguntaCerradaOpcionDeleteDialogComponent, { size: 'lg', backdrop: 'static' }); + modalRef.componentInstance.pPreguntaCerradaOpcion = pPreguntaCerradaOpcion; + // unsubscribe not needed because closed completes on modal close + modalRef.closed.subscribe(reason => { + if (reason === 'deleted') { + this.loadAll(); + } + }); + } +} diff --git a/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/p-pregunta-cerrada-opcion.model.ts b/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/p-pregunta-cerrada-opcion.model.ts new file mode 100644 index 0000000..3085be0 --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/p-pregunta-cerrada-opcion.model.ts @@ -0,0 +1,16 @@ +import { IPPreguntaCerrada } from 'app/entities/p-pregunta-cerrada/p-pregunta-cerrada.model'; + +export interface IPPreguntaCerradaOpcion { + id?: number; + nombre?: string; + orden?: number; + pPreguntaCerrada?: IPPreguntaCerrada | null; +} + +export class PPreguntaCerradaOpcion implements IPPreguntaCerradaOpcion { + constructor(public id?: number, public nombre?: string, public orden?: number, public pPreguntaCerrada?: IPPreguntaCerrada | null) {} +} + +export function getPPreguntaCerradaOpcionIdentifier(pPreguntaCerradaOpcion: IPPreguntaCerradaOpcion): number | undefined { + return pPreguntaCerradaOpcion.id; +} diff --git a/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/p-pregunta-cerrada-opcion.module.ts b/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/p-pregunta-cerrada-opcion.module.ts new file mode 100644 index 0000000..efdeb6f --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/p-pregunta-cerrada-opcion.module.ts @@ -0,0 +1,19 @@ +import { NgModule } from '@angular/core'; +import { SharedModule } from 'app/shared/shared.module'; +import { PPreguntaCerradaOpcionComponent } from './list/p-pregunta-cerrada-opcion.component'; +import { PPreguntaCerradaOpcionDetailComponent } from './detail/p-pregunta-cerrada-opcion-detail.component'; +import { PPreguntaCerradaOpcionUpdateComponent } from './update/p-pregunta-cerrada-opcion-update.component'; +import { PPreguntaCerradaOpcionDeleteDialogComponent } from './delete/p-pregunta-cerrada-opcion-delete-dialog.component'; +import { PPreguntaCerradaOpcionRoutingModule } from './route/p-pregunta-cerrada-opcion-routing.module'; + +@NgModule({ + imports: [SharedModule, PPreguntaCerradaOpcionRoutingModule], + declarations: [ + PPreguntaCerradaOpcionComponent, + PPreguntaCerradaOpcionDetailComponent, + PPreguntaCerradaOpcionUpdateComponent, + PPreguntaCerradaOpcionDeleteDialogComponent, + ], + entryComponents: [PPreguntaCerradaOpcionDeleteDialogComponent], +}) +export class PPreguntaCerradaOpcionModule {} diff --git a/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/route/p-pregunta-cerrada-opcion-routing-resolve.service.spec.ts b/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/route/p-pregunta-cerrada-opcion-routing-resolve.service.spec.ts new file mode 100644 index 0000000..5d4e20e --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/route/p-pregunta-cerrada-opcion-routing-resolve.service.spec.ts @@ -0,0 +1,82 @@ +jest.mock('@angular/router'); + +import { TestBed } from '@angular/core/testing'; +import { HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { ActivatedRouteSnapshot, Router } from '@angular/router'; +import { of } from 'rxjs'; + +import { IPPreguntaCerradaOpcion, PPreguntaCerradaOpcion } from '../p-pregunta-cerrada-opcion.model'; +import { PPreguntaCerradaOpcionService } from '../service/p-pregunta-cerrada-opcion.service'; + +import { PPreguntaCerradaOpcionRoutingResolveService } from './p-pregunta-cerrada-opcion-routing-resolve.service'; + +describe('Service Tests', () => { + describe('PPreguntaCerradaOpcion routing resolve service', () => { + let mockRouter: Router; + let mockActivatedRouteSnapshot: ActivatedRouteSnapshot; + let routingResolveService: PPreguntaCerradaOpcionRoutingResolveService; + let service: PPreguntaCerradaOpcionService; + let resultPPreguntaCerradaOpcion: IPPreguntaCerradaOpcion | undefined; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [Router, ActivatedRouteSnapshot], + }); + mockRouter = TestBed.inject(Router); + mockActivatedRouteSnapshot = TestBed.inject(ActivatedRouteSnapshot); + routingResolveService = TestBed.inject(PPreguntaCerradaOpcionRoutingResolveService); + service = TestBed.inject(PPreguntaCerradaOpcionService); + resultPPreguntaCerradaOpcion = undefined; + }); + + describe('resolve', () => { + it('should return IPPreguntaCerradaOpcion returned by find', () => { + // GIVEN + service.find = jest.fn(id => of(new HttpResponse({ body: { id } }))); + mockActivatedRouteSnapshot.params = { id: 123 }; + + // WHEN + routingResolveService.resolve(mockActivatedRouteSnapshot).subscribe(result => { + resultPPreguntaCerradaOpcion = result; + }); + + // THEN + expect(service.find).toBeCalledWith(123); + expect(resultPPreguntaCerradaOpcion).toEqual({ id: 123 }); + }); + + it('should return new IPPreguntaCerradaOpcion if id is not provided', () => { + // GIVEN + service.find = jest.fn(); + mockActivatedRouteSnapshot.params = {}; + + // WHEN + routingResolveService.resolve(mockActivatedRouteSnapshot).subscribe(result => { + resultPPreguntaCerradaOpcion = result; + }); + + // THEN + expect(service.find).not.toBeCalled(); + expect(resultPPreguntaCerradaOpcion).toEqual(new PPreguntaCerradaOpcion()); + }); + + it('should route to 404 page if data not found in server', () => { + // GIVEN + jest.spyOn(service, 'find').mockReturnValue(of(new HttpResponse({ body: null as unknown as PPreguntaCerradaOpcion }))); + mockActivatedRouteSnapshot.params = { id: 123 }; + + // WHEN + routingResolveService.resolve(mockActivatedRouteSnapshot).subscribe(result => { + resultPPreguntaCerradaOpcion = result; + }); + + // THEN + expect(service.find).toBeCalledWith(123); + expect(resultPPreguntaCerradaOpcion).toEqual(undefined); + expect(mockRouter.navigate).toHaveBeenCalledWith(['404']); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/route/p-pregunta-cerrada-opcion-routing-resolve.service.ts b/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/route/p-pregunta-cerrada-opcion-routing-resolve.service.ts new file mode 100644 index 0000000..d2467c1 --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/route/p-pregunta-cerrada-opcion-routing-resolve.service.ts @@ -0,0 +1,30 @@ +import { Injectable } from '@angular/core'; +import { HttpResponse } from '@angular/common/http'; +import { Resolve, ActivatedRouteSnapshot, Router } from '@angular/router'; +import { Observable, of, EMPTY } from 'rxjs'; +import { mergeMap } from 'rxjs/operators'; + +import { IPPreguntaCerradaOpcion, PPreguntaCerradaOpcion } from '../p-pregunta-cerrada-opcion.model'; +import { PPreguntaCerradaOpcionService } from '../service/p-pregunta-cerrada-opcion.service'; + +@Injectable({ providedIn: 'root' }) +export class PPreguntaCerradaOpcionRoutingResolveService implements Resolve { + constructor(protected service: PPreguntaCerradaOpcionService, protected router: Router) {} + + resolve(route: ActivatedRouteSnapshot): Observable | Observable { + const id = route.params['id']; + if (id) { + return this.service.find(id).pipe( + mergeMap((pPreguntaCerradaOpcion: HttpResponse) => { + if (pPreguntaCerradaOpcion.body) { + return of(pPreguntaCerradaOpcion.body); + } else { + this.router.navigate(['404']); + return EMPTY; + } + }) + ); + } + return of(new PPreguntaCerradaOpcion()); + } +} diff --git a/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/route/p-pregunta-cerrada-opcion-routing.module.ts b/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/route/p-pregunta-cerrada-opcion-routing.module.ts new file mode 100644 index 0000000..c8442cb --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/route/p-pregunta-cerrada-opcion-routing.module.ts @@ -0,0 +1,46 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; + +import { UserRouteAccessService } from 'app/core/auth/user-route-access.service'; +import { PPreguntaCerradaOpcionComponent } from '../list/p-pregunta-cerrada-opcion.component'; +import { PPreguntaCerradaOpcionDetailComponent } from '../detail/p-pregunta-cerrada-opcion-detail.component'; +import { PPreguntaCerradaOpcionUpdateComponent } from '../update/p-pregunta-cerrada-opcion-update.component'; +import { PPreguntaCerradaOpcionRoutingResolveService } from './p-pregunta-cerrada-opcion-routing-resolve.service'; + +const pPreguntaCerradaOpcionRoute: Routes = [ + { + path: '', + component: PPreguntaCerradaOpcionComponent, + canActivate: [UserRouteAccessService], + }, + { + path: ':id/view', + component: PPreguntaCerradaOpcionDetailComponent, + resolve: { + pPreguntaCerradaOpcion: PPreguntaCerradaOpcionRoutingResolveService, + }, + canActivate: [UserRouteAccessService], + }, + { + path: 'new', + component: PPreguntaCerradaOpcionUpdateComponent, + resolve: { + pPreguntaCerradaOpcion: PPreguntaCerradaOpcionRoutingResolveService, + }, + canActivate: [UserRouteAccessService], + }, + { + path: ':id/edit', + component: PPreguntaCerradaOpcionUpdateComponent, + resolve: { + pPreguntaCerradaOpcion: PPreguntaCerradaOpcionRoutingResolveService, + }, + canActivate: [UserRouteAccessService], + }, +]; + +@NgModule({ + imports: [RouterModule.forChild(pPreguntaCerradaOpcionRoute)], + exports: [RouterModule], +}) +export class PPreguntaCerradaOpcionRoutingModule {} diff --git a/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/service/p-pregunta-cerrada-opcion.service.spec.ts b/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/service/p-pregunta-cerrada-opcion.service.spec.ts new file mode 100644 index 0000000..2a6b119 --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/service/p-pregunta-cerrada-opcion.service.spec.ts @@ -0,0 +1,190 @@ +import { TestBed } from '@angular/core/testing'; +import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; + +import { IPPreguntaCerradaOpcion, PPreguntaCerradaOpcion } from '../p-pregunta-cerrada-opcion.model'; + +import { PPreguntaCerradaOpcionService } from './p-pregunta-cerrada-opcion.service'; + +describe('Service Tests', () => { + describe('PPreguntaCerradaOpcion Service', () => { + let service: PPreguntaCerradaOpcionService; + let httpMock: HttpTestingController; + let elemDefault: IPPreguntaCerradaOpcion; + let expectedResult: IPPreguntaCerradaOpcion | IPPreguntaCerradaOpcion[] | boolean | null; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + }); + expectedResult = null; + service = TestBed.inject(PPreguntaCerradaOpcionService); + httpMock = TestBed.inject(HttpTestingController); + + elemDefault = { + id: 0, + nombre: 'AAAAAAA', + orden: 0, + }; + }); + + describe('Service methods', () => { + it('should find an element', () => { + const returnedFromService = Object.assign({}, elemDefault); + + service.find(123).subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'GET' }); + req.flush(returnedFromService); + expect(expectedResult).toMatchObject(elemDefault); + }); + + it('should create a PPreguntaCerradaOpcion', () => { + const returnedFromService = Object.assign( + { + id: 0, + }, + elemDefault + ); + + const expected = Object.assign({}, returnedFromService); + + service.create(new PPreguntaCerradaOpcion()).subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'POST' }); + req.flush(returnedFromService); + expect(expectedResult).toMatchObject(expected); + }); + + it('should update a PPreguntaCerradaOpcion', () => { + const returnedFromService = Object.assign( + { + id: 1, + nombre: 'BBBBBB', + orden: 1, + }, + elemDefault + ); + + const expected = Object.assign({}, returnedFromService); + + service.update(expected).subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'PUT' }); + req.flush(returnedFromService); + expect(expectedResult).toMatchObject(expected); + }); + + it('should partial update a PPreguntaCerradaOpcion', () => { + const patchObject = Object.assign( + { + nombre: 'BBBBBB', + }, + new PPreguntaCerradaOpcion() + ); + + const returnedFromService = Object.assign(patchObject, elemDefault); + + const expected = Object.assign({}, returnedFromService); + + service.partialUpdate(patchObject).subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'PATCH' }); + req.flush(returnedFromService); + expect(expectedResult).toMatchObject(expected); + }); + + it('should return a list of PPreguntaCerradaOpcion', () => { + const returnedFromService = Object.assign( + { + id: 1, + nombre: 'BBBBBB', + orden: 1, + }, + elemDefault + ); + + const expected = Object.assign({}, returnedFromService); + + service.query().subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'GET' }); + req.flush([returnedFromService]); + httpMock.verify(); + expect(expectedResult).toContainEqual(expected); + }); + + it('should delete a PPreguntaCerradaOpcion', () => { + service.delete(123).subscribe(resp => (expectedResult = resp.ok)); + + const req = httpMock.expectOne({ method: 'DELETE' }); + req.flush({ status: 200 }); + expect(expectedResult); + }); + + describe('addPPreguntaCerradaOpcionToCollectionIfMissing', () => { + it('should add a PPreguntaCerradaOpcion to an empty array', () => { + const pPreguntaCerradaOpcion: IPPreguntaCerradaOpcion = { id: 123 }; + expectedResult = service.addPPreguntaCerradaOpcionToCollectionIfMissing([], pPreguntaCerradaOpcion); + expect(expectedResult).toHaveLength(1); + expect(expectedResult).toContain(pPreguntaCerradaOpcion); + }); + + it('should not add a PPreguntaCerradaOpcion to an array that contains it', () => { + const pPreguntaCerradaOpcion: IPPreguntaCerradaOpcion = { id: 123 }; + const pPreguntaCerradaOpcionCollection: IPPreguntaCerradaOpcion[] = [ + { + ...pPreguntaCerradaOpcion, + }, + { id: 456 }, + ]; + expectedResult = service.addPPreguntaCerradaOpcionToCollectionIfMissing(pPreguntaCerradaOpcionCollection, pPreguntaCerradaOpcion); + expect(expectedResult).toHaveLength(2); + }); + + it("should add a PPreguntaCerradaOpcion to an array that doesn't contain it", () => { + const pPreguntaCerradaOpcion: IPPreguntaCerradaOpcion = { id: 123 }; + const pPreguntaCerradaOpcionCollection: IPPreguntaCerradaOpcion[] = [{ id: 456 }]; + expectedResult = service.addPPreguntaCerradaOpcionToCollectionIfMissing(pPreguntaCerradaOpcionCollection, pPreguntaCerradaOpcion); + expect(expectedResult).toHaveLength(2); + expect(expectedResult).toContain(pPreguntaCerradaOpcion); + }); + + it('should add only unique PPreguntaCerradaOpcion to an array', () => { + const pPreguntaCerradaOpcionArray: IPPreguntaCerradaOpcion[] = [{ id: 123 }, { id: 456 }, { id: 45750 }]; + const pPreguntaCerradaOpcionCollection: IPPreguntaCerradaOpcion[] = [{ id: 123 }]; + expectedResult = service.addPPreguntaCerradaOpcionToCollectionIfMissing( + pPreguntaCerradaOpcionCollection, + ...pPreguntaCerradaOpcionArray + ); + expect(expectedResult).toHaveLength(3); + }); + + it('should accept varargs', () => { + const pPreguntaCerradaOpcion: IPPreguntaCerradaOpcion = { id: 123 }; + const pPreguntaCerradaOpcion2: IPPreguntaCerradaOpcion = { id: 456 }; + expectedResult = service.addPPreguntaCerradaOpcionToCollectionIfMissing([], pPreguntaCerradaOpcion, pPreguntaCerradaOpcion2); + expect(expectedResult).toHaveLength(2); + expect(expectedResult).toContain(pPreguntaCerradaOpcion); + expect(expectedResult).toContain(pPreguntaCerradaOpcion2); + }); + + it('should accept null and undefined values', () => { + const pPreguntaCerradaOpcion: IPPreguntaCerradaOpcion = { id: 123 }; + expectedResult = service.addPPreguntaCerradaOpcionToCollectionIfMissing([], null, pPreguntaCerradaOpcion, undefined); + expect(expectedResult).toHaveLength(1); + expect(expectedResult).toContain(pPreguntaCerradaOpcion); + }); + + it('should return initial array if no PPreguntaCerradaOpcion is added', () => { + const pPreguntaCerradaOpcionCollection: IPPreguntaCerradaOpcion[] = [{ id: 123 }]; + expectedResult = service.addPPreguntaCerradaOpcionToCollectionIfMissing(pPreguntaCerradaOpcionCollection, undefined, null); + expect(expectedResult).toEqual(pPreguntaCerradaOpcionCollection); + }); + }); + }); + + afterEach(() => { + httpMock.verify(); + }); + }); +}); diff --git a/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/service/p-pregunta-cerrada-opcion.service.ts b/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/service/p-pregunta-cerrada-opcion.service.ts new file mode 100644 index 0000000..0edd78f --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/service/p-pregunta-cerrada-opcion.service.ts @@ -0,0 +1,76 @@ +import { Injectable } from '@angular/core'; +import { HttpClient, HttpResponse } from '@angular/common/http'; +import { Observable } from 'rxjs'; + +import { isPresent } from 'app/core/util/operators'; +import { ApplicationConfigService } from 'app/core/config/application-config.service'; +import { createRequestOption } from 'app/core/request/request-util'; +import { IPPreguntaCerradaOpcion, getPPreguntaCerradaOpcionIdentifier } from '../p-pregunta-cerrada-opcion.model'; + +export type EntityResponseType = HttpResponse; +export type EntityArrayResponseType = HttpResponse; + +@Injectable({ providedIn: 'root' }) +export class PPreguntaCerradaOpcionService { + protected resourceUrl = this.applicationConfigService.getEndpointFor('api/p-pregunta-cerrada-opcions'); + + constructor(protected http: HttpClient, protected applicationConfigService: ApplicationConfigService) {} + + create(pPreguntaCerradaOpcion: IPPreguntaCerradaOpcion): Observable { + return this.http.post(this.resourceUrl, pPreguntaCerradaOpcion, { observe: 'response' }); + } + + update(pPreguntaCerradaOpcion: IPPreguntaCerradaOpcion): Observable { + return this.http.put( + `${this.resourceUrl}/${getPPreguntaCerradaOpcionIdentifier(pPreguntaCerradaOpcion) as number}`, + pPreguntaCerradaOpcion, + { observe: 'response' } + ); + } + + partialUpdate(pPreguntaCerradaOpcion: IPPreguntaCerradaOpcion): Observable { + return this.http.patch( + `${this.resourceUrl}/${getPPreguntaCerradaOpcionIdentifier(pPreguntaCerradaOpcion) as number}`, + pPreguntaCerradaOpcion, + { observe: 'response' } + ); + } + + find(id: number): Observable { + return this.http.get(`${this.resourceUrl}/${id}`, { observe: 'response' }); + } + + query(req?: any): Observable { + const options = createRequestOption(req); + return this.http.get(this.resourceUrl, { params: options, observe: 'response' }); + } + + delete(id: number): Observable> { + return this.http.delete(`${this.resourceUrl}/${id}`, { observe: 'response' }); + } + + addPPreguntaCerradaOpcionToCollectionIfMissing( + pPreguntaCerradaOpcionCollection: IPPreguntaCerradaOpcion[], + ...pPreguntaCerradaOpcionsToCheck: (IPPreguntaCerradaOpcion | null | undefined)[] + ): IPPreguntaCerradaOpcion[] { + const pPreguntaCerradaOpcions: IPPreguntaCerradaOpcion[] = pPreguntaCerradaOpcionsToCheck.filter(isPresent); + if (pPreguntaCerradaOpcions.length > 0) { + const pPreguntaCerradaOpcionCollectionIdentifiers = pPreguntaCerradaOpcionCollection.map( + pPreguntaCerradaOpcionItem => getPPreguntaCerradaOpcionIdentifier(pPreguntaCerradaOpcionItem)! + ); + const pPreguntaCerradaOpcionsToAdd = pPreguntaCerradaOpcions.filter(pPreguntaCerradaOpcionItem => { + const pPreguntaCerradaOpcionIdentifier = getPPreguntaCerradaOpcionIdentifier(pPreguntaCerradaOpcionItem); + if ( + pPreguntaCerradaOpcionIdentifier == null || + pPreguntaCerradaOpcionCollectionIdentifiers.includes(pPreguntaCerradaOpcionIdentifier) + ) { + return false; + } + pPreguntaCerradaOpcionCollectionIdentifiers.push(pPreguntaCerradaOpcionIdentifier); + return true; + }); + return [...pPreguntaCerradaOpcionsToAdd, ...pPreguntaCerradaOpcionCollection]; + } + return pPreguntaCerradaOpcionCollection; + } +} diff --git a/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/update/p-pregunta-cerrada-opcion-update.component.html b/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/update/p-pregunta-cerrada-opcion-update.component.html new file mode 100644 index 0000000..8e3d5a8 --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/update/p-pregunta-cerrada-opcion-update.component.html @@ -0,0 +1,105 @@ +
+
+
+

+ Create or edit a P Pregunta Cerrada Opcion +

+ +
+ + +
+ + +
+ +
+ + +
+ + This field is required. + + + This field is required to be at least 1 characters. + + + This field cannot be longer than 500 characters. + +
+
+ +
+ + +
+ + This field is required. + + + This field should be a number. + +
+
+ +
+ + +
+
+ +
+ + + +
+
+
+
diff --git a/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/update/p-pregunta-cerrada-opcion-update.component.spec.ts b/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/update/p-pregunta-cerrada-opcion-update.component.spec.ts new file mode 100644 index 0000000..75056f5 --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/update/p-pregunta-cerrada-opcion-update.component.spec.ts @@ -0,0 +1,152 @@ +jest.mock('@angular/router'); + +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { FormBuilder } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; +import { of, Subject } from 'rxjs'; + +import { PPreguntaCerradaOpcionService } from '../service/p-pregunta-cerrada-opcion.service'; +import { IPPreguntaCerradaOpcion, PPreguntaCerradaOpcion } from '../p-pregunta-cerrada-opcion.model'; +import { IPPreguntaCerrada } from 'app/entities/p-pregunta-cerrada/p-pregunta-cerrada.model'; +import { PPreguntaCerradaService } from 'app/entities/p-pregunta-cerrada/service/p-pregunta-cerrada.service'; + +import { PPreguntaCerradaOpcionUpdateComponent } from './p-pregunta-cerrada-opcion-update.component'; + +describe('Component Tests', () => { + describe('PPreguntaCerradaOpcion Management Update Component', () => { + let comp: PPreguntaCerradaOpcionUpdateComponent; + let fixture: ComponentFixture; + let activatedRoute: ActivatedRoute; + let pPreguntaCerradaOpcionService: PPreguntaCerradaOpcionService; + let pPreguntaCerradaService: PPreguntaCerradaService; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [PPreguntaCerradaOpcionUpdateComponent], + providers: [FormBuilder, ActivatedRoute], + }) + .overrideTemplate(PPreguntaCerradaOpcionUpdateComponent, '') + .compileComponents(); + + fixture = TestBed.createComponent(PPreguntaCerradaOpcionUpdateComponent); + activatedRoute = TestBed.inject(ActivatedRoute); + pPreguntaCerradaOpcionService = TestBed.inject(PPreguntaCerradaOpcionService); + pPreguntaCerradaService = TestBed.inject(PPreguntaCerradaService); + + comp = fixture.componentInstance; + }); + + describe('ngOnInit', () => { + it('Should call PPreguntaCerrada query and add missing value', () => { + const pPreguntaCerradaOpcion: IPPreguntaCerradaOpcion = { id: 456 }; + const pPreguntaCerrada: IPPreguntaCerrada = { id: 81712 }; + pPreguntaCerradaOpcion.pPreguntaCerrada = pPreguntaCerrada; + + const pPreguntaCerradaCollection: IPPreguntaCerrada[] = [{ id: 88109 }]; + jest.spyOn(pPreguntaCerradaService, 'query').mockReturnValue(of(new HttpResponse({ body: pPreguntaCerradaCollection }))); + const additionalPPreguntaCerradas = [pPreguntaCerrada]; + const expectedCollection: IPPreguntaCerrada[] = [...additionalPPreguntaCerradas, ...pPreguntaCerradaCollection]; + jest.spyOn(pPreguntaCerradaService, 'addPPreguntaCerradaToCollectionIfMissing').mockReturnValue(expectedCollection); + + activatedRoute.data = of({ pPreguntaCerradaOpcion }); + comp.ngOnInit(); + + expect(pPreguntaCerradaService.query).toHaveBeenCalled(); + expect(pPreguntaCerradaService.addPPreguntaCerradaToCollectionIfMissing).toHaveBeenCalledWith( + pPreguntaCerradaCollection, + ...additionalPPreguntaCerradas + ); + expect(comp.pPreguntaCerradasSharedCollection).toEqual(expectedCollection); + }); + + it('Should update editForm', () => { + const pPreguntaCerradaOpcion: IPPreguntaCerradaOpcion = { id: 456 }; + const pPreguntaCerrada: IPPreguntaCerrada = { id: 91913 }; + pPreguntaCerradaOpcion.pPreguntaCerrada = pPreguntaCerrada; + + activatedRoute.data = of({ pPreguntaCerradaOpcion }); + comp.ngOnInit(); + + expect(comp.editForm.value).toEqual(expect.objectContaining(pPreguntaCerradaOpcion)); + expect(comp.pPreguntaCerradasSharedCollection).toContain(pPreguntaCerrada); + }); + }); + + describe('save', () => { + it('Should call update service on save for existing entity', () => { + // GIVEN + const saveSubject = new Subject>(); + const pPreguntaCerradaOpcion = { id: 123 }; + jest.spyOn(pPreguntaCerradaOpcionService, 'update').mockReturnValue(saveSubject); + jest.spyOn(comp, 'previousState'); + activatedRoute.data = of({ pPreguntaCerradaOpcion }); + comp.ngOnInit(); + + // WHEN + comp.save(); + expect(comp.isSaving).toEqual(true); + saveSubject.next(new HttpResponse({ body: pPreguntaCerradaOpcion })); + saveSubject.complete(); + + // THEN + expect(comp.previousState).toHaveBeenCalled(); + expect(pPreguntaCerradaOpcionService.update).toHaveBeenCalledWith(pPreguntaCerradaOpcion); + expect(comp.isSaving).toEqual(false); + }); + + it('Should call create service on save for new entity', () => { + // GIVEN + const saveSubject = new Subject>(); + const pPreguntaCerradaOpcion = new PPreguntaCerradaOpcion(); + jest.spyOn(pPreguntaCerradaOpcionService, 'create').mockReturnValue(saveSubject); + jest.spyOn(comp, 'previousState'); + activatedRoute.data = of({ pPreguntaCerradaOpcion }); + comp.ngOnInit(); + + // WHEN + comp.save(); + expect(comp.isSaving).toEqual(true); + saveSubject.next(new HttpResponse({ body: pPreguntaCerradaOpcion })); + saveSubject.complete(); + + // THEN + expect(pPreguntaCerradaOpcionService.create).toHaveBeenCalledWith(pPreguntaCerradaOpcion); + expect(comp.isSaving).toEqual(false); + expect(comp.previousState).toHaveBeenCalled(); + }); + + it('Should set isSaving to false on error', () => { + // GIVEN + const saveSubject = new Subject>(); + const pPreguntaCerradaOpcion = { id: 123 }; + jest.spyOn(pPreguntaCerradaOpcionService, 'update').mockReturnValue(saveSubject); + jest.spyOn(comp, 'previousState'); + activatedRoute.data = of({ pPreguntaCerradaOpcion }); + comp.ngOnInit(); + + // WHEN + comp.save(); + expect(comp.isSaving).toEqual(true); + saveSubject.error('This is an error!'); + + // THEN + expect(pPreguntaCerradaOpcionService.update).toHaveBeenCalledWith(pPreguntaCerradaOpcion); + expect(comp.isSaving).toEqual(false); + expect(comp.previousState).not.toHaveBeenCalled(); + }); + }); + + describe('Tracking relationships identifiers', () => { + describe('trackPPreguntaCerradaById', () => { + it('Should return tracked PPreguntaCerrada primary key', () => { + const entity = { id: 123 }; + const trackResult = comp.trackPPreguntaCerradaById(0, entity); + expect(trackResult).toEqual(entity.id); + }); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/update/p-pregunta-cerrada-opcion-update.component.ts b/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/update/p-pregunta-cerrada-opcion-update.component.ts new file mode 100644 index 0000000..de8ed57 --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-cerrada-opcion/update/p-pregunta-cerrada-opcion-update.component.ts @@ -0,0 +1,119 @@ +import { Component, OnInit } from '@angular/core'; +import { HttpResponse } from '@angular/common/http'; +import { FormBuilder, Validators } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; +import { Observable } from 'rxjs'; +import { finalize, map } from 'rxjs/operators'; + +import { IPPreguntaCerradaOpcion, PPreguntaCerradaOpcion } from '../p-pregunta-cerrada-opcion.model'; +import { PPreguntaCerradaOpcionService } from '../service/p-pregunta-cerrada-opcion.service'; +import { IPPreguntaCerrada } from 'app/entities/p-pregunta-cerrada/p-pregunta-cerrada.model'; +import { PPreguntaCerradaService } from 'app/entities/p-pregunta-cerrada/service/p-pregunta-cerrada.service'; + +@Component({ + selector: 'jhi-p-pregunta-cerrada-opcion-update', + templateUrl: './p-pregunta-cerrada-opcion-update.component.html', +}) +export class PPreguntaCerradaOpcionUpdateComponent implements OnInit { + isSaving = false; + + pPreguntaCerradasSharedCollection: IPPreguntaCerrada[] = []; + + editForm = this.fb.group({ + id: [], + nombre: [null, [Validators.required, Validators.minLength(1), Validators.maxLength(500)]], + orden: [null, [Validators.required]], + pPreguntaCerrada: [], + }); + + constructor( + protected pPreguntaCerradaOpcionService: PPreguntaCerradaOpcionService, + protected pPreguntaCerradaService: PPreguntaCerradaService, + protected activatedRoute: ActivatedRoute, + protected fb: FormBuilder + ) {} + + ngOnInit(): void { + this.activatedRoute.data.subscribe(({ pPreguntaCerradaOpcion }) => { + this.updateForm(pPreguntaCerradaOpcion); + + this.loadRelationshipsOptions(); + }); + } + + previousState(): void { + window.history.back(); + } + + save(): void { + this.isSaving = true; + const pPreguntaCerradaOpcion = this.createFromForm(); + if (pPreguntaCerradaOpcion.id !== undefined) { + this.subscribeToSaveResponse(this.pPreguntaCerradaOpcionService.update(pPreguntaCerradaOpcion)); + } else { + this.subscribeToSaveResponse(this.pPreguntaCerradaOpcionService.create(pPreguntaCerradaOpcion)); + } + } + + trackPPreguntaCerradaById(index: number, item: IPPreguntaCerrada): number { + return item.id!; + } + + protected subscribeToSaveResponse(result: Observable>): void { + result.pipe(finalize(() => this.onSaveFinalize())).subscribe( + () => this.onSaveSuccess(), + () => this.onSaveError() + ); + } + + protected onSaveSuccess(): void { + this.previousState(); + } + + protected onSaveError(): void { + // Api for inheritance. + } + + protected onSaveFinalize(): void { + this.isSaving = false; + } + + protected updateForm(pPreguntaCerradaOpcion: IPPreguntaCerradaOpcion): void { + this.editForm.patchValue({ + id: pPreguntaCerradaOpcion.id, + nombre: pPreguntaCerradaOpcion.nombre, + orden: pPreguntaCerradaOpcion.orden, + pPreguntaCerrada: pPreguntaCerradaOpcion.pPreguntaCerrada, + }); + + this.pPreguntaCerradasSharedCollection = this.pPreguntaCerradaService.addPPreguntaCerradaToCollectionIfMissing( + this.pPreguntaCerradasSharedCollection, + pPreguntaCerradaOpcion.pPreguntaCerrada + ); + } + + protected loadRelationshipsOptions(): void { + this.pPreguntaCerradaService + .query() + .pipe(map((res: HttpResponse) => res.body ?? [])) + .pipe( + map((pPreguntaCerradas: IPPreguntaCerrada[]) => + this.pPreguntaCerradaService.addPPreguntaCerradaToCollectionIfMissing( + pPreguntaCerradas, + this.editForm.get('pPreguntaCerrada')!.value + ) + ) + ) + .subscribe((pPreguntaCerradas: IPPreguntaCerrada[]) => (this.pPreguntaCerradasSharedCollection = pPreguntaCerradas)); + } + + protected createFromForm(): IPPreguntaCerradaOpcion { + return { + ...new PPreguntaCerradaOpcion(), + id: this.editForm.get(['id'])!.value, + nombre: this.editForm.get(['nombre'])!.value, + orden: this.editForm.get(['orden'])!.value, + pPreguntaCerrada: this.editForm.get(['pPreguntaCerrada'])!.value, + }; + } +} diff --git a/src/main/webapp/app/entities/p-pregunta-cerrada/delete/p-pregunta-cerrada-delete-dialog.component.html b/src/main/webapp/app/entities/p-pregunta-cerrada/delete/p-pregunta-cerrada-delete-dialog.component.html new file mode 100644 index 0000000..1e85fc9 --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-cerrada/delete/p-pregunta-cerrada-delete-dialog.component.html @@ -0,0 +1,29 @@ +
+ + + + + +
diff --git a/src/main/webapp/app/entities/p-pregunta-cerrada/delete/p-pregunta-cerrada-delete-dialog.component.spec.ts b/src/main/webapp/app/entities/p-pregunta-cerrada/delete/p-pregunta-cerrada-delete-dialog.component.spec.ts new file mode 100644 index 0000000..9b8a413 --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-cerrada/delete/p-pregunta-cerrada-delete-dialog.component.spec.ts @@ -0,0 +1,65 @@ +jest.mock('@ng-bootstrap/ng-bootstrap'); + +import { ComponentFixture, TestBed, inject, fakeAsync, tick } from '@angular/core/testing'; +import { HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { of } from 'rxjs'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; + +import { PPreguntaCerradaService } from '../service/p-pregunta-cerrada.service'; + +import { PPreguntaCerradaDeleteDialogComponent } from './p-pregunta-cerrada-delete-dialog.component'; + +describe('Component Tests', () => { + describe('PPreguntaCerrada Management Delete Component', () => { + let comp: PPreguntaCerradaDeleteDialogComponent; + let fixture: ComponentFixture; + let service: PPreguntaCerradaService; + let mockActiveModal: NgbActiveModal; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [PPreguntaCerradaDeleteDialogComponent], + providers: [NgbActiveModal], + }) + .overrideTemplate(PPreguntaCerradaDeleteDialogComponent, '') + .compileComponents(); + fixture = TestBed.createComponent(PPreguntaCerradaDeleteDialogComponent); + comp = fixture.componentInstance; + service = TestBed.inject(PPreguntaCerradaService); + mockActiveModal = TestBed.inject(NgbActiveModal); + }); + + describe('confirmDelete', () => { + it('Should call delete service on confirmDelete', inject( + [], + fakeAsync(() => { + // GIVEN + jest.spyOn(service, 'delete').mockReturnValue(of(new HttpResponse({}))); + + // WHEN + comp.confirmDelete(123); + tick(); + + // THEN + expect(service.delete).toHaveBeenCalledWith(123); + expect(mockActiveModal.close).toHaveBeenCalledWith('deleted'); + }) + )); + + it('Should not call delete service on clear', () => { + // GIVEN + jest.spyOn(service, 'delete'); + + // WHEN + comp.cancel(); + + // THEN + expect(service.delete).not.toHaveBeenCalled(); + expect(mockActiveModal.close).not.toHaveBeenCalled(); + expect(mockActiveModal.dismiss).toHaveBeenCalled(); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/p-pregunta-cerrada/delete/p-pregunta-cerrada-delete-dialog.component.ts b/src/main/webapp/app/entities/p-pregunta-cerrada/delete/p-pregunta-cerrada-delete-dialog.component.ts new file mode 100644 index 0000000..4907281 --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-cerrada/delete/p-pregunta-cerrada-delete-dialog.component.ts @@ -0,0 +1,24 @@ +import { Component } from '@angular/core'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; + +import { IPPreguntaCerrada } from '../p-pregunta-cerrada.model'; +import { PPreguntaCerradaService } from '../service/p-pregunta-cerrada.service'; + +@Component({ + templateUrl: './p-pregunta-cerrada-delete-dialog.component.html', +}) +export class PPreguntaCerradaDeleteDialogComponent { + pPreguntaCerrada?: IPPreguntaCerrada; + + constructor(protected pPreguntaCerradaService: PPreguntaCerradaService, protected activeModal: NgbActiveModal) {} + + cancel(): void { + this.activeModal.dismiss(); + } + + confirmDelete(id: number): void { + this.pPreguntaCerradaService.delete(id).subscribe(() => { + this.activeModal.close('deleted'); + }); + } +} diff --git a/src/main/webapp/app/entities/p-pregunta-cerrada/detail/p-pregunta-cerrada-detail.component.html b/src/main/webapp/app/entities/p-pregunta-cerrada/detail/p-pregunta-cerrada-detail.component.html new file mode 100644 index 0000000..cc8e9ef --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-cerrada/detail/p-pregunta-cerrada-detail.component.html @@ -0,0 +1,52 @@ +
+
+
+

+ P Pregunta Cerrada +

+ +
+ + + + + +
+
ID
+
+ {{ pPreguntaCerrada.id }} +
+
Nombre
+
+ {{ pPreguntaCerrada.nombre }} +
+
Tipo
+
+ {{ pPreguntaCerrada.tipo }} +
+
Opcional
+
+ {{ pPreguntaCerrada.opcional }} +
+
Orden
+
+ {{ pPreguntaCerrada.orden }} +
+
Plantilla
+
+ +
+
+ + + + +
+
+
diff --git a/src/main/webapp/app/entities/p-pregunta-cerrada/detail/p-pregunta-cerrada-detail.component.spec.ts b/src/main/webapp/app/entities/p-pregunta-cerrada/detail/p-pregunta-cerrada-detail.component.spec.ts new file mode 100644 index 0000000..5865170 --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-cerrada/detail/p-pregunta-cerrada-detail.component.spec.ts @@ -0,0 +1,38 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { ActivatedRoute } from '@angular/router'; +import { of } from 'rxjs'; + +import { PPreguntaCerradaDetailComponent } from './p-pregunta-cerrada-detail.component'; + +describe('Component Tests', () => { + describe('PPreguntaCerrada Management Detail Component', () => { + let comp: PPreguntaCerradaDetailComponent; + let fixture: ComponentFixture; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [PPreguntaCerradaDetailComponent], + providers: [ + { + provide: ActivatedRoute, + useValue: { data: of({ pPreguntaCerrada: { id: 123 } }) }, + }, + ], + }) + .overrideTemplate(PPreguntaCerradaDetailComponent, '') + .compileComponents(); + fixture = TestBed.createComponent(PPreguntaCerradaDetailComponent); + comp = fixture.componentInstance; + }); + + describe('OnInit', () => { + it('Should load pPreguntaCerrada on init', () => { + // WHEN + comp.ngOnInit(); + + // THEN + expect(comp.pPreguntaCerrada).toEqual(expect.objectContaining({ id: 123 })); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/p-pregunta-cerrada/detail/p-pregunta-cerrada-detail.component.ts b/src/main/webapp/app/entities/p-pregunta-cerrada/detail/p-pregunta-cerrada-detail.component.ts new file mode 100644 index 0000000..ffd8525 --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-cerrada/detail/p-pregunta-cerrada-detail.component.ts @@ -0,0 +1,24 @@ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; + +import { IPPreguntaCerrada } from '../p-pregunta-cerrada.model'; + +@Component({ + selector: 'jhi-p-pregunta-cerrada-detail', + templateUrl: './p-pregunta-cerrada-detail.component.html', +}) +export class PPreguntaCerradaDetailComponent implements OnInit { + pPreguntaCerrada: IPPreguntaCerrada | null = null; + + constructor(protected activatedRoute: ActivatedRoute) {} + + ngOnInit(): void { + this.activatedRoute.data.subscribe(({ pPreguntaCerrada }) => { + this.pPreguntaCerrada = pPreguntaCerrada; + }); + } + + previousState(): void { + window.history.back(); + } +} diff --git a/src/main/webapp/app/entities/p-pregunta-cerrada/list/p-pregunta-cerrada.component.html b/src/main/webapp/app/entities/p-pregunta-cerrada/list/p-pregunta-cerrada.component.html new file mode 100644 index 0000000..35ecade --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-cerrada/list/p-pregunta-cerrada.component.html @@ -0,0 +1,90 @@ +
+

+ P Pregunta Cerradas + +
+ + + +
+

+ + + + + +
+ No pPreguntaCerradas found +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + +
IDNombreTipoOpcionalOrdenPlantilla
+ {{ pPreguntaCerrada.id }} + {{ pPreguntaCerrada.nombre }}{{ pPreguntaCerrada.tipo }}{{ pPreguntaCerrada.opcional }}{{ pPreguntaCerrada.orden }} + + +
+ + + + + +
+
+
+
diff --git a/src/main/webapp/app/entities/p-pregunta-cerrada/list/p-pregunta-cerrada.component.spec.ts b/src/main/webapp/app/entities/p-pregunta-cerrada/list/p-pregunta-cerrada.component.spec.ts new file mode 100644 index 0000000..2800474 --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-cerrada/list/p-pregunta-cerrada.component.spec.ts @@ -0,0 +1,48 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { HttpHeaders, HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { of } from 'rxjs'; + +import { PPreguntaCerradaService } from '../service/p-pregunta-cerrada.service'; + +import { PPreguntaCerradaComponent } from './p-pregunta-cerrada.component'; + +describe('Component Tests', () => { + describe('PPreguntaCerrada Management Component', () => { + let comp: PPreguntaCerradaComponent; + let fixture: ComponentFixture; + let service: PPreguntaCerradaService; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [PPreguntaCerradaComponent], + }) + .overrideTemplate(PPreguntaCerradaComponent, '') + .compileComponents(); + + fixture = TestBed.createComponent(PPreguntaCerradaComponent); + comp = fixture.componentInstance; + service = TestBed.inject(PPreguntaCerradaService); + + const headers = new HttpHeaders().append('link', 'link;link'); + jest.spyOn(service, 'query').mockReturnValue( + of( + new HttpResponse({ + body: [{ id: 123 }], + headers, + }) + ) + ); + }); + + it('Should call load all on init', () => { + // WHEN + comp.ngOnInit(); + + // THEN + expect(service.query).toHaveBeenCalled(); + expect(comp.pPreguntaCerradas?.[0]).toEqual(expect.objectContaining({ id: 123 })); + }); + }); +}); diff --git a/src/main/webapp/app/entities/p-pregunta-cerrada/list/p-pregunta-cerrada.component.ts b/src/main/webapp/app/entities/p-pregunta-cerrada/list/p-pregunta-cerrada.component.ts new file mode 100644 index 0000000..4247e4f --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-cerrada/list/p-pregunta-cerrada.component.ts @@ -0,0 +1,51 @@ +import { Component, OnInit } from '@angular/core'; +import { HttpResponse } from '@angular/common/http'; +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; + +import { IPPreguntaCerrada } from '../p-pregunta-cerrada.model'; +import { PPreguntaCerradaService } from '../service/p-pregunta-cerrada.service'; +import { PPreguntaCerradaDeleteDialogComponent } from '../delete/p-pregunta-cerrada-delete-dialog.component'; + +@Component({ + selector: 'jhi-p-pregunta-cerrada', + templateUrl: './p-pregunta-cerrada.component.html', +}) +export class PPreguntaCerradaComponent implements OnInit { + pPreguntaCerradas?: IPPreguntaCerrada[]; + isLoading = false; + + constructor(protected pPreguntaCerradaService: PPreguntaCerradaService, protected modalService: NgbModal) {} + + loadAll(): void { + this.isLoading = true; + + this.pPreguntaCerradaService.query().subscribe( + (res: HttpResponse) => { + this.isLoading = false; + this.pPreguntaCerradas = res.body ?? []; + }, + () => { + this.isLoading = false; + } + ); + } + + ngOnInit(): void { + this.loadAll(); + } + + trackId(index: number, item: IPPreguntaCerrada): number { + return item.id!; + } + + delete(pPreguntaCerrada: IPPreguntaCerrada): void { + const modalRef = this.modalService.open(PPreguntaCerradaDeleteDialogComponent, { size: 'lg', backdrop: 'static' }); + modalRef.componentInstance.pPreguntaCerrada = pPreguntaCerrada; + // unsubscribe not needed because closed completes on modal close + modalRef.closed.subscribe(reason => { + if (reason === 'deleted') { + this.loadAll(); + } + }); + } +} diff --git a/src/main/webapp/app/entities/p-pregunta-cerrada/p-pregunta-cerrada.model.ts b/src/main/webapp/app/entities/p-pregunta-cerrada/p-pregunta-cerrada.model.ts new file mode 100644 index 0000000..2a4cb32 --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-cerrada/p-pregunta-cerrada.model.ts @@ -0,0 +1,31 @@ +import { IPPreguntaCerradaOpcion } from 'app/entities/p-pregunta-cerrada-opcion/p-pregunta-cerrada-opcion.model'; +import { IPlantilla } from 'app/entities/plantilla/plantilla.model'; +import { PreguntaCerradaTipo } from 'app/entities/enumerations/pregunta-cerrada-tipo.model'; + +export interface IPPreguntaCerrada { + id?: number; + nombre?: string; + tipo?: PreguntaCerradaTipo; + opcional?: boolean; + orden?: number; + pPreguntaCerradaOpcions?: IPPreguntaCerradaOpcion[] | null; + plantilla?: IPlantilla | null; +} + +export class PPreguntaCerrada implements IPPreguntaCerrada { + constructor( + public id?: number, + public nombre?: string, + public tipo?: PreguntaCerradaTipo, + public opcional?: boolean, + public orden?: number, + public pPreguntaCerradaOpcions?: IPPreguntaCerradaOpcion[] | null, + public plantilla?: IPlantilla | null + ) { + this.opcional = this.opcional ?? false; + } +} + +export function getPPreguntaCerradaIdentifier(pPreguntaCerrada: IPPreguntaCerrada): number | undefined { + return pPreguntaCerrada.id; +} diff --git a/src/main/webapp/app/entities/p-pregunta-cerrada/p-pregunta-cerrada.module.ts b/src/main/webapp/app/entities/p-pregunta-cerrada/p-pregunta-cerrada.module.ts new file mode 100644 index 0000000..0ec4365 --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-cerrada/p-pregunta-cerrada.module.ts @@ -0,0 +1,19 @@ +import { NgModule } from '@angular/core'; +import { SharedModule } from 'app/shared/shared.module'; +import { PPreguntaCerradaComponent } from './list/p-pregunta-cerrada.component'; +import { PPreguntaCerradaDetailComponent } from './detail/p-pregunta-cerrada-detail.component'; +import { PPreguntaCerradaUpdateComponent } from './update/p-pregunta-cerrada-update.component'; +import { PPreguntaCerradaDeleteDialogComponent } from './delete/p-pregunta-cerrada-delete-dialog.component'; +import { PPreguntaCerradaRoutingModule } from './route/p-pregunta-cerrada-routing.module'; + +@NgModule({ + imports: [SharedModule, PPreguntaCerradaRoutingModule], + declarations: [ + PPreguntaCerradaComponent, + PPreguntaCerradaDetailComponent, + PPreguntaCerradaUpdateComponent, + PPreguntaCerradaDeleteDialogComponent, + ], + entryComponents: [PPreguntaCerradaDeleteDialogComponent], +}) +export class PPreguntaCerradaModule {} diff --git a/src/main/webapp/app/entities/p-pregunta-cerrada/route/p-pregunta-cerrada-routing-resolve.service.spec.ts b/src/main/webapp/app/entities/p-pregunta-cerrada/route/p-pregunta-cerrada-routing-resolve.service.spec.ts new file mode 100644 index 0000000..44a00db --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-cerrada/route/p-pregunta-cerrada-routing-resolve.service.spec.ts @@ -0,0 +1,82 @@ +jest.mock('@angular/router'); + +import { TestBed } from '@angular/core/testing'; +import { HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { ActivatedRouteSnapshot, Router } from '@angular/router'; +import { of } from 'rxjs'; + +import { IPPreguntaCerrada, PPreguntaCerrada } from '../p-pregunta-cerrada.model'; +import { PPreguntaCerradaService } from '../service/p-pregunta-cerrada.service'; + +import { PPreguntaCerradaRoutingResolveService } from './p-pregunta-cerrada-routing-resolve.service'; + +describe('Service Tests', () => { + describe('PPreguntaCerrada routing resolve service', () => { + let mockRouter: Router; + let mockActivatedRouteSnapshot: ActivatedRouteSnapshot; + let routingResolveService: PPreguntaCerradaRoutingResolveService; + let service: PPreguntaCerradaService; + let resultPPreguntaCerrada: IPPreguntaCerrada | undefined; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [Router, ActivatedRouteSnapshot], + }); + mockRouter = TestBed.inject(Router); + mockActivatedRouteSnapshot = TestBed.inject(ActivatedRouteSnapshot); + routingResolveService = TestBed.inject(PPreguntaCerradaRoutingResolveService); + service = TestBed.inject(PPreguntaCerradaService); + resultPPreguntaCerrada = undefined; + }); + + describe('resolve', () => { + it('should return IPPreguntaCerrada returned by find', () => { + // GIVEN + service.find = jest.fn(id => of(new HttpResponse({ body: { id } }))); + mockActivatedRouteSnapshot.params = { id: 123 }; + + // WHEN + routingResolveService.resolve(mockActivatedRouteSnapshot).subscribe(result => { + resultPPreguntaCerrada = result; + }); + + // THEN + expect(service.find).toBeCalledWith(123); + expect(resultPPreguntaCerrada).toEqual({ id: 123 }); + }); + + it('should return new IPPreguntaCerrada if id is not provided', () => { + // GIVEN + service.find = jest.fn(); + mockActivatedRouteSnapshot.params = {}; + + // WHEN + routingResolveService.resolve(mockActivatedRouteSnapshot).subscribe(result => { + resultPPreguntaCerrada = result; + }); + + // THEN + expect(service.find).not.toBeCalled(); + expect(resultPPreguntaCerrada).toEqual(new PPreguntaCerrada()); + }); + + it('should route to 404 page if data not found in server', () => { + // GIVEN + jest.spyOn(service, 'find').mockReturnValue(of(new HttpResponse({ body: null as unknown as PPreguntaCerrada }))); + mockActivatedRouteSnapshot.params = { id: 123 }; + + // WHEN + routingResolveService.resolve(mockActivatedRouteSnapshot).subscribe(result => { + resultPPreguntaCerrada = result; + }); + + // THEN + expect(service.find).toBeCalledWith(123); + expect(resultPPreguntaCerrada).toEqual(undefined); + expect(mockRouter.navigate).toHaveBeenCalledWith(['404']); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/p-pregunta-cerrada/route/p-pregunta-cerrada-routing-resolve.service.ts b/src/main/webapp/app/entities/p-pregunta-cerrada/route/p-pregunta-cerrada-routing-resolve.service.ts new file mode 100644 index 0000000..2e42361 --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-cerrada/route/p-pregunta-cerrada-routing-resolve.service.ts @@ -0,0 +1,30 @@ +import { Injectable } from '@angular/core'; +import { HttpResponse } from '@angular/common/http'; +import { Resolve, ActivatedRouteSnapshot, Router } from '@angular/router'; +import { Observable, of, EMPTY } from 'rxjs'; +import { mergeMap } from 'rxjs/operators'; + +import { IPPreguntaCerrada, PPreguntaCerrada } from '../p-pregunta-cerrada.model'; +import { PPreguntaCerradaService } from '../service/p-pregunta-cerrada.service'; + +@Injectable({ providedIn: 'root' }) +export class PPreguntaCerradaRoutingResolveService implements Resolve { + constructor(protected service: PPreguntaCerradaService, protected router: Router) {} + + resolve(route: ActivatedRouteSnapshot): Observable | Observable { + const id = route.params['id']; + if (id) { + return this.service.find(id).pipe( + mergeMap((pPreguntaCerrada: HttpResponse) => { + if (pPreguntaCerrada.body) { + return of(pPreguntaCerrada.body); + } else { + this.router.navigate(['404']); + return EMPTY; + } + }) + ); + } + return of(new PPreguntaCerrada()); + } +} diff --git a/src/main/webapp/app/entities/p-pregunta-cerrada/route/p-pregunta-cerrada-routing.module.ts b/src/main/webapp/app/entities/p-pregunta-cerrada/route/p-pregunta-cerrada-routing.module.ts new file mode 100644 index 0000000..a90201a --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-cerrada/route/p-pregunta-cerrada-routing.module.ts @@ -0,0 +1,46 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; + +import { UserRouteAccessService } from 'app/core/auth/user-route-access.service'; +import { PPreguntaCerradaComponent } from '../list/p-pregunta-cerrada.component'; +import { PPreguntaCerradaDetailComponent } from '../detail/p-pregunta-cerrada-detail.component'; +import { PPreguntaCerradaUpdateComponent } from '../update/p-pregunta-cerrada-update.component'; +import { PPreguntaCerradaRoutingResolveService } from './p-pregunta-cerrada-routing-resolve.service'; + +const pPreguntaCerradaRoute: Routes = [ + { + path: '', + component: PPreguntaCerradaComponent, + canActivate: [UserRouteAccessService], + }, + { + path: ':id/view', + component: PPreguntaCerradaDetailComponent, + resolve: { + pPreguntaCerrada: PPreguntaCerradaRoutingResolveService, + }, + canActivate: [UserRouteAccessService], + }, + { + path: 'new', + component: PPreguntaCerradaUpdateComponent, + resolve: { + pPreguntaCerrada: PPreguntaCerradaRoutingResolveService, + }, + canActivate: [UserRouteAccessService], + }, + { + path: ':id/edit', + component: PPreguntaCerradaUpdateComponent, + resolve: { + pPreguntaCerrada: PPreguntaCerradaRoutingResolveService, + }, + canActivate: [UserRouteAccessService], + }, +]; + +@NgModule({ + imports: [RouterModule.forChild(pPreguntaCerradaRoute)], + exports: [RouterModule], +}) +export class PPreguntaCerradaRoutingModule {} diff --git a/src/main/webapp/app/entities/p-pregunta-cerrada/service/p-pregunta-cerrada.service.spec.ts b/src/main/webapp/app/entities/p-pregunta-cerrada/service/p-pregunta-cerrada.service.spec.ts new file mode 100644 index 0000000..ccaadeb --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-cerrada/service/p-pregunta-cerrada.service.spec.ts @@ -0,0 +1,196 @@ +import { TestBed } from '@angular/core/testing'; +import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; + +import { PreguntaCerradaTipo } from 'app/entities/enumerations/pregunta-cerrada-tipo.model'; +import { IPPreguntaCerrada, PPreguntaCerrada } from '../p-pregunta-cerrada.model'; + +import { PPreguntaCerradaService } from './p-pregunta-cerrada.service'; + +describe('Service Tests', () => { + describe('PPreguntaCerrada Service', () => { + let service: PPreguntaCerradaService; + let httpMock: HttpTestingController; + let elemDefault: IPPreguntaCerrada; + let expectedResult: IPPreguntaCerrada | IPPreguntaCerrada[] | boolean | null; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + }); + expectedResult = null; + service = TestBed.inject(PPreguntaCerradaService); + httpMock = TestBed.inject(HttpTestingController); + + elemDefault = { + id: 0, + nombre: 'AAAAAAA', + tipo: PreguntaCerradaTipo.SINGLE, + opcional: false, + orden: 0, + }; + }); + + describe('Service methods', () => { + it('should find an element', () => { + const returnedFromService = Object.assign({}, elemDefault); + + service.find(123).subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'GET' }); + req.flush(returnedFromService); + expect(expectedResult).toMatchObject(elemDefault); + }); + + it('should create a PPreguntaCerrada', () => { + const returnedFromService = Object.assign( + { + id: 0, + }, + elemDefault + ); + + const expected = Object.assign({}, returnedFromService); + + service.create(new PPreguntaCerrada()).subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'POST' }); + req.flush(returnedFromService); + expect(expectedResult).toMatchObject(expected); + }); + + it('should update a PPreguntaCerrada', () => { + const returnedFromService = Object.assign( + { + id: 1, + nombre: 'BBBBBB', + tipo: 'BBBBBB', + opcional: true, + orden: 1, + }, + elemDefault + ); + + const expected = Object.assign({}, returnedFromService); + + service.update(expected).subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'PUT' }); + req.flush(returnedFromService); + expect(expectedResult).toMatchObject(expected); + }); + + it('should partial update a PPreguntaCerrada', () => { + const patchObject = Object.assign( + { + nombre: 'BBBBBB', + tipo: 'BBBBBB', + opcional: true, + }, + new PPreguntaCerrada() + ); + + const returnedFromService = Object.assign(patchObject, elemDefault); + + const expected = Object.assign({}, returnedFromService); + + service.partialUpdate(patchObject).subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'PATCH' }); + req.flush(returnedFromService); + expect(expectedResult).toMatchObject(expected); + }); + + it('should return a list of PPreguntaCerrada', () => { + const returnedFromService = Object.assign( + { + id: 1, + nombre: 'BBBBBB', + tipo: 'BBBBBB', + opcional: true, + orden: 1, + }, + elemDefault + ); + + const expected = Object.assign({}, returnedFromService); + + service.query().subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'GET' }); + req.flush([returnedFromService]); + httpMock.verify(); + expect(expectedResult).toContainEqual(expected); + }); + + it('should delete a PPreguntaCerrada', () => { + service.delete(123).subscribe(resp => (expectedResult = resp.ok)); + + const req = httpMock.expectOne({ method: 'DELETE' }); + req.flush({ status: 200 }); + expect(expectedResult); + }); + + describe('addPPreguntaCerradaToCollectionIfMissing', () => { + it('should add a PPreguntaCerrada to an empty array', () => { + const pPreguntaCerrada: IPPreguntaCerrada = { id: 123 }; + expectedResult = service.addPPreguntaCerradaToCollectionIfMissing([], pPreguntaCerrada); + expect(expectedResult).toHaveLength(1); + expect(expectedResult).toContain(pPreguntaCerrada); + }); + + it('should not add a PPreguntaCerrada to an array that contains it', () => { + const pPreguntaCerrada: IPPreguntaCerrada = { id: 123 }; + const pPreguntaCerradaCollection: IPPreguntaCerrada[] = [ + { + ...pPreguntaCerrada, + }, + { id: 456 }, + ]; + expectedResult = service.addPPreguntaCerradaToCollectionIfMissing(pPreguntaCerradaCollection, pPreguntaCerrada); + expect(expectedResult).toHaveLength(2); + }); + + it("should add a PPreguntaCerrada to an array that doesn't contain it", () => { + const pPreguntaCerrada: IPPreguntaCerrada = { id: 123 }; + const pPreguntaCerradaCollection: IPPreguntaCerrada[] = [{ id: 456 }]; + expectedResult = service.addPPreguntaCerradaToCollectionIfMissing(pPreguntaCerradaCollection, pPreguntaCerrada); + expect(expectedResult).toHaveLength(2); + expect(expectedResult).toContain(pPreguntaCerrada); + }); + + it('should add only unique PPreguntaCerrada to an array', () => { + const pPreguntaCerradaArray: IPPreguntaCerrada[] = [{ id: 123 }, { id: 456 }, { id: 39367 }]; + const pPreguntaCerradaCollection: IPPreguntaCerrada[] = [{ id: 123 }]; + expectedResult = service.addPPreguntaCerradaToCollectionIfMissing(pPreguntaCerradaCollection, ...pPreguntaCerradaArray); + expect(expectedResult).toHaveLength(3); + }); + + it('should accept varargs', () => { + const pPreguntaCerrada: IPPreguntaCerrada = { id: 123 }; + const pPreguntaCerrada2: IPPreguntaCerrada = { id: 456 }; + expectedResult = service.addPPreguntaCerradaToCollectionIfMissing([], pPreguntaCerrada, pPreguntaCerrada2); + expect(expectedResult).toHaveLength(2); + expect(expectedResult).toContain(pPreguntaCerrada); + expect(expectedResult).toContain(pPreguntaCerrada2); + }); + + it('should accept null and undefined values', () => { + const pPreguntaCerrada: IPPreguntaCerrada = { id: 123 }; + expectedResult = service.addPPreguntaCerradaToCollectionIfMissing([], null, pPreguntaCerrada, undefined); + expect(expectedResult).toHaveLength(1); + expect(expectedResult).toContain(pPreguntaCerrada); + }); + + it('should return initial array if no PPreguntaCerrada is added', () => { + const pPreguntaCerradaCollection: IPPreguntaCerrada[] = [{ id: 123 }]; + expectedResult = service.addPPreguntaCerradaToCollectionIfMissing(pPreguntaCerradaCollection, undefined, null); + expect(expectedResult).toEqual(pPreguntaCerradaCollection); + }); + }); + }); + + afterEach(() => { + httpMock.verify(); + }); + }); +}); diff --git a/src/main/webapp/app/entities/p-pregunta-cerrada/service/p-pregunta-cerrada.service.ts b/src/main/webapp/app/entities/p-pregunta-cerrada/service/p-pregunta-cerrada.service.ts new file mode 100644 index 0000000..3e025b1 --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-cerrada/service/p-pregunta-cerrada.service.ts @@ -0,0 +1,73 @@ +import { Injectable } from '@angular/core'; +import { HttpClient, HttpResponse } from '@angular/common/http'; +import { Observable } from 'rxjs'; + +import { isPresent } from 'app/core/util/operators'; +import { ApplicationConfigService } from 'app/core/config/application-config.service'; +import { createRequestOption } from 'app/core/request/request-util'; +import { IPPreguntaCerrada, getPPreguntaCerradaIdentifier } from '../p-pregunta-cerrada.model'; + +export type EntityResponseType = HttpResponse; +export type EntityArrayResponseType = HttpResponse; + +@Injectable({ providedIn: 'root' }) +export class PPreguntaCerradaService { + protected resourceUrl = this.applicationConfigService.getEndpointFor('api/p-pregunta-cerradas'); + + constructor(protected http: HttpClient, protected applicationConfigService: ApplicationConfigService) {} + + create(pPreguntaCerrada: IPPreguntaCerrada): Observable { + return this.http.post(this.resourceUrl, pPreguntaCerrada, { observe: 'response' }); + } + + update(pPreguntaCerrada: IPPreguntaCerrada): Observable { + return this.http.put( + `${this.resourceUrl}/${getPPreguntaCerradaIdentifier(pPreguntaCerrada) as number}`, + pPreguntaCerrada, + { observe: 'response' } + ); + } + + partialUpdate(pPreguntaCerrada: IPPreguntaCerrada): Observable { + return this.http.patch( + `${this.resourceUrl}/${getPPreguntaCerradaIdentifier(pPreguntaCerrada) as number}`, + pPreguntaCerrada, + { observe: 'response' } + ); + } + + find(id: number): Observable { + return this.http.get(`${this.resourceUrl}/${id}`, { observe: 'response' }); + } + + query(req?: any): Observable { + const options = createRequestOption(req); + return this.http.get(this.resourceUrl, { params: options, observe: 'response' }); + } + + delete(id: number): Observable> { + return this.http.delete(`${this.resourceUrl}/${id}`, { observe: 'response' }); + } + + addPPreguntaCerradaToCollectionIfMissing( + pPreguntaCerradaCollection: IPPreguntaCerrada[], + ...pPreguntaCerradasToCheck: (IPPreguntaCerrada | null | undefined)[] + ): IPPreguntaCerrada[] { + const pPreguntaCerradas: IPPreguntaCerrada[] = pPreguntaCerradasToCheck.filter(isPresent); + if (pPreguntaCerradas.length > 0) { + const pPreguntaCerradaCollectionIdentifiers = pPreguntaCerradaCollection.map( + pPreguntaCerradaItem => getPPreguntaCerradaIdentifier(pPreguntaCerradaItem)! + ); + const pPreguntaCerradasToAdd = pPreguntaCerradas.filter(pPreguntaCerradaItem => { + const pPreguntaCerradaIdentifier = getPPreguntaCerradaIdentifier(pPreguntaCerradaItem); + if (pPreguntaCerradaIdentifier == null || pPreguntaCerradaCollectionIdentifiers.includes(pPreguntaCerradaIdentifier)) { + return false; + } + pPreguntaCerradaCollectionIdentifiers.push(pPreguntaCerradaIdentifier); + return true; + }); + return [...pPreguntaCerradasToAdd, ...pPreguntaCerradaCollection]; + } + return pPreguntaCerradaCollection; + } +} diff --git a/src/main/webapp/app/entities/p-pregunta-cerrada/update/p-pregunta-cerrada-update.component.html b/src/main/webapp/app/entities/p-pregunta-cerrada/update/p-pregunta-cerrada-update.component.html new file mode 100644 index 0000000..f9d75fd --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-cerrada/update/p-pregunta-cerrada-update.component.html @@ -0,0 +1,118 @@ +
+
+
+

+ Create or edit a P Pregunta Cerrada +

+ +
+ + +
+ + +
+ +
+ + +
+ + This field is required. + + + This field is required to be at least 1 characters. + + + This field cannot be longer than 500 characters. + +
+
+ +
+ + +
+ + This field is required. + +
+
+ +
+ + +
+ + This field is required. + +
+
+ +
+ + +
+ + This field is required. + + + This field should be a number. + +
+
+ +
+ + +
+
+ +
+ + + +
+
+
+
diff --git a/src/main/webapp/app/entities/p-pregunta-cerrada/update/p-pregunta-cerrada-update.component.spec.ts b/src/main/webapp/app/entities/p-pregunta-cerrada/update/p-pregunta-cerrada-update.component.spec.ts new file mode 100644 index 0000000..a1686e0 --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-cerrada/update/p-pregunta-cerrada-update.component.spec.ts @@ -0,0 +1,149 @@ +jest.mock('@angular/router'); + +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { FormBuilder } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; +import { of, Subject } from 'rxjs'; + +import { PPreguntaCerradaService } from '../service/p-pregunta-cerrada.service'; +import { IPPreguntaCerrada, PPreguntaCerrada } from '../p-pregunta-cerrada.model'; +import { IPlantilla } from 'app/entities/plantilla/plantilla.model'; +import { PlantillaService } from 'app/entities/plantilla/service/plantilla.service'; + +import { PPreguntaCerradaUpdateComponent } from './p-pregunta-cerrada-update.component'; + +describe('Component Tests', () => { + describe('PPreguntaCerrada Management Update Component', () => { + let comp: PPreguntaCerradaUpdateComponent; + let fixture: ComponentFixture; + let activatedRoute: ActivatedRoute; + let pPreguntaCerradaService: PPreguntaCerradaService; + let plantillaService: PlantillaService; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [PPreguntaCerradaUpdateComponent], + providers: [FormBuilder, ActivatedRoute], + }) + .overrideTemplate(PPreguntaCerradaUpdateComponent, '') + .compileComponents(); + + fixture = TestBed.createComponent(PPreguntaCerradaUpdateComponent); + activatedRoute = TestBed.inject(ActivatedRoute); + pPreguntaCerradaService = TestBed.inject(PPreguntaCerradaService); + plantillaService = TestBed.inject(PlantillaService); + + comp = fixture.componentInstance; + }); + + describe('ngOnInit', () => { + it('Should call Plantilla query and add missing value', () => { + const pPreguntaCerrada: IPPreguntaCerrada = { id: 456 }; + const plantilla: IPlantilla = { id: 93915 }; + pPreguntaCerrada.plantilla = plantilla; + + const plantillaCollection: IPlantilla[] = [{ id: 13237 }]; + jest.spyOn(plantillaService, 'query').mockReturnValue(of(new HttpResponse({ body: plantillaCollection }))); + const additionalPlantillas = [plantilla]; + const expectedCollection: IPlantilla[] = [...additionalPlantillas, ...plantillaCollection]; + jest.spyOn(plantillaService, 'addPlantillaToCollectionIfMissing').mockReturnValue(expectedCollection); + + activatedRoute.data = of({ pPreguntaCerrada }); + comp.ngOnInit(); + + expect(plantillaService.query).toHaveBeenCalled(); + expect(plantillaService.addPlantillaToCollectionIfMissing).toHaveBeenCalledWith(plantillaCollection, ...additionalPlantillas); + expect(comp.plantillasSharedCollection).toEqual(expectedCollection); + }); + + it('Should update editForm', () => { + const pPreguntaCerrada: IPPreguntaCerrada = { id: 456 }; + const plantilla: IPlantilla = { id: 35501 }; + pPreguntaCerrada.plantilla = plantilla; + + activatedRoute.data = of({ pPreguntaCerrada }); + comp.ngOnInit(); + + expect(comp.editForm.value).toEqual(expect.objectContaining(pPreguntaCerrada)); + expect(comp.plantillasSharedCollection).toContain(plantilla); + }); + }); + + describe('save', () => { + it('Should call update service on save for existing entity', () => { + // GIVEN + const saveSubject = new Subject>(); + const pPreguntaCerrada = { id: 123 }; + jest.spyOn(pPreguntaCerradaService, 'update').mockReturnValue(saveSubject); + jest.spyOn(comp, 'previousState'); + activatedRoute.data = of({ pPreguntaCerrada }); + comp.ngOnInit(); + + // WHEN + comp.save(); + expect(comp.isSaving).toEqual(true); + saveSubject.next(new HttpResponse({ body: pPreguntaCerrada })); + saveSubject.complete(); + + // THEN + expect(comp.previousState).toHaveBeenCalled(); + expect(pPreguntaCerradaService.update).toHaveBeenCalledWith(pPreguntaCerrada); + expect(comp.isSaving).toEqual(false); + }); + + it('Should call create service on save for new entity', () => { + // GIVEN + const saveSubject = new Subject>(); + const pPreguntaCerrada = new PPreguntaCerrada(); + jest.spyOn(pPreguntaCerradaService, 'create').mockReturnValue(saveSubject); + jest.spyOn(comp, 'previousState'); + activatedRoute.data = of({ pPreguntaCerrada }); + comp.ngOnInit(); + + // WHEN + comp.save(); + expect(comp.isSaving).toEqual(true); + saveSubject.next(new HttpResponse({ body: pPreguntaCerrada })); + saveSubject.complete(); + + // THEN + expect(pPreguntaCerradaService.create).toHaveBeenCalledWith(pPreguntaCerrada); + expect(comp.isSaving).toEqual(false); + expect(comp.previousState).toHaveBeenCalled(); + }); + + it('Should set isSaving to false on error', () => { + // GIVEN + const saveSubject = new Subject>(); + const pPreguntaCerrada = { id: 123 }; + jest.spyOn(pPreguntaCerradaService, 'update').mockReturnValue(saveSubject); + jest.spyOn(comp, 'previousState'); + activatedRoute.data = of({ pPreguntaCerrada }); + comp.ngOnInit(); + + // WHEN + comp.save(); + expect(comp.isSaving).toEqual(true); + saveSubject.error('This is an error!'); + + // THEN + expect(pPreguntaCerradaService.update).toHaveBeenCalledWith(pPreguntaCerrada); + expect(comp.isSaving).toEqual(false); + expect(comp.previousState).not.toHaveBeenCalled(); + }); + }); + + describe('Tracking relationships identifiers', () => { + describe('trackPlantillaById', () => { + it('Should return tracked Plantilla primary key', () => { + const entity = { id: 123 }; + const trackResult = comp.trackPlantillaById(0, entity); + expect(trackResult).toEqual(entity.id); + }); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/p-pregunta-cerrada/update/p-pregunta-cerrada-update.component.ts b/src/main/webapp/app/entities/p-pregunta-cerrada/update/p-pregunta-cerrada-update.component.ts new file mode 100644 index 0000000..ad31437 --- /dev/null +++ b/src/main/webapp/app/entities/p-pregunta-cerrada/update/p-pregunta-cerrada-update.component.ts @@ -0,0 +1,122 @@ +import { Component, OnInit } from '@angular/core'; +import { HttpResponse } from '@angular/common/http'; +import { FormBuilder, Validators } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; +import { Observable } from 'rxjs'; +import { finalize, map } from 'rxjs/operators'; + +import { IPPreguntaCerrada, PPreguntaCerrada } from '../p-pregunta-cerrada.model'; +import { PPreguntaCerradaService } from '../service/p-pregunta-cerrada.service'; +import { IPlantilla } from 'app/entities/plantilla/plantilla.model'; +import { PlantillaService } from 'app/entities/plantilla/service/plantilla.service'; + +@Component({ + selector: 'jhi-p-pregunta-cerrada-update', + templateUrl: './p-pregunta-cerrada-update.component.html', +}) +export class PPreguntaCerradaUpdateComponent implements OnInit { + isSaving = false; + + plantillasSharedCollection: IPlantilla[] = []; + + editForm = this.fb.group({ + id: [], + nombre: [null, [Validators.required, Validators.minLength(1), Validators.maxLength(500)]], + tipo: [null, [Validators.required]], + opcional: [null, [Validators.required]], + orden: [null, [Validators.required]], + plantilla: [], + }); + + constructor( + protected pPreguntaCerradaService: PPreguntaCerradaService, + protected plantillaService: PlantillaService, + protected activatedRoute: ActivatedRoute, + protected fb: FormBuilder + ) {} + + ngOnInit(): void { + this.activatedRoute.data.subscribe(({ pPreguntaCerrada }) => { + this.updateForm(pPreguntaCerrada); + + this.loadRelationshipsOptions(); + }); + } + + previousState(): void { + window.history.back(); + } + + save(): void { + this.isSaving = true; + const pPreguntaCerrada = this.createFromForm(); + if (pPreguntaCerrada.id !== undefined) { + this.subscribeToSaveResponse(this.pPreguntaCerradaService.update(pPreguntaCerrada)); + } else { + this.subscribeToSaveResponse(this.pPreguntaCerradaService.create(pPreguntaCerrada)); + } + } + + trackPlantillaById(index: number, item: IPlantilla): number { + return item.id!; + } + + protected subscribeToSaveResponse(result: Observable>): void { + result.pipe(finalize(() => this.onSaveFinalize())).subscribe( + () => this.onSaveSuccess(), + () => this.onSaveError() + ); + } + + protected onSaveSuccess(): void { + this.previousState(); + } + + protected onSaveError(): void { + // Api for inheritance. + } + + protected onSaveFinalize(): void { + this.isSaving = false; + } + + protected updateForm(pPreguntaCerrada: IPPreguntaCerrada): void { + this.editForm.patchValue({ + id: pPreguntaCerrada.id, + nombre: pPreguntaCerrada.nombre, + tipo: pPreguntaCerrada.tipo, + opcional: pPreguntaCerrada.opcional, + orden: pPreguntaCerrada.orden, + plantilla: pPreguntaCerrada.plantilla, + }); + + this.plantillasSharedCollection = this.plantillaService.addPlantillaToCollectionIfMissing( + this.plantillasSharedCollection, + pPreguntaCerrada.plantilla + ); + } + + protected loadRelationshipsOptions(): void { + this.plantillaService + .query() + .pipe(map((res: HttpResponse) => res.body ?? [])) + .pipe( + map((plantillas: IPlantilla[]) => + this.plantillaService.addPlantillaToCollectionIfMissing(plantillas, this.editForm.get('plantilla')!.value) + ) + ) + .subscribe((plantillas: IPlantilla[]) => (this.plantillasSharedCollection = plantillas)); + } + + protected createFromForm(): IPPreguntaCerrada { + return { + ...new PPreguntaCerrada(), + id: this.editForm.get(['id'])!.value, + nombre: this.editForm.get(['nombre'])!.value, + tipo: this.editForm.get(['tipo'])!.value, + opcional: this.editForm.get(['opcional'])!.value, + orden: this.editForm.get(['orden'])!.value, + plantilla: this.editForm.get(['plantilla'])!.value, + }; + } +} diff --git a/src/main/webapp/app/entities/parametro-aplicacion/delete/parametro-aplicacion-delete-dialog.component.html b/src/main/webapp/app/entities/parametro-aplicacion/delete/parametro-aplicacion-delete-dialog.component.html new file mode 100644 index 0000000..dbece8d --- /dev/null +++ b/src/main/webapp/app/entities/parametro-aplicacion/delete/parametro-aplicacion-delete-dialog.component.html @@ -0,0 +1,31 @@ +
+ + + + + +
diff --git a/src/main/webapp/app/entities/parametro-aplicacion/delete/parametro-aplicacion-delete-dialog.component.spec.ts b/src/main/webapp/app/entities/parametro-aplicacion/delete/parametro-aplicacion-delete-dialog.component.spec.ts new file mode 100644 index 0000000..eec9137 --- /dev/null +++ b/src/main/webapp/app/entities/parametro-aplicacion/delete/parametro-aplicacion-delete-dialog.component.spec.ts @@ -0,0 +1,65 @@ +jest.mock('@ng-bootstrap/ng-bootstrap'); + +import { ComponentFixture, TestBed, inject, fakeAsync, tick } from '@angular/core/testing'; +import { HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { of } from 'rxjs'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; + +import { ParametroAplicacionService } from '../service/parametro-aplicacion.service'; + +import { ParametroAplicacionDeleteDialogComponent } from './parametro-aplicacion-delete-dialog.component'; + +describe('Component Tests', () => { + describe('ParametroAplicacion Management Delete Component', () => { + let comp: ParametroAplicacionDeleteDialogComponent; + let fixture: ComponentFixture; + let service: ParametroAplicacionService; + let mockActiveModal: NgbActiveModal; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [ParametroAplicacionDeleteDialogComponent], + providers: [NgbActiveModal], + }) + .overrideTemplate(ParametroAplicacionDeleteDialogComponent, '') + .compileComponents(); + fixture = TestBed.createComponent(ParametroAplicacionDeleteDialogComponent); + comp = fixture.componentInstance; + service = TestBed.inject(ParametroAplicacionService); + mockActiveModal = TestBed.inject(NgbActiveModal); + }); + + describe('confirmDelete', () => { + it('Should call delete service on confirmDelete', inject( + [], + fakeAsync(() => { + // GIVEN + jest.spyOn(service, 'delete').mockReturnValue(of(new HttpResponse({}))); + + // WHEN + comp.confirmDelete(123); + tick(); + + // THEN + expect(service.delete).toHaveBeenCalledWith(123); + expect(mockActiveModal.close).toHaveBeenCalledWith('deleted'); + }) + )); + + it('Should not call delete service on clear', () => { + // GIVEN + jest.spyOn(service, 'delete'); + + // WHEN + comp.cancel(); + + // THEN + expect(service.delete).not.toHaveBeenCalled(); + expect(mockActiveModal.close).not.toHaveBeenCalled(); + expect(mockActiveModal.dismiss).toHaveBeenCalled(); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/parametro-aplicacion/delete/parametro-aplicacion-delete-dialog.component.ts b/src/main/webapp/app/entities/parametro-aplicacion/delete/parametro-aplicacion-delete-dialog.component.ts new file mode 100644 index 0000000..84d586f --- /dev/null +++ b/src/main/webapp/app/entities/parametro-aplicacion/delete/parametro-aplicacion-delete-dialog.component.ts @@ -0,0 +1,24 @@ +import { Component } from '@angular/core'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; + +import { IParametroAplicacion } from '../parametro-aplicacion.model'; +import { ParametroAplicacionService } from '../service/parametro-aplicacion.service'; + +@Component({ + templateUrl: './parametro-aplicacion-delete-dialog.component.html', +}) +export class ParametroAplicacionDeleteDialogComponent { + parametroAplicacion?: IParametroAplicacion; + + constructor(protected parametroAplicacionService: ParametroAplicacionService, protected activeModal: NgbActiveModal) {} + + cancel(): void { + this.activeModal.dismiss(); + } + + confirmDelete(id: number): void { + this.parametroAplicacionService.delete(id).subscribe(() => { + this.activeModal.close('deleted'); + }); + } +} diff --git a/src/main/webapp/app/entities/parametro-aplicacion/detail/parametro-aplicacion-detail.component.html b/src/main/webapp/app/entities/parametro-aplicacion/detail/parametro-aplicacion-detail.component.html new file mode 100644 index 0000000..533ba61 --- /dev/null +++ b/src/main/webapp/app/entities/parametro-aplicacion/detail/parametro-aplicacion-detail.component.html @@ -0,0 +1,46 @@ +
+
+
+

+ Parametro Aplicacion +

+ +
+ + + + + +
+
ID
+
+ {{ parametroAplicacion.id }} +
+
Max Dias Encuesta
+
+ {{ parametroAplicacion.maxDiasEncuesta }} +
+
Min Dias Encuesta
+
+ {{ parametroAplicacion.minDiasEncuesta }} +
+
Max Cantidad Preguntas
+
+ {{ parametroAplicacion.maxCantidadPreguntas }} +
+
Min Cantidad Preguntas
+
+ {{ parametroAplicacion.minCantidadPreguntas }} +
+
+ + + + +
+
+
diff --git a/src/main/webapp/app/entities/parametro-aplicacion/detail/parametro-aplicacion-detail.component.spec.ts b/src/main/webapp/app/entities/parametro-aplicacion/detail/parametro-aplicacion-detail.component.spec.ts new file mode 100644 index 0000000..c7e3b49 --- /dev/null +++ b/src/main/webapp/app/entities/parametro-aplicacion/detail/parametro-aplicacion-detail.component.spec.ts @@ -0,0 +1,38 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { ActivatedRoute } from '@angular/router'; +import { of } from 'rxjs'; + +import { ParametroAplicacionDetailComponent } from './parametro-aplicacion-detail.component'; + +describe('Component Tests', () => { + describe('ParametroAplicacion Management Detail Component', () => { + let comp: ParametroAplicacionDetailComponent; + let fixture: ComponentFixture; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [ParametroAplicacionDetailComponent], + providers: [ + { + provide: ActivatedRoute, + useValue: { data: of({ parametroAplicacion: { id: 123 } }) }, + }, + ], + }) + .overrideTemplate(ParametroAplicacionDetailComponent, '') + .compileComponents(); + fixture = TestBed.createComponent(ParametroAplicacionDetailComponent); + comp = fixture.componentInstance; + }); + + describe('OnInit', () => { + it('Should load parametroAplicacion on init', () => { + // WHEN + comp.ngOnInit(); + + // THEN + expect(comp.parametroAplicacion).toEqual(expect.objectContaining({ id: 123 })); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/parametro-aplicacion/detail/parametro-aplicacion-detail.component.ts b/src/main/webapp/app/entities/parametro-aplicacion/detail/parametro-aplicacion-detail.component.ts new file mode 100644 index 0000000..6960070 --- /dev/null +++ b/src/main/webapp/app/entities/parametro-aplicacion/detail/parametro-aplicacion-detail.component.ts @@ -0,0 +1,24 @@ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; + +import { IParametroAplicacion } from '../parametro-aplicacion.model'; + +@Component({ + selector: 'jhi-parametro-aplicacion-detail', + templateUrl: './parametro-aplicacion-detail.component.html', +}) +export class ParametroAplicacionDetailComponent implements OnInit { + parametroAplicacion: IParametroAplicacion | null = null; + + constructor(protected activatedRoute: ActivatedRoute) {} + + ngOnInit(): void { + this.activatedRoute.data.subscribe(({ parametroAplicacion }) => { + this.parametroAplicacion = parametroAplicacion; + }); + } + + previousState(): void { + window.history.back(); + } +} diff --git a/src/main/webapp/app/entities/parametro-aplicacion/list/parametro-aplicacion.component.html b/src/main/webapp/app/entities/parametro-aplicacion/list/parametro-aplicacion.component.html new file mode 100644 index 0000000..00d834a --- /dev/null +++ b/src/main/webapp/app/entities/parametro-aplicacion/list/parametro-aplicacion.component.html @@ -0,0 +1,84 @@ +
+

+ Parametro Aplicacions + +
+ + + +
+

+ + + + + +
+ No parametroAplicacions found +
+ +
+ + + + + + + + + + + + + + + + + + + + + +
IDMax Dias EncuestaMin Dias EncuestaMax Cantidad PreguntasMin Cantidad Preguntas
+ {{ parametroAplicacion.id }} + {{ parametroAplicacion.maxDiasEncuesta }}{{ parametroAplicacion.minDiasEncuesta }}{{ parametroAplicacion.maxCantidadPreguntas }}{{ parametroAplicacion.minCantidadPreguntas }} +
+ + + + + +
+
+
+
diff --git a/src/main/webapp/app/entities/parametro-aplicacion/list/parametro-aplicacion.component.spec.ts b/src/main/webapp/app/entities/parametro-aplicacion/list/parametro-aplicacion.component.spec.ts new file mode 100644 index 0000000..866c415 --- /dev/null +++ b/src/main/webapp/app/entities/parametro-aplicacion/list/parametro-aplicacion.component.spec.ts @@ -0,0 +1,48 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { HttpHeaders, HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { of } from 'rxjs'; + +import { ParametroAplicacionService } from '../service/parametro-aplicacion.service'; + +import { ParametroAplicacionComponent } from './parametro-aplicacion.component'; + +describe('Component Tests', () => { + describe('ParametroAplicacion Management Component', () => { + let comp: ParametroAplicacionComponent; + let fixture: ComponentFixture; + let service: ParametroAplicacionService; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [ParametroAplicacionComponent], + }) + .overrideTemplate(ParametroAplicacionComponent, '') + .compileComponents(); + + fixture = TestBed.createComponent(ParametroAplicacionComponent); + comp = fixture.componentInstance; + service = TestBed.inject(ParametroAplicacionService); + + const headers = new HttpHeaders().append('link', 'link;link'); + jest.spyOn(service, 'query').mockReturnValue( + of( + new HttpResponse({ + body: [{ id: 123 }], + headers, + }) + ) + ); + }); + + it('Should call load all on init', () => { + // WHEN + comp.ngOnInit(); + + // THEN + expect(service.query).toHaveBeenCalled(); + expect(comp.parametroAplicacions?.[0]).toEqual(expect.objectContaining({ id: 123 })); + }); + }); +}); diff --git a/src/main/webapp/app/entities/parametro-aplicacion/list/parametro-aplicacion.component.ts b/src/main/webapp/app/entities/parametro-aplicacion/list/parametro-aplicacion.component.ts new file mode 100644 index 0000000..fbce875 --- /dev/null +++ b/src/main/webapp/app/entities/parametro-aplicacion/list/parametro-aplicacion.component.ts @@ -0,0 +1,51 @@ +import { Component, OnInit } from '@angular/core'; +import { HttpResponse } from '@angular/common/http'; +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; + +import { IParametroAplicacion } from '../parametro-aplicacion.model'; +import { ParametroAplicacionService } from '../service/parametro-aplicacion.service'; +import { ParametroAplicacionDeleteDialogComponent } from '../delete/parametro-aplicacion-delete-dialog.component'; + +@Component({ + selector: 'jhi-parametro-aplicacion', + templateUrl: './parametro-aplicacion.component.html', +}) +export class ParametroAplicacionComponent implements OnInit { + parametroAplicacions?: IParametroAplicacion[]; + isLoading = false; + + constructor(protected parametroAplicacionService: ParametroAplicacionService, protected modalService: NgbModal) {} + + loadAll(): void { + this.isLoading = true; + + this.parametroAplicacionService.query().subscribe( + (res: HttpResponse) => { + this.isLoading = false; + this.parametroAplicacions = res.body ?? []; + }, + () => { + this.isLoading = false; + } + ); + } + + ngOnInit(): void { + this.loadAll(); + } + + trackId(index: number, item: IParametroAplicacion): number { + return item.id!; + } + + delete(parametroAplicacion: IParametroAplicacion): void { + const modalRef = this.modalService.open(ParametroAplicacionDeleteDialogComponent, { size: 'lg', backdrop: 'static' }); + modalRef.componentInstance.parametroAplicacion = parametroAplicacion; + // unsubscribe not needed because closed completes on modal close + modalRef.closed.subscribe(reason => { + if (reason === 'deleted') { + this.loadAll(); + } + }); + } +} diff --git a/src/main/webapp/app/entities/parametro-aplicacion/parametro-aplicacion.model.ts b/src/main/webapp/app/entities/parametro-aplicacion/parametro-aplicacion.model.ts new file mode 100644 index 0000000..366a09c --- /dev/null +++ b/src/main/webapp/app/entities/parametro-aplicacion/parametro-aplicacion.model.ts @@ -0,0 +1,21 @@ +export interface IParametroAplicacion { + id?: number; + maxDiasEncuesta?: number; + minDiasEncuesta?: number; + maxCantidadPreguntas?: number; + minCantidadPreguntas?: number; +} + +export class ParametroAplicacion implements IParametroAplicacion { + constructor( + public id?: number, + public maxDiasEncuesta?: number, + public minDiasEncuesta?: number, + public maxCantidadPreguntas?: number, + public minCantidadPreguntas?: number + ) {} +} + +export function getParametroAplicacionIdentifier(parametroAplicacion: IParametroAplicacion): number | undefined { + return parametroAplicacion.id; +} diff --git a/src/main/webapp/app/entities/parametro-aplicacion/parametro-aplicacion.module.ts b/src/main/webapp/app/entities/parametro-aplicacion/parametro-aplicacion.module.ts new file mode 100644 index 0000000..f1b3ea8 --- /dev/null +++ b/src/main/webapp/app/entities/parametro-aplicacion/parametro-aplicacion.module.ts @@ -0,0 +1,19 @@ +import { NgModule } from '@angular/core'; +import { SharedModule } from 'app/shared/shared.module'; +import { ParametroAplicacionComponent } from './list/parametro-aplicacion.component'; +import { ParametroAplicacionDetailComponent } from './detail/parametro-aplicacion-detail.component'; +import { ParametroAplicacionUpdateComponent } from './update/parametro-aplicacion-update.component'; +import { ParametroAplicacionDeleteDialogComponent } from './delete/parametro-aplicacion-delete-dialog.component'; +import { ParametroAplicacionRoutingModule } from './route/parametro-aplicacion-routing.module'; + +@NgModule({ + imports: [SharedModule, ParametroAplicacionRoutingModule], + declarations: [ + ParametroAplicacionComponent, + ParametroAplicacionDetailComponent, + ParametroAplicacionUpdateComponent, + ParametroAplicacionDeleteDialogComponent, + ], + entryComponents: [ParametroAplicacionDeleteDialogComponent], +}) +export class ParametroAplicacionModule {} diff --git a/src/main/webapp/app/entities/parametro-aplicacion/route/parametro-aplicacion-routing-resolve.service.spec.ts b/src/main/webapp/app/entities/parametro-aplicacion/route/parametro-aplicacion-routing-resolve.service.spec.ts new file mode 100644 index 0000000..ff9b913 --- /dev/null +++ b/src/main/webapp/app/entities/parametro-aplicacion/route/parametro-aplicacion-routing-resolve.service.spec.ts @@ -0,0 +1,82 @@ +jest.mock('@angular/router'); + +import { TestBed } from '@angular/core/testing'; +import { HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { ActivatedRouteSnapshot, Router } from '@angular/router'; +import { of } from 'rxjs'; + +import { IParametroAplicacion, ParametroAplicacion } from '../parametro-aplicacion.model'; +import { ParametroAplicacionService } from '../service/parametro-aplicacion.service'; + +import { ParametroAplicacionRoutingResolveService } from './parametro-aplicacion-routing-resolve.service'; + +describe('Service Tests', () => { + describe('ParametroAplicacion routing resolve service', () => { + let mockRouter: Router; + let mockActivatedRouteSnapshot: ActivatedRouteSnapshot; + let routingResolveService: ParametroAplicacionRoutingResolveService; + let service: ParametroAplicacionService; + let resultParametroAplicacion: IParametroAplicacion | undefined; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [Router, ActivatedRouteSnapshot], + }); + mockRouter = TestBed.inject(Router); + mockActivatedRouteSnapshot = TestBed.inject(ActivatedRouteSnapshot); + routingResolveService = TestBed.inject(ParametroAplicacionRoutingResolveService); + service = TestBed.inject(ParametroAplicacionService); + resultParametroAplicacion = undefined; + }); + + describe('resolve', () => { + it('should return IParametroAplicacion returned by find', () => { + // GIVEN + service.find = jest.fn(id => of(new HttpResponse({ body: { id } }))); + mockActivatedRouteSnapshot.params = { id: 123 }; + + // WHEN + routingResolveService.resolve(mockActivatedRouteSnapshot).subscribe(result => { + resultParametroAplicacion = result; + }); + + // THEN + expect(service.find).toBeCalledWith(123); + expect(resultParametroAplicacion).toEqual({ id: 123 }); + }); + + it('should return new IParametroAplicacion if id is not provided', () => { + // GIVEN + service.find = jest.fn(); + mockActivatedRouteSnapshot.params = {}; + + // WHEN + routingResolveService.resolve(mockActivatedRouteSnapshot).subscribe(result => { + resultParametroAplicacion = result; + }); + + // THEN + expect(service.find).not.toBeCalled(); + expect(resultParametroAplicacion).toEqual(new ParametroAplicacion()); + }); + + it('should route to 404 page if data not found in server', () => { + // GIVEN + jest.spyOn(service, 'find').mockReturnValue(of(new HttpResponse({ body: null as unknown as ParametroAplicacion }))); + mockActivatedRouteSnapshot.params = { id: 123 }; + + // WHEN + routingResolveService.resolve(mockActivatedRouteSnapshot).subscribe(result => { + resultParametroAplicacion = result; + }); + + // THEN + expect(service.find).toBeCalledWith(123); + expect(resultParametroAplicacion).toEqual(undefined); + expect(mockRouter.navigate).toHaveBeenCalledWith(['404']); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/parametro-aplicacion/route/parametro-aplicacion-routing-resolve.service.ts b/src/main/webapp/app/entities/parametro-aplicacion/route/parametro-aplicacion-routing-resolve.service.ts new file mode 100644 index 0000000..19e2234 --- /dev/null +++ b/src/main/webapp/app/entities/parametro-aplicacion/route/parametro-aplicacion-routing-resolve.service.ts @@ -0,0 +1,30 @@ +import { Injectable } from '@angular/core'; +import { HttpResponse } from '@angular/common/http'; +import { Resolve, ActivatedRouteSnapshot, Router } from '@angular/router'; +import { Observable, of, EMPTY } from 'rxjs'; +import { mergeMap } from 'rxjs/operators'; + +import { IParametroAplicacion, ParametroAplicacion } from '../parametro-aplicacion.model'; +import { ParametroAplicacionService } from '../service/parametro-aplicacion.service'; + +@Injectable({ providedIn: 'root' }) +export class ParametroAplicacionRoutingResolveService implements Resolve { + constructor(protected service: ParametroAplicacionService, protected router: Router) {} + + resolve(route: ActivatedRouteSnapshot): Observable | Observable { + const id = route.params['id']; + if (id) { + return this.service.find(id).pipe( + mergeMap((parametroAplicacion: HttpResponse) => { + if (parametroAplicacion.body) { + return of(parametroAplicacion.body); + } else { + this.router.navigate(['404']); + return EMPTY; + } + }) + ); + } + return of(new ParametroAplicacion()); + } +} diff --git a/src/main/webapp/app/entities/parametro-aplicacion/route/parametro-aplicacion-routing.module.ts b/src/main/webapp/app/entities/parametro-aplicacion/route/parametro-aplicacion-routing.module.ts new file mode 100644 index 0000000..3d9d676 --- /dev/null +++ b/src/main/webapp/app/entities/parametro-aplicacion/route/parametro-aplicacion-routing.module.ts @@ -0,0 +1,46 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; + +import { UserRouteAccessService } from 'app/core/auth/user-route-access.service'; +import { ParametroAplicacionComponent } from '../list/parametro-aplicacion.component'; +import { ParametroAplicacionDetailComponent } from '../detail/parametro-aplicacion-detail.component'; +import { ParametroAplicacionUpdateComponent } from '../update/parametro-aplicacion-update.component'; +import { ParametroAplicacionRoutingResolveService } from './parametro-aplicacion-routing-resolve.service'; + +const parametroAplicacionRoute: Routes = [ + { + path: '', + component: ParametroAplicacionComponent, + canActivate: [UserRouteAccessService], + }, + { + path: ':id/view', + component: ParametroAplicacionDetailComponent, + resolve: { + parametroAplicacion: ParametroAplicacionRoutingResolveService, + }, + canActivate: [UserRouteAccessService], + }, + { + path: 'new', + component: ParametroAplicacionUpdateComponent, + resolve: { + parametroAplicacion: ParametroAplicacionRoutingResolveService, + }, + canActivate: [UserRouteAccessService], + }, + { + path: ':id/edit', + component: ParametroAplicacionUpdateComponent, + resolve: { + parametroAplicacion: ParametroAplicacionRoutingResolveService, + }, + canActivate: [UserRouteAccessService], + }, +]; + +@NgModule({ + imports: [RouterModule.forChild(parametroAplicacionRoute)], + exports: [RouterModule], +}) +export class ParametroAplicacionRoutingModule {} diff --git a/src/main/webapp/app/entities/parametro-aplicacion/service/parametro-aplicacion.service.spec.ts b/src/main/webapp/app/entities/parametro-aplicacion/service/parametro-aplicacion.service.spec.ts new file mode 100644 index 0000000..7f5a87d --- /dev/null +++ b/src/main/webapp/app/entities/parametro-aplicacion/service/parametro-aplicacion.service.spec.ts @@ -0,0 +1,194 @@ +import { TestBed } from '@angular/core/testing'; +import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; + +import { IParametroAplicacion, ParametroAplicacion } from '../parametro-aplicacion.model'; + +import { ParametroAplicacionService } from './parametro-aplicacion.service'; + +describe('Service Tests', () => { + describe('ParametroAplicacion Service', () => { + let service: ParametroAplicacionService; + let httpMock: HttpTestingController; + let elemDefault: IParametroAplicacion; + let expectedResult: IParametroAplicacion | IParametroAplicacion[] | boolean | null; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + }); + expectedResult = null; + service = TestBed.inject(ParametroAplicacionService); + httpMock = TestBed.inject(HttpTestingController); + + elemDefault = { + id: 0, + maxDiasEncuesta: 0, + minDiasEncuesta: 0, + maxCantidadPreguntas: 0, + minCantidadPreguntas: 0, + }; + }); + + describe('Service methods', () => { + it('should find an element', () => { + const returnedFromService = Object.assign({}, elemDefault); + + service.find(123).subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'GET' }); + req.flush(returnedFromService); + expect(expectedResult).toMatchObject(elemDefault); + }); + + it('should create a ParametroAplicacion', () => { + const returnedFromService = Object.assign( + { + id: 0, + }, + elemDefault + ); + + const expected = Object.assign({}, returnedFromService); + + service.create(new ParametroAplicacion()).subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'POST' }); + req.flush(returnedFromService); + expect(expectedResult).toMatchObject(expected); + }); + + it('should update a ParametroAplicacion', () => { + const returnedFromService = Object.assign( + { + id: 1, + maxDiasEncuesta: 1, + minDiasEncuesta: 1, + maxCantidadPreguntas: 1, + minCantidadPreguntas: 1, + }, + elemDefault + ); + + const expected = Object.assign({}, returnedFromService); + + service.update(expected).subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'PUT' }); + req.flush(returnedFromService); + expect(expectedResult).toMatchObject(expected); + }); + + it('should partial update a ParametroAplicacion', () => { + const patchObject = Object.assign( + { + minDiasEncuesta: 1, + minCantidadPreguntas: 1, + }, + new ParametroAplicacion() + ); + + const returnedFromService = Object.assign(patchObject, elemDefault); + + const expected = Object.assign({}, returnedFromService); + + service.partialUpdate(patchObject).subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'PATCH' }); + req.flush(returnedFromService); + expect(expectedResult).toMatchObject(expected); + }); + + it('should return a list of ParametroAplicacion', () => { + const returnedFromService = Object.assign( + { + id: 1, + maxDiasEncuesta: 1, + minDiasEncuesta: 1, + maxCantidadPreguntas: 1, + minCantidadPreguntas: 1, + }, + elemDefault + ); + + const expected = Object.assign({}, returnedFromService); + + service.query().subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'GET' }); + req.flush([returnedFromService]); + httpMock.verify(); + expect(expectedResult).toContainEqual(expected); + }); + + it('should delete a ParametroAplicacion', () => { + service.delete(123).subscribe(resp => (expectedResult = resp.ok)); + + const req = httpMock.expectOne({ method: 'DELETE' }); + req.flush({ status: 200 }); + expect(expectedResult); + }); + + describe('addParametroAplicacionToCollectionIfMissing', () => { + it('should add a ParametroAplicacion to an empty array', () => { + const parametroAplicacion: IParametroAplicacion = { id: 123 }; + expectedResult = service.addParametroAplicacionToCollectionIfMissing([], parametroAplicacion); + expect(expectedResult).toHaveLength(1); + expect(expectedResult).toContain(parametroAplicacion); + }); + + it('should not add a ParametroAplicacion to an array that contains it', () => { + const parametroAplicacion: IParametroAplicacion = { id: 123 }; + const parametroAplicacionCollection: IParametroAplicacion[] = [ + { + ...parametroAplicacion, + }, + { id: 456 }, + ]; + expectedResult = service.addParametroAplicacionToCollectionIfMissing(parametroAplicacionCollection, parametroAplicacion); + expect(expectedResult).toHaveLength(2); + }); + + it("should add a ParametroAplicacion to an array that doesn't contain it", () => { + const parametroAplicacion: IParametroAplicacion = { id: 123 }; + const parametroAplicacionCollection: IParametroAplicacion[] = [{ id: 456 }]; + expectedResult = service.addParametroAplicacionToCollectionIfMissing(parametroAplicacionCollection, parametroAplicacion); + expect(expectedResult).toHaveLength(2); + expect(expectedResult).toContain(parametroAplicacion); + }); + + it('should add only unique ParametroAplicacion to an array', () => { + const parametroAplicacionArray: IParametroAplicacion[] = [{ id: 123 }, { id: 456 }, { id: 22111 }]; + const parametroAplicacionCollection: IParametroAplicacion[] = [{ id: 123 }]; + expectedResult = service.addParametroAplicacionToCollectionIfMissing(parametroAplicacionCollection, ...parametroAplicacionArray); + expect(expectedResult).toHaveLength(3); + }); + + it('should accept varargs', () => { + const parametroAplicacion: IParametroAplicacion = { id: 123 }; + const parametroAplicacion2: IParametroAplicacion = { id: 456 }; + expectedResult = service.addParametroAplicacionToCollectionIfMissing([], parametroAplicacion, parametroAplicacion2); + expect(expectedResult).toHaveLength(2); + expect(expectedResult).toContain(parametroAplicacion); + expect(expectedResult).toContain(parametroAplicacion2); + }); + + it('should accept null and undefined values', () => { + const parametroAplicacion: IParametroAplicacion = { id: 123 }; + expectedResult = service.addParametroAplicacionToCollectionIfMissing([], null, parametroAplicacion, undefined); + expect(expectedResult).toHaveLength(1); + expect(expectedResult).toContain(parametroAplicacion); + }); + + it('should return initial array if no ParametroAplicacion is added', () => { + const parametroAplicacionCollection: IParametroAplicacion[] = [{ id: 123 }]; + expectedResult = service.addParametroAplicacionToCollectionIfMissing(parametroAplicacionCollection, undefined, null); + expect(expectedResult).toEqual(parametroAplicacionCollection); + }); + }); + }); + + afterEach(() => { + httpMock.verify(); + }); + }); +}); diff --git a/src/main/webapp/app/entities/parametro-aplicacion/service/parametro-aplicacion.service.ts b/src/main/webapp/app/entities/parametro-aplicacion/service/parametro-aplicacion.service.ts new file mode 100644 index 0000000..9557e5f --- /dev/null +++ b/src/main/webapp/app/entities/parametro-aplicacion/service/parametro-aplicacion.service.ts @@ -0,0 +1,73 @@ +import { Injectable } from '@angular/core'; +import { HttpClient, HttpResponse } from '@angular/common/http'; +import { Observable } from 'rxjs'; + +import { isPresent } from 'app/core/util/operators'; +import { ApplicationConfigService } from 'app/core/config/application-config.service'; +import { createRequestOption } from 'app/core/request/request-util'; +import { IParametroAplicacion, getParametroAplicacionIdentifier } from '../parametro-aplicacion.model'; + +export type EntityResponseType = HttpResponse; +export type EntityArrayResponseType = HttpResponse; + +@Injectable({ providedIn: 'root' }) +export class ParametroAplicacionService { + protected resourceUrl = this.applicationConfigService.getEndpointFor('api/parametro-aplicacions'); + + constructor(protected http: HttpClient, protected applicationConfigService: ApplicationConfigService) {} + + create(parametroAplicacion: IParametroAplicacion): Observable { + return this.http.post(this.resourceUrl, parametroAplicacion, { observe: 'response' }); + } + + update(parametroAplicacion: IParametroAplicacion): Observable { + return this.http.put( + `${this.resourceUrl}/${getParametroAplicacionIdentifier(parametroAplicacion) as number}`, + parametroAplicacion, + { observe: 'response' } + ); + } + + partialUpdate(parametroAplicacion: IParametroAplicacion): Observable { + return this.http.patch( + `${this.resourceUrl}/${getParametroAplicacionIdentifier(parametroAplicacion) as number}`, + parametroAplicacion, + { observe: 'response' } + ); + } + + find(id: number): Observable { + return this.http.get(`${this.resourceUrl}/${id}`, { observe: 'response' }); + } + + query(req?: any): Observable { + const options = createRequestOption(req); + return this.http.get(this.resourceUrl, { params: options, observe: 'response' }); + } + + delete(id: number): Observable> { + return this.http.delete(`${this.resourceUrl}/${id}`, { observe: 'response' }); + } + + addParametroAplicacionToCollectionIfMissing( + parametroAplicacionCollection: IParametroAplicacion[], + ...parametroAplicacionsToCheck: (IParametroAplicacion | null | undefined)[] + ): IParametroAplicacion[] { + const parametroAplicacions: IParametroAplicacion[] = parametroAplicacionsToCheck.filter(isPresent); + if (parametroAplicacions.length > 0) { + const parametroAplicacionCollectionIdentifiers = parametroAplicacionCollection.map( + parametroAplicacionItem => getParametroAplicacionIdentifier(parametroAplicacionItem)! + ); + const parametroAplicacionsToAdd = parametroAplicacions.filter(parametroAplicacionItem => { + const parametroAplicacionIdentifier = getParametroAplicacionIdentifier(parametroAplicacionItem); + if (parametroAplicacionIdentifier == null || parametroAplicacionCollectionIdentifiers.includes(parametroAplicacionIdentifier)) { + return false; + } + parametroAplicacionCollectionIdentifiers.push(parametroAplicacionIdentifier); + return true; + }); + return [...parametroAplicacionsToAdd, ...parametroAplicacionCollection]; + } + return parametroAplicacionCollection; + } +} diff --git a/src/main/webapp/app/entities/parametro-aplicacion/update/parametro-aplicacion-update.component.html b/src/main/webapp/app/entities/parametro-aplicacion/update/parametro-aplicacion-update.component.html new file mode 100644 index 0000000..ce60704 --- /dev/null +++ b/src/main/webapp/app/entities/parametro-aplicacion/update/parametro-aplicacion-update.component.html @@ -0,0 +1,184 @@ +
+
+
+

+ Create or edit a Parametro Aplicacion +

+ +
+ + +
+ + +
+ +
+ + +
+ + This field is required. + + + This field should be a number. + +
+
+ +
+ + +
+ + This field is required. + + + This field should be a number. + +
+
+ +
+ + +
+ + This field is required. + + + This field should be a number. + +
+
+ +
+ + +
+ + This field is required. + + + This field should be a number. + +
+
+
+ +
+ + + +
+
+
+
diff --git a/src/main/webapp/app/entities/parametro-aplicacion/update/parametro-aplicacion-update.component.spec.ts b/src/main/webapp/app/entities/parametro-aplicacion/update/parametro-aplicacion-update.component.spec.ts new file mode 100644 index 0000000..58b51ab --- /dev/null +++ b/src/main/webapp/app/entities/parametro-aplicacion/update/parametro-aplicacion-update.component.spec.ts @@ -0,0 +1,113 @@ +jest.mock('@angular/router'); + +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { FormBuilder } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; +import { of, Subject } from 'rxjs'; + +import { ParametroAplicacionService } from '../service/parametro-aplicacion.service'; +import { IParametroAplicacion, ParametroAplicacion } from '../parametro-aplicacion.model'; + +import { ParametroAplicacionUpdateComponent } from './parametro-aplicacion-update.component'; + +describe('Component Tests', () => { + describe('ParametroAplicacion Management Update Component', () => { + let comp: ParametroAplicacionUpdateComponent; + let fixture: ComponentFixture; + let activatedRoute: ActivatedRoute; + let parametroAplicacionService: ParametroAplicacionService; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [ParametroAplicacionUpdateComponent], + providers: [FormBuilder, ActivatedRoute], + }) + .overrideTemplate(ParametroAplicacionUpdateComponent, '') + .compileComponents(); + + fixture = TestBed.createComponent(ParametroAplicacionUpdateComponent); + activatedRoute = TestBed.inject(ActivatedRoute); + parametroAplicacionService = TestBed.inject(ParametroAplicacionService); + + comp = fixture.componentInstance; + }); + + describe('ngOnInit', () => { + it('Should update editForm', () => { + const parametroAplicacion: IParametroAplicacion = { id: 456 }; + + activatedRoute.data = of({ parametroAplicacion }); + comp.ngOnInit(); + + expect(comp.editForm.value).toEqual(expect.objectContaining(parametroAplicacion)); + }); + }); + + describe('save', () => { + it('Should call update service on save for existing entity', () => { + // GIVEN + const saveSubject = new Subject>(); + const parametroAplicacion = { id: 123 }; + jest.spyOn(parametroAplicacionService, 'update').mockReturnValue(saveSubject); + jest.spyOn(comp, 'previousState'); + activatedRoute.data = of({ parametroAplicacion }); + comp.ngOnInit(); + + // WHEN + comp.save(); + expect(comp.isSaving).toEqual(true); + saveSubject.next(new HttpResponse({ body: parametroAplicacion })); + saveSubject.complete(); + + // THEN + expect(comp.previousState).toHaveBeenCalled(); + expect(parametroAplicacionService.update).toHaveBeenCalledWith(parametroAplicacion); + expect(comp.isSaving).toEqual(false); + }); + + it('Should call create service on save for new entity', () => { + // GIVEN + const saveSubject = new Subject>(); + const parametroAplicacion = new ParametroAplicacion(); + jest.spyOn(parametroAplicacionService, 'create').mockReturnValue(saveSubject); + jest.spyOn(comp, 'previousState'); + activatedRoute.data = of({ parametroAplicacion }); + comp.ngOnInit(); + + // WHEN + comp.save(); + expect(comp.isSaving).toEqual(true); + saveSubject.next(new HttpResponse({ body: parametroAplicacion })); + saveSubject.complete(); + + // THEN + expect(parametroAplicacionService.create).toHaveBeenCalledWith(parametroAplicacion); + expect(comp.isSaving).toEqual(false); + expect(comp.previousState).toHaveBeenCalled(); + }); + + it('Should set isSaving to false on error', () => { + // GIVEN + const saveSubject = new Subject>(); + const parametroAplicacion = { id: 123 }; + jest.spyOn(parametroAplicacionService, 'update').mockReturnValue(saveSubject); + jest.spyOn(comp, 'previousState'); + activatedRoute.data = of({ parametroAplicacion }); + comp.ngOnInit(); + + // WHEN + comp.save(); + expect(comp.isSaving).toEqual(true); + saveSubject.error('This is an error!'); + + // THEN + expect(parametroAplicacionService.update).toHaveBeenCalledWith(parametroAplicacion); + expect(comp.isSaving).toEqual(false); + expect(comp.previousState).not.toHaveBeenCalled(); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/parametro-aplicacion/update/parametro-aplicacion-update.component.ts b/src/main/webapp/app/entities/parametro-aplicacion/update/parametro-aplicacion-update.component.ts new file mode 100644 index 0000000..ed5eee7 --- /dev/null +++ b/src/main/webapp/app/entities/parametro-aplicacion/update/parametro-aplicacion-update.component.ts @@ -0,0 +1,91 @@ +import { Component, OnInit } from '@angular/core'; +import { HttpResponse } from '@angular/common/http'; +import { FormBuilder, Validators } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; +import { Observable } from 'rxjs'; +import { finalize } from 'rxjs/operators'; + +import { IParametroAplicacion, ParametroAplicacion } from '../parametro-aplicacion.model'; +import { ParametroAplicacionService } from '../service/parametro-aplicacion.service'; + +@Component({ + selector: 'jhi-parametro-aplicacion-update', + templateUrl: './parametro-aplicacion-update.component.html', +}) +export class ParametroAplicacionUpdateComponent implements OnInit { + isSaving = false; + + editForm = this.fb.group({ + id: [], + maxDiasEncuesta: [null, [Validators.required]], + minDiasEncuesta: [null, [Validators.required]], + maxCantidadPreguntas: [null, [Validators.required]], + minCantidadPreguntas: [null, [Validators.required]], + }); + + constructor( + protected parametroAplicacionService: ParametroAplicacionService, + protected activatedRoute: ActivatedRoute, + protected fb: FormBuilder + ) {} + + ngOnInit(): void { + this.activatedRoute.data.subscribe(({ parametroAplicacion }) => { + this.updateForm(parametroAplicacion); + }); + } + + previousState(): void { + window.history.back(); + } + + save(): void { + this.isSaving = true; + const parametroAplicacion = this.createFromForm(); + if (parametroAplicacion.id !== undefined) { + this.subscribeToSaveResponse(this.parametroAplicacionService.update(parametroAplicacion)); + } else { + this.subscribeToSaveResponse(this.parametroAplicacionService.create(parametroAplicacion)); + } + } + + protected subscribeToSaveResponse(result: Observable>): void { + result.pipe(finalize(() => this.onSaveFinalize())).subscribe( + () => this.onSaveSuccess(), + () => this.onSaveError() + ); + } + + protected onSaveSuccess(): void { + this.previousState(); + } + + protected onSaveError(): void { + // Api for inheritance. + } + + protected onSaveFinalize(): void { + this.isSaving = false; + } + + protected updateForm(parametroAplicacion: IParametroAplicacion): void { + this.editForm.patchValue({ + id: parametroAplicacion.id, + maxDiasEncuesta: parametroAplicacion.maxDiasEncuesta, + minDiasEncuesta: parametroAplicacion.minDiasEncuesta, + maxCantidadPreguntas: parametroAplicacion.maxCantidadPreguntas, + minCantidadPreguntas: parametroAplicacion.minCantidadPreguntas, + }); + } + + protected createFromForm(): IParametroAplicacion { + return { + ...new ParametroAplicacion(), + id: this.editForm.get(['id'])!.value, + maxDiasEncuesta: this.editForm.get(['maxDiasEncuesta'])!.value, + minDiasEncuesta: this.editForm.get(['minDiasEncuesta'])!.value, + maxCantidadPreguntas: this.editForm.get(['maxCantidadPreguntas'])!.value, + minCantidadPreguntas: this.editForm.get(['minCantidadPreguntas'])!.value, + }; + } +} diff --git a/src/main/webapp/app/entities/plantilla/delete/plantilla-delete-dialog.component.html b/src/main/webapp/app/entities/plantilla/delete/plantilla-delete-dialog.component.html new file mode 100644 index 0000000..e43778d --- /dev/null +++ b/src/main/webapp/app/entities/plantilla/delete/plantilla-delete-dialog.component.html @@ -0,0 +1,25 @@ +
+ + + + + +
diff --git a/src/main/webapp/app/entities/plantilla/delete/plantilla-delete-dialog.component.spec.ts b/src/main/webapp/app/entities/plantilla/delete/plantilla-delete-dialog.component.spec.ts new file mode 100644 index 0000000..0e2d24c --- /dev/null +++ b/src/main/webapp/app/entities/plantilla/delete/plantilla-delete-dialog.component.spec.ts @@ -0,0 +1,65 @@ +jest.mock('@ng-bootstrap/ng-bootstrap'); + +import { ComponentFixture, TestBed, inject, fakeAsync, tick } from '@angular/core/testing'; +import { HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { of } from 'rxjs'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; + +import { PlantillaService } from '../service/plantilla.service'; + +import { PlantillaDeleteDialogComponent } from './plantilla-delete-dialog.component'; + +describe('Component Tests', () => { + describe('Plantilla Management Delete Component', () => { + let comp: PlantillaDeleteDialogComponent; + let fixture: ComponentFixture; + let service: PlantillaService; + let mockActiveModal: NgbActiveModal; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [PlantillaDeleteDialogComponent], + providers: [NgbActiveModal], + }) + .overrideTemplate(PlantillaDeleteDialogComponent, '') + .compileComponents(); + fixture = TestBed.createComponent(PlantillaDeleteDialogComponent); + comp = fixture.componentInstance; + service = TestBed.inject(PlantillaService); + mockActiveModal = TestBed.inject(NgbActiveModal); + }); + + describe('confirmDelete', () => { + it('Should call delete service on confirmDelete', inject( + [], + fakeAsync(() => { + // GIVEN + jest.spyOn(service, 'delete').mockReturnValue(of(new HttpResponse({}))); + + // WHEN + comp.confirmDelete(123); + tick(); + + // THEN + expect(service.delete).toHaveBeenCalledWith(123); + expect(mockActiveModal.close).toHaveBeenCalledWith('deleted'); + }) + )); + + it('Should not call delete service on clear', () => { + // GIVEN + jest.spyOn(service, 'delete'); + + // WHEN + comp.cancel(); + + // THEN + expect(service.delete).not.toHaveBeenCalled(); + expect(mockActiveModal.close).not.toHaveBeenCalled(); + expect(mockActiveModal.dismiss).toHaveBeenCalled(); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/plantilla/delete/plantilla-delete-dialog.component.ts b/src/main/webapp/app/entities/plantilla/delete/plantilla-delete-dialog.component.ts new file mode 100644 index 0000000..972e8c8 --- /dev/null +++ b/src/main/webapp/app/entities/plantilla/delete/plantilla-delete-dialog.component.ts @@ -0,0 +1,24 @@ +import { Component } from '@angular/core'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; + +import { IPlantilla } from '../plantilla.model'; +import { PlantillaService } from '../service/plantilla.service'; + +@Component({ + templateUrl: './plantilla-delete-dialog.component.html', +}) +export class PlantillaDeleteDialogComponent { + plantilla?: IPlantilla; + + constructor(protected plantillaService: PlantillaService, protected activeModal: NgbActiveModal) {} + + cancel(): void { + this.activeModal.dismiss(); + } + + confirmDelete(id: number): void { + this.plantillaService.delete(id).subscribe(() => { + this.activeModal.close('deleted'); + }); + } +} diff --git a/src/main/webapp/app/entities/plantilla/detail/plantilla-detail.component.html b/src/main/webapp/app/entities/plantilla/detail/plantilla-detail.component.html new file mode 100644 index 0000000..5f2be1a --- /dev/null +++ b/src/main/webapp/app/entities/plantilla/detail/plantilla-detail.component.html @@ -0,0 +1,58 @@ +
+
+
+

Plantilla

+ +
+ + + + + +
+
ID
+
+ {{ plantilla.id }} +
+
Nombre
+
+ {{ plantilla.nombre }} +
+
Descripcion
+
+ {{ plantilla.descripcion }} +
+
Fecha Creacion
+
+ {{ plantilla.fechaCreacion | formatMediumDatetime }} +
+
Fecha Publicacion Tienda
+
+ {{ plantilla.fechaPublicacionTienda | formatMediumDatetime }} +
+
Estado
+
+ {{ plantilla.estado }} +
+
Precio
+
+ {{ plantilla.precio }} +
+
Categoria
+
+ +
+
+ + + + +
+
+
diff --git a/src/main/webapp/app/entities/plantilla/detail/plantilla-detail.component.spec.ts b/src/main/webapp/app/entities/plantilla/detail/plantilla-detail.component.spec.ts new file mode 100644 index 0000000..b9f521a --- /dev/null +++ b/src/main/webapp/app/entities/plantilla/detail/plantilla-detail.component.spec.ts @@ -0,0 +1,38 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { ActivatedRoute } from '@angular/router'; +import { of } from 'rxjs'; + +import { PlantillaDetailComponent } from './plantilla-detail.component'; + +describe('Component Tests', () => { + describe('Plantilla Management Detail Component', () => { + let comp: PlantillaDetailComponent; + let fixture: ComponentFixture; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [PlantillaDetailComponent], + providers: [ + { + provide: ActivatedRoute, + useValue: { data: of({ plantilla: { id: 123 } }) }, + }, + ], + }) + .overrideTemplate(PlantillaDetailComponent, '') + .compileComponents(); + fixture = TestBed.createComponent(PlantillaDetailComponent); + comp = fixture.componentInstance; + }); + + describe('OnInit', () => { + it('Should load plantilla on init', () => { + // WHEN + comp.ngOnInit(); + + // THEN + expect(comp.plantilla).toEqual(expect.objectContaining({ id: 123 })); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/plantilla/detail/plantilla-detail.component.ts b/src/main/webapp/app/entities/plantilla/detail/plantilla-detail.component.ts new file mode 100644 index 0000000..4563a29 --- /dev/null +++ b/src/main/webapp/app/entities/plantilla/detail/plantilla-detail.component.ts @@ -0,0 +1,24 @@ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; + +import { IPlantilla } from '../plantilla.model'; + +@Component({ + selector: 'jhi-plantilla-detail', + templateUrl: './plantilla-detail.component.html', +}) +export class PlantillaDetailComponent implements OnInit { + plantilla: IPlantilla | null = null; + + constructor(protected activatedRoute: ActivatedRoute) {} + + ngOnInit(): void { + this.activatedRoute.data.subscribe(({ plantilla }) => { + this.plantilla = plantilla; + }); + } + + previousState(): void { + window.history.back(); + } +} diff --git a/src/main/webapp/app/entities/plantilla/list/plantilla.component.html b/src/main/webapp/app/entities/plantilla/list/plantilla.component.html new file mode 100644 index 0000000..c726a6a --- /dev/null +++ b/src/main/webapp/app/entities/plantilla/list/plantilla.component.html @@ -0,0 +1,94 @@ +
+

+ Plantillas + +
+ + + +
+

+ + + + + +
+ No plantillas found +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
IDNombreDescripcionFecha CreacionFecha Publicacion TiendaEstadoPrecioCategoria
+ {{ plantilla.id }} + {{ plantilla.nombre }}{{ plantilla.descripcion }}{{ plantilla.fechaCreacion | formatMediumDatetime }}{{ plantilla.fechaPublicacionTienda | formatMediumDatetime }}{{ plantilla.estado }}{{ plantilla.precio }} + + +
+ + + + + +
+
+
+
diff --git a/src/main/webapp/app/entities/plantilla/list/plantilla.component.spec.ts b/src/main/webapp/app/entities/plantilla/list/plantilla.component.spec.ts new file mode 100644 index 0000000..b85ec78 --- /dev/null +++ b/src/main/webapp/app/entities/plantilla/list/plantilla.component.spec.ts @@ -0,0 +1,48 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { HttpHeaders, HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { of } from 'rxjs'; + +import { PlantillaService } from '../service/plantilla.service'; + +import { PlantillaComponent } from './plantilla.component'; + +describe('Component Tests', () => { + describe('Plantilla Management Component', () => { + let comp: PlantillaComponent; + let fixture: ComponentFixture; + let service: PlantillaService; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [PlantillaComponent], + }) + .overrideTemplate(PlantillaComponent, '') + .compileComponents(); + + fixture = TestBed.createComponent(PlantillaComponent); + comp = fixture.componentInstance; + service = TestBed.inject(PlantillaService); + + const headers = new HttpHeaders().append('link', 'link;link'); + jest.spyOn(service, 'query').mockReturnValue( + of( + new HttpResponse({ + body: [{ id: 123 }], + headers, + }) + ) + ); + }); + + it('Should call load all on init', () => { + // WHEN + comp.ngOnInit(); + + // THEN + expect(service.query).toHaveBeenCalled(); + expect(comp.plantillas?.[0]).toEqual(expect.objectContaining({ id: 123 })); + }); + }); +}); diff --git a/src/main/webapp/app/entities/plantilla/list/plantilla.component.ts b/src/main/webapp/app/entities/plantilla/list/plantilla.component.ts new file mode 100644 index 0000000..21ab70f --- /dev/null +++ b/src/main/webapp/app/entities/plantilla/list/plantilla.component.ts @@ -0,0 +1,51 @@ +import { Component, OnInit } from '@angular/core'; +import { HttpResponse } from '@angular/common/http'; +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; + +import { IPlantilla } from '../plantilla.model'; +import { PlantillaService } from '../service/plantilla.service'; +import { PlantillaDeleteDialogComponent } from '../delete/plantilla-delete-dialog.component'; + +@Component({ + selector: 'jhi-plantilla', + templateUrl: './plantilla.component.html', +}) +export class PlantillaComponent implements OnInit { + plantillas?: IPlantilla[]; + isLoading = false; + + constructor(protected plantillaService: PlantillaService, protected modalService: NgbModal) {} + + loadAll(): void { + this.isLoading = true; + + this.plantillaService.query().subscribe( + (res: HttpResponse) => { + this.isLoading = false; + this.plantillas = res.body ?? []; + }, + () => { + this.isLoading = false; + } + ); + } + + ngOnInit(): void { + this.loadAll(); + } + + trackId(index: number, item: IPlantilla): number { + return item.id!; + } + + delete(plantilla: IPlantilla): void { + const modalRef = this.modalService.open(PlantillaDeleteDialogComponent, { size: 'lg', backdrop: 'static' }); + modalRef.componentInstance.plantilla = plantilla; + // unsubscribe not needed because closed completes on modal close + modalRef.closed.subscribe(reason => { + if (reason === 'deleted') { + this.loadAll(); + } + }); + } +} diff --git a/src/main/webapp/app/entities/plantilla/plantilla.model.ts b/src/main/webapp/app/entities/plantilla/plantilla.model.ts new file mode 100644 index 0000000..eb996a7 --- /dev/null +++ b/src/main/webapp/app/entities/plantilla/plantilla.model.ts @@ -0,0 +1,40 @@ +import * as dayjs from 'dayjs'; +import { IPPreguntaCerrada } from 'app/entities/p-pregunta-cerrada/p-pregunta-cerrada.model'; +import { IPPreguntaAbierta } from 'app/entities/p-pregunta-abierta/p-pregunta-abierta.model'; +import { ICategoria } from 'app/entities/categoria/categoria.model'; +import { IUsuarioExtra } from 'app/entities/usuario-extra/usuario-extra.model'; +import { EstadoPlantilla } from 'app/entities/enumerations/estado-plantilla.model'; + +export interface IPlantilla { + id?: number; + nombre?: string | null; + descripcion?: string | null; + fechaCreacion?: dayjs.Dayjs; + fechaPublicacionTienda?: dayjs.Dayjs | null; + estado?: EstadoPlantilla; + precio?: number; + pPreguntaCerradas?: IPPreguntaCerrada[] | null; + pPreguntaAbiertas?: IPPreguntaAbierta[] | null; + categoria?: ICategoria | null; + usuarioExtras?: IUsuarioExtra[] | null; +} + +export class Plantilla implements IPlantilla { + constructor( + public id?: number, + public nombre?: string | null, + public descripcion?: string | null, + public fechaCreacion?: dayjs.Dayjs, + public fechaPublicacionTienda?: dayjs.Dayjs | null, + public estado?: EstadoPlantilla, + public precio?: number, + public pPreguntaCerradas?: IPPreguntaCerrada[] | null, + public pPreguntaAbiertas?: IPPreguntaAbierta[] | null, + public categoria?: ICategoria | null, + public usuarioExtras?: IUsuarioExtra[] | null + ) {} +} + +export function getPlantillaIdentifier(plantilla: IPlantilla): number | undefined { + return plantilla.id; +} diff --git a/src/main/webapp/app/entities/plantilla/plantilla.module.ts b/src/main/webapp/app/entities/plantilla/plantilla.module.ts new file mode 100644 index 0000000..2284714 --- /dev/null +++ b/src/main/webapp/app/entities/plantilla/plantilla.module.ts @@ -0,0 +1,14 @@ +import { NgModule } from '@angular/core'; +import { SharedModule } from 'app/shared/shared.module'; +import { PlantillaComponent } from './list/plantilla.component'; +import { PlantillaDetailComponent } from './detail/plantilla-detail.component'; +import { PlantillaUpdateComponent } from './update/plantilla-update.component'; +import { PlantillaDeleteDialogComponent } from './delete/plantilla-delete-dialog.component'; +import { PlantillaRoutingModule } from './route/plantilla-routing.module'; + +@NgModule({ + imports: [SharedModule, PlantillaRoutingModule], + declarations: [PlantillaComponent, PlantillaDetailComponent, PlantillaUpdateComponent, PlantillaDeleteDialogComponent], + entryComponents: [PlantillaDeleteDialogComponent], +}) +export class PlantillaModule {} diff --git a/src/main/webapp/app/entities/plantilla/route/plantilla-routing-resolve.service.spec.ts b/src/main/webapp/app/entities/plantilla/route/plantilla-routing-resolve.service.spec.ts new file mode 100644 index 0000000..4710e59 --- /dev/null +++ b/src/main/webapp/app/entities/plantilla/route/plantilla-routing-resolve.service.spec.ts @@ -0,0 +1,82 @@ +jest.mock('@angular/router'); + +import { TestBed } from '@angular/core/testing'; +import { HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { ActivatedRouteSnapshot, Router } from '@angular/router'; +import { of } from 'rxjs'; + +import { IPlantilla, Plantilla } from '../plantilla.model'; +import { PlantillaService } from '../service/plantilla.service'; + +import { PlantillaRoutingResolveService } from './plantilla-routing-resolve.service'; + +describe('Service Tests', () => { + describe('Plantilla routing resolve service', () => { + let mockRouter: Router; + let mockActivatedRouteSnapshot: ActivatedRouteSnapshot; + let routingResolveService: PlantillaRoutingResolveService; + let service: PlantillaService; + let resultPlantilla: IPlantilla | undefined; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [Router, ActivatedRouteSnapshot], + }); + mockRouter = TestBed.inject(Router); + mockActivatedRouteSnapshot = TestBed.inject(ActivatedRouteSnapshot); + routingResolveService = TestBed.inject(PlantillaRoutingResolveService); + service = TestBed.inject(PlantillaService); + resultPlantilla = undefined; + }); + + describe('resolve', () => { + it('should return IPlantilla returned by find', () => { + // GIVEN + service.find = jest.fn(id => of(new HttpResponse({ body: { id } }))); + mockActivatedRouteSnapshot.params = { id: 123 }; + + // WHEN + routingResolveService.resolve(mockActivatedRouteSnapshot).subscribe(result => { + resultPlantilla = result; + }); + + // THEN + expect(service.find).toBeCalledWith(123); + expect(resultPlantilla).toEqual({ id: 123 }); + }); + + it('should return new IPlantilla if id is not provided', () => { + // GIVEN + service.find = jest.fn(); + mockActivatedRouteSnapshot.params = {}; + + // WHEN + routingResolveService.resolve(mockActivatedRouteSnapshot).subscribe(result => { + resultPlantilla = result; + }); + + // THEN + expect(service.find).not.toBeCalled(); + expect(resultPlantilla).toEqual(new Plantilla()); + }); + + it('should route to 404 page if data not found in server', () => { + // GIVEN + jest.spyOn(service, 'find').mockReturnValue(of(new HttpResponse({ body: null as unknown as Plantilla }))); + mockActivatedRouteSnapshot.params = { id: 123 }; + + // WHEN + routingResolveService.resolve(mockActivatedRouteSnapshot).subscribe(result => { + resultPlantilla = result; + }); + + // THEN + expect(service.find).toBeCalledWith(123); + expect(resultPlantilla).toEqual(undefined); + expect(mockRouter.navigate).toHaveBeenCalledWith(['404']); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/plantilla/route/plantilla-routing-resolve.service.ts b/src/main/webapp/app/entities/plantilla/route/plantilla-routing-resolve.service.ts new file mode 100644 index 0000000..2ea51ac --- /dev/null +++ b/src/main/webapp/app/entities/plantilla/route/plantilla-routing-resolve.service.ts @@ -0,0 +1,30 @@ +import { Injectable } from '@angular/core'; +import { HttpResponse } from '@angular/common/http'; +import { Resolve, ActivatedRouteSnapshot, Router } from '@angular/router'; +import { Observable, of, EMPTY } from 'rxjs'; +import { mergeMap } from 'rxjs/operators'; + +import { IPlantilla, Plantilla } from '../plantilla.model'; +import { PlantillaService } from '../service/plantilla.service'; + +@Injectable({ providedIn: 'root' }) +export class PlantillaRoutingResolveService implements Resolve { + constructor(protected service: PlantillaService, protected router: Router) {} + + resolve(route: ActivatedRouteSnapshot): Observable | Observable { + const id = route.params['id']; + if (id) { + return this.service.find(id).pipe( + mergeMap((plantilla: HttpResponse) => { + if (plantilla.body) { + return of(plantilla.body); + } else { + this.router.navigate(['404']); + return EMPTY; + } + }) + ); + } + return of(new Plantilla()); + } +} diff --git a/src/main/webapp/app/entities/plantilla/route/plantilla-routing.module.ts b/src/main/webapp/app/entities/plantilla/route/plantilla-routing.module.ts new file mode 100644 index 0000000..246c71e --- /dev/null +++ b/src/main/webapp/app/entities/plantilla/route/plantilla-routing.module.ts @@ -0,0 +1,46 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; + +import { UserRouteAccessService } from 'app/core/auth/user-route-access.service'; +import { PlantillaComponent } from '../list/plantilla.component'; +import { PlantillaDetailComponent } from '../detail/plantilla-detail.component'; +import { PlantillaUpdateComponent } from '../update/plantilla-update.component'; +import { PlantillaRoutingResolveService } from './plantilla-routing-resolve.service'; + +const plantillaRoute: Routes = [ + { + path: '', + component: PlantillaComponent, + canActivate: [UserRouteAccessService], + }, + { + path: ':id/view', + component: PlantillaDetailComponent, + resolve: { + plantilla: PlantillaRoutingResolveService, + }, + canActivate: [UserRouteAccessService], + }, + { + path: 'new', + component: PlantillaUpdateComponent, + resolve: { + plantilla: PlantillaRoutingResolveService, + }, + canActivate: [UserRouteAccessService], + }, + { + path: ':id/edit', + component: PlantillaUpdateComponent, + resolve: { + plantilla: PlantillaRoutingResolveService, + }, + canActivate: [UserRouteAccessService], + }, +]; + +@NgModule({ + imports: [RouterModule.forChild(plantillaRoute)], + exports: [RouterModule], +}) +export class PlantillaRoutingModule {} diff --git a/src/main/webapp/app/entities/plantilla/service/plantilla.service.spec.ts b/src/main/webapp/app/entities/plantilla/service/plantilla.service.spec.ts new file mode 100644 index 0000000..72703b0 --- /dev/null +++ b/src/main/webapp/app/entities/plantilla/service/plantilla.service.spec.ts @@ -0,0 +1,237 @@ +import { TestBed } from '@angular/core/testing'; +import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; +import * as dayjs from 'dayjs'; + +import { DATE_TIME_FORMAT } from 'app/config/input.constants'; +import { EstadoPlantilla } from 'app/entities/enumerations/estado-plantilla.model'; +import { IPlantilla, Plantilla } from '../plantilla.model'; + +import { PlantillaService } from './plantilla.service'; + +describe('Service Tests', () => { + describe('Plantilla Service', () => { + let service: PlantillaService; + let httpMock: HttpTestingController; + let elemDefault: IPlantilla; + let expectedResult: IPlantilla | IPlantilla[] | boolean | null; + let currentDate: dayjs.Dayjs; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + }); + expectedResult = null; + service = TestBed.inject(PlantillaService); + httpMock = TestBed.inject(HttpTestingController); + currentDate = dayjs(); + + elemDefault = { + id: 0, + nombre: 'AAAAAAA', + descripcion: 'AAAAAAA', + fechaCreacion: currentDate, + fechaPublicacionTienda: currentDate, + estado: EstadoPlantilla.DRAFT, + precio: 0, + }; + }); + + describe('Service methods', () => { + it('should find an element', () => { + const returnedFromService = Object.assign( + { + fechaCreacion: currentDate.format(DATE_TIME_FORMAT), + fechaPublicacionTienda: currentDate.format(DATE_TIME_FORMAT), + }, + elemDefault + ); + + service.find(123).subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'GET' }); + req.flush(returnedFromService); + expect(expectedResult).toMatchObject(elemDefault); + }); + + it('should create a Plantilla', () => { + const returnedFromService = Object.assign( + { + id: 0, + fechaCreacion: currentDate.format(DATE_TIME_FORMAT), + fechaPublicacionTienda: currentDate.format(DATE_TIME_FORMAT), + }, + elemDefault + ); + + const expected = Object.assign( + { + fechaCreacion: currentDate, + fechaPublicacionTienda: currentDate, + }, + returnedFromService + ); + + service.create(new Plantilla()).subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'POST' }); + req.flush(returnedFromService); + expect(expectedResult).toMatchObject(expected); + }); + + it('should update a Plantilla', () => { + const returnedFromService = Object.assign( + { + id: 1, + nombre: 'BBBBBB', + descripcion: 'BBBBBB', + fechaCreacion: currentDate.format(DATE_TIME_FORMAT), + fechaPublicacionTienda: currentDate.format(DATE_TIME_FORMAT), + estado: 'BBBBBB', + precio: 1, + }, + elemDefault + ); + + const expected = Object.assign( + { + fechaCreacion: currentDate, + fechaPublicacionTienda: currentDate, + }, + returnedFromService + ); + + service.update(expected).subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'PUT' }); + req.flush(returnedFromService); + expect(expectedResult).toMatchObject(expected); + }); + + it('should partial update a Plantilla', () => { + const patchObject = Object.assign( + { + descripcion: 'BBBBBB', + estado: 'BBBBBB', + }, + new Plantilla() + ); + + const returnedFromService = Object.assign(patchObject, elemDefault); + + const expected = Object.assign( + { + fechaCreacion: currentDate, + fechaPublicacionTienda: currentDate, + }, + returnedFromService + ); + + service.partialUpdate(patchObject).subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'PATCH' }); + req.flush(returnedFromService); + expect(expectedResult).toMatchObject(expected); + }); + + it('should return a list of Plantilla', () => { + const returnedFromService = Object.assign( + { + id: 1, + nombre: 'BBBBBB', + descripcion: 'BBBBBB', + fechaCreacion: currentDate.format(DATE_TIME_FORMAT), + fechaPublicacionTienda: currentDate.format(DATE_TIME_FORMAT), + estado: 'BBBBBB', + precio: 1, + }, + elemDefault + ); + + const expected = Object.assign( + { + fechaCreacion: currentDate, + fechaPublicacionTienda: currentDate, + }, + returnedFromService + ); + + service.query().subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'GET' }); + req.flush([returnedFromService]); + httpMock.verify(); + expect(expectedResult).toContainEqual(expected); + }); + + it('should delete a Plantilla', () => { + service.delete(123).subscribe(resp => (expectedResult = resp.ok)); + + const req = httpMock.expectOne({ method: 'DELETE' }); + req.flush({ status: 200 }); + expect(expectedResult); + }); + + describe('addPlantillaToCollectionIfMissing', () => { + it('should add a Plantilla to an empty array', () => { + const plantilla: IPlantilla = { id: 123 }; + expectedResult = service.addPlantillaToCollectionIfMissing([], plantilla); + expect(expectedResult).toHaveLength(1); + expect(expectedResult).toContain(plantilla); + }); + + it('should not add a Plantilla to an array that contains it', () => { + const plantilla: IPlantilla = { id: 123 }; + const plantillaCollection: IPlantilla[] = [ + { + ...plantilla, + }, + { id: 456 }, + ]; + expectedResult = service.addPlantillaToCollectionIfMissing(plantillaCollection, plantilla); + expect(expectedResult).toHaveLength(2); + }); + + it("should add a Plantilla to an array that doesn't contain it", () => { + const plantilla: IPlantilla = { id: 123 }; + const plantillaCollection: IPlantilla[] = [{ id: 456 }]; + expectedResult = service.addPlantillaToCollectionIfMissing(plantillaCollection, plantilla); + expect(expectedResult).toHaveLength(2); + expect(expectedResult).toContain(plantilla); + }); + + it('should add only unique Plantilla to an array', () => { + const plantillaArray: IPlantilla[] = [{ id: 123 }, { id: 456 }, { id: 99638 }]; + const plantillaCollection: IPlantilla[] = [{ id: 123 }]; + expectedResult = service.addPlantillaToCollectionIfMissing(plantillaCollection, ...plantillaArray); + expect(expectedResult).toHaveLength(3); + }); + + it('should accept varargs', () => { + const plantilla: IPlantilla = { id: 123 }; + const plantilla2: IPlantilla = { id: 456 }; + expectedResult = service.addPlantillaToCollectionIfMissing([], plantilla, plantilla2); + expect(expectedResult).toHaveLength(2); + expect(expectedResult).toContain(plantilla); + expect(expectedResult).toContain(plantilla2); + }); + + it('should accept null and undefined values', () => { + const plantilla: IPlantilla = { id: 123 }; + expectedResult = service.addPlantillaToCollectionIfMissing([], null, plantilla, undefined); + expect(expectedResult).toHaveLength(1); + expect(expectedResult).toContain(plantilla); + }); + + it('should return initial array if no Plantilla is added', () => { + const plantillaCollection: IPlantilla[] = [{ id: 123 }]; + expectedResult = service.addPlantillaToCollectionIfMissing(plantillaCollection, undefined, null); + expect(expectedResult).toEqual(plantillaCollection); + }); + }); + }); + + afterEach(() => { + httpMock.verify(); + }); + }); +}); diff --git a/src/main/webapp/app/entities/plantilla/service/plantilla.service.ts b/src/main/webapp/app/entities/plantilla/service/plantilla.service.ts new file mode 100644 index 0000000..6402f49 --- /dev/null +++ b/src/main/webapp/app/entities/plantilla/service/plantilla.service.ts @@ -0,0 +1,103 @@ +import { Injectable } from '@angular/core'; +import { HttpClient, HttpResponse } from '@angular/common/http'; +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; +import * as dayjs from 'dayjs'; + +import { isPresent } from 'app/core/util/operators'; +import { ApplicationConfigService } from 'app/core/config/application-config.service'; +import { createRequestOption } from 'app/core/request/request-util'; +import { IPlantilla, getPlantillaIdentifier } from '../plantilla.model'; + +export type EntityResponseType = HttpResponse; +export type EntityArrayResponseType = HttpResponse; + +@Injectable({ providedIn: 'root' }) +export class PlantillaService { + protected resourceUrl = this.applicationConfigService.getEndpointFor('api/plantillas'); + + constructor(protected http: HttpClient, protected applicationConfigService: ApplicationConfigService) {} + + create(plantilla: IPlantilla): Observable { + const copy = this.convertDateFromClient(plantilla); + return this.http + .post(this.resourceUrl, copy, { observe: 'response' }) + .pipe(map((res: EntityResponseType) => this.convertDateFromServer(res))); + } + + update(plantilla: IPlantilla): Observable { + const copy = this.convertDateFromClient(plantilla); + return this.http + .put(`${this.resourceUrl}/${getPlantillaIdentifier(plantilla) as number}`, copy, { observe: 'response' }) + .pipe(map((res: EntityResponseType) => this.convertDateFromServer(res))); + } + + partialUpdate(plantilla: IPlantilla): Observable { + const copy = this.convertDateFromClient(plantilla); + return this.http + .patch(`${this.resourceUrl}/${getPlantillaIdentifier(plantilla) as number}`, copy, { observe: 'response' }) + .pipe(map((res: EntityResponseType) => this.convertDateFromServer(res))); + } + + find(id: number): Observable { + return this.http + .get(`${this.resourceUrl}/${id}`, { observe: 'response' }) + .pipe(map((res: EntityResponseType) => this.convertDateFromServer(res))); + } + + query(req?: any): Observable { + const options = createRequestOption(req); + return this.http + .get(this.resourceUrl, { params: options, observe: 'response' }) + .pipe(map((res: EntityArrayResponseType) => this.convertDateArrayFromServer(res))); + } + + delete(id: number): Observable> { + return this.http.delete(`${this.resourceUrl}/${id}`, { observe: 'response' }); + } + + addPlantillaToCollectionIfMissing( + plantillaCollection: IPlantilla[], + ...plantillasToCheck: (IPlantilla | null | undefined)[] + ): IPlantilla[] { + const plantillas: IPlantilla[] = plantillasToCheck.filter(isPresent); + if (plantillas.length > 0) { + const plantillaCollectionIdentifiers = plantillaCollection.map(plantillaItem => getPlantillaIdentifier(plantillaItem)!); + const plantillasToAdd = plantillas.filter(plantillaItem => { + const plantillaIdentifier = getPlantillaIdentifier(plantillaItem); + if (plantillaIdentifier == null || plantillaCollectionIdentifiers.includes(plantillaIdentifier)) { + return false; + } + plantillaCollectionIdentifiers.push(plantillaIdentifier); + return true; + }); + return [...plantillasToAdd, ...plantillaCollection]; + } + return plantillaCollection; + } + + protected convertDateFromClient(plantilla: IPlantilla): IPlantilla { + return Object.assign({}, plantilla, { + fechaCreacion: plantilla.fechaCreacion?.isValid() ? plantilla.fechaCreacion.toJSON() : undefined, + fechaPublicacionTienda: plantilla.fechaPublicacionTienda?.isValid() ? plantilla.fechaPublicacionTienda.toJSON() : undefined, + }); + } + + protected convertDateFromServer(res: EntityResponseType): EntityResponseType { + if (res.body) { + res.body.fechaCreacion = res.body.fechaCreacion ? dayjs(res.body.fechaCreacion) : undefined; + res.body.fechaPublicacionTienda = res.body.fechaPublicacionTienda ? dayjs(res.body.fechaPublicacionTienda) : undefined; + } + return res; + } + + protected convertDateArrayFromServer(res: EntityArrayResponseType): EntityArrayResponseType { + if (res.body) { + res.body.forEach((plantilla: IPlantilla) => { + plantilla.fechaCreacion = plantilla.fechaCreacion ? dayjs(plantilla.fechaCreacion) : undefined; + plantilla.fechaPublicacionTienda = plantilla.fechaPublicacionTienda ? dayjs(plantilla.fechaPublicacionTienda) : undefined; + }); + } + return res; + } +} diff --git a/src/main/webapp/app/entities/plantilla/update/plantilla-update.component.html b/src/main/webapp/app/entities/plantilla/update/plantilla-update.component.html new file mode 100644 index 0000000..59cd6ea --- /dev/null +++ b/src/main/webapp/app/entities/plantilla/update/plantilla-update.component.html @@ -0,0 +1,165 @@ +
+
+
+

+ Create or edit a Plantilla +

+ +
+ + +
+ + +
+ +
+ + +
+ + This field is required to be at least 1 characters. + + + This field cannot be longer than 50 characters. + +
+
+ +
+ + +
+ +
+ +
+ +
+
+ + This field is required. + + + This field should be a date and time. + +
+
+ +
+ +
+ +
+
+ +
+ + +
+ + This field is required. + +
+
+ +
+ + +
+ + This field is required. + + + This field should be a number. + +
+
+ +
+ + +
+
+ +
+ + + +
+
+
+
diff --git a/src/main/webapp/app/entities/plantilla/update/plantilla-update.component.spec.ts b/src/main/webapp/app/entities/plantilla/update/plantilla-update.component.spec.ts new file mode 100644 index 0000000..5472ebd --- /dev/null +++ b/src/main/webapp/app/entities/plantilla/update/plantilla-update.component.spec.ts @@ -0,0 +1,149 @@ +jest.mock('@angular/router'); + +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { FormBuilder } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; +import { of, Subject } from 'rxjs'; + +import { PlantillaService } from '../service/plantilla.service'; +import { IPlantilla, Plantilla } from '../plantilla.model'; +import { ICategoria } from 'app/entities/categoria/categoria.model'; +import { CategoriaService } from 'app/entities/categoria/service/categoria.service'; + +import { PlantillaUpdateComponent } from './plantilla-update.component'; + +describe('Component Tests', () => { + describe('Plantilla Management Update Component', () => { + let comp: PlantillaUpdateComponent; + let fixture: ComponentFixture; + let activatedRoute: ActivatedRoute; + let plantillaService: PlantillaService; + let categoriaService: CategoriaService; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [PlantillaUpdateComponent], + providers: [FormBuilder, ActivatedRoute], + }) + .overrideTemplate(PlantillaUpdateComponent, '') + .compileComponents(); + + fixture = TestBed.createComponent(PlantillaUpdateComponent); + activatedRoute = TestBed.inject(ActivatedRoute); + plantillaService = TestBed.inject(PlantillaService); + categoriaService = TestBed.inject(CategoriaService); + + comp = fixture.componentInstance; + }); + + describe('ngOnInit', () => { + it('Should call Categoria query and add missing value', () => { + const plantilla: IPlantilla = { id: 456 }; + const categoria: ICategoria = { id: 73894 }; + plantilla.categoria = categoria; + + const categoriaCollection: ICategoria[] = [{ id: 27351 }]; + jest.spyOn(categoriaService, 'query').mockReturnValue(of(new HttpResponse({ body: categoriaCollection }))); + const additionalCategorias = [categoria]; + const expectedCollection: ICategoria[] = [...additionalCategorias, ...categoriaCollection]; + jest.spyOn(categoriaService, 'addCategoriaToCollectionIfMissing').mockReturnValue(expectedCollection); + + activatedRoute.data = of({ plantilla }); + comp.ngOnInit(); + + expect(categoriaService.query).toHaveBeenCalled(); + expect(categoriaService.addCategoriaToCollectionIfMissing).toHaveBeenCalledWith(categoriaCollection, ...additionalCategorias); + expect(comp.categoriasSharedCollection).toEqual(expectedCollection); + }); + + it('Should update editForm', () => { + const plantilla: IPlantilla = { id: 456 }; + const categoria: ICategoria = { id: 51554 }; + plantilla.categoria = categoria; + + activatedRoute.data = of({ plantilla }); + comp.ngOnInit(); + + expect(comp.editForm.value).toEqual(expect.objectContaining(plantilla)); + expect(comp.categoriasSharedCollection).toContain(categoria); + }); + }); + + describe('save', () => { + it('Should call update service on save for existing entity', () => { + // GIVEN + const saveSubject = new Subject>(); + const plantilla = { id: 123 }; + jest.spyOn(plantillaService, 'update').mockReturnValue(saveSubject); + jest.spyOn(comp, 'previousState'); + activatedRoute.data = of({ plantilla }); + comp.ngOnInit(); + + // WHEN + comp.save(); + expect(comp.isSaving).toEqual(true); + saveSubject.next(new HttpResponse({ body: plantilla })); + saveSubject.complete(); + + // THEN + expect(comp.previousState).toHaveBeenCalled(); + expect(plantillaService.update).toHaveBeenCalledWith(plantilla); + expect(comp.isSaving).toEqual(false); + }); + + it('Should call create service on save for new entity', () => { + // GIVEN + const saveSubject = new Subject>(); + const plantilla = new Plantilla(); + jest.spyOn(plantillaService, 'create').mockReturnValue(saveSubject); + jest.spyOn(comp, 'previousState'); + activatedRoute.data = of({ plantilla }); + comp.ngOnInit(); + + // WHEN + comp.save(); + expect(comp.isSaving).toEqual(true); + saveSubject.next(new HttpResponse({ body: plantilla })); + saveSubject.complete(); + + // THEN + expect(plantillaService.create).toHaveBeenCalledWith(plantilla); + expect(comp.isSaving).toEqual(false); + expect(comp.previousState).toHaveBeenCalled(); + }); + + it('Should set isSaving to false on error', () => { + // GIVEN + const saveSubject = new Subject>(); + const plantilla = { id: 123 }; + jest.spyOn(plantillaService, 'update').mockReturnValue(saveSubject); + jest.spyOn(comp, 'previousState'); + activatedRoute.data = of({ plantilla }); + comp.ngOnInit(); + + // WHEN + comp.save(); + expect(comp.isSaving).toEqual(true); + saveSubject.error('This is an error!'); + + // THEN + expect(plantillaService.update).toHaveBeenCalledWith(plantilla); + expect(comp.isSaving).toEqual(false); + expect(comp.previousState).not.toHaveBeenCalled(); + }); + }); + + describe('Tracking relationships identifiers', () => { + describe('trackCategoriaById', () => { + it('Should return tracked Categoria primary key', () => { + const entity = { id: 123 }; + const trackResult = comp.trackCategoriaById(0, entity); + expect(trackResult).toEqual(entity.id); + }); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/plantilla/update/plantilla-update.component.ts b/src/main/webapp/app/entities/plantilla/update/plantilla-update.component.ts new file mode 100644 index 0000000..21f1465 --- /dev/null +++ b/src/main/webapp/app/entities/plantilla/update/plantilla-update.component.ts @@ -0,0 +1,141 @@ +import { Component, OnInit } from '@angular/core'; +import { HttpResponse } from '@angular/common/http'; +import { FormBuilder, Validators } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; +import { Observable } from 'rxjs'; +import { finalize, map } from 'rxjs/operators'; + +import * as dayjs from 'dayjs'; +import { DATE_TIME_FORMAT } from 'app/config/input.constants'; + +import { IPlantilla, Plantilla } from '../plantilla.model'; +import { PlantillaService } from '../service/plantilla.service'; +import { ICategoria } from 'app/entities/categoria/categoria.model'; +import { CategoriaService } from 'app/entities/categoria/service/categoria.service'; + +@Component({ + selector: 'jhi-plantilla-update', + templateUrl: './plantilla-update.component.html', +}) +export class PlantillaUpdateComponent implements OnInit { + isSaving = false; + + categoriasSharedCollection: ICategoria[] = []; + + editForm = this.fb.group({ + id: [], + nombre: [null, [Validators.minLength(1), Validators.maxLength(50)]], + descripcion: [], + fechaCreacion: [null, [Validators.required]], + fechaPublicacionTienda: [], + estado: [null, [Validators.required]], + precio: [null, [Validators.required]], + categoria: [], + }); + + constructor( + protected plantillaService: PlantillaService, + protected categoriaService: CategoriaService, + protected activatedRoute: ActivatedRoute, + protected fb: FormBuilder + ) {} + + ngOnInit(): void { + this.activatedRoute.data.subscribe(({ plantilla }) => { + if (plantilla.id === undefined) { + const today = dayjs().startOf('day'); + plantilla.fechaCreacion = today; + plantilla.fechaPublicacionTienda = today; + } + + this.updateForm(plantilla); + + this.loadRelationshipsOptions(); + }); + } + + previousState(): void { + window.history.back(); + } + + save(): void { + this.isSaving = true; + const plantilla = this.createFromForm(); + if (plantilla.id !== undefined) { + this.subscribeToSaveResponse(this.plantillaService.update(plantilla)); + } else { + this.subscribeToSaveResponse(this.plantillaService.create(plantilla)); + } + } + + trackCategoriaById(index: number, item: ICategoria): number { + return item.id!; + } + + protected subscribeToSaveResponse(result: Observable>): void { + result.pipe(finalize(() => this.onSaveFinalize())).subscribe( + () => this.onSaveSuccess(), + () => this.onSaveError() + ); + } + + protected onSaveSuccess(): void { + this.previousState(); + } + + protected onSaveError(): void { + // Api for inheritance. + } + + protected onSaveFinalize(): void { + this.isSaving = false; + } + + protected updateForm(plantilla: IPlantilla): void { + this.editForm.patchValue({ + id: plantilla.id, + nombre: plantilla.nombre, + descripcion: plantilla.descripcion, + fechaCreacion: plantilla.fechaCreacion ? plantilla.fechaCreacion.format(DATE_TIME_FORMAT) : null, + fechaPublicacionTienda: plantilla.fechaPublicacionTienda ? plantilla.fechaPublicacionTienda.format(DATE_TIME_FORMAT) : null, + estado: plantilla.estado, + precio: plantilla.precio, + categoria: plantilla.categoria, + }); + + this.categoriasSharedCollection = this.categoriaService.addCategoriaToCollectionIfMissing( + this.categoriasSharedCollection, + plantilla.categoria + ); + } + + protected loadRelationshipsOptions(): void { + this.categoriaService + .query() + .pipe(map((res: HttpResponse) => res.body ?? [])) + .pipe( + map((categorias: ICategoria[]) => + this.categoriaService.addCategoriaToCollectionIfMissing(categorias, this.editForm.get('categoria')!.value) + ) + ) + .subscribe((categorias: ICategoria[]) => (this.categoriasSharedCollection = categorias)); + } + + protected createFromForm(): IPlantilla { + return { + ...new Plantilla(), + id: this.editForm.get(['id'])!.value, + nombre: this.editForm.get(['nombre'])!.value, + descripcion: this.editForm.get(['descripcion'])!.value, + fechaCreacion: this.editForm.get(['fechaCreacion'])!.value + ? dayjs(this.editForm.get(['fechaCreacion'])!.value, DATE_TIME_FORMAT) + : undefined, + fechaPublicacionTienda: this.editForm.get(['fechaPublicacionTienda'])!.value + ? dayjs(this.editForm.get(['fechaPublicacionTienda'])!.value, DATE_TIME_FORMAT) + : undefined, + estado: this.editForm.get(['estado'])!.value, + precio: this.editForm.get(['precio'])!.value, + categoria: this.editForm.get(['categoria'])!.value, + }; + } +} diff --git a/src/main/webapp/app/entities/user/user.model.ts b/src/main/webapp/app/entities/user/user.model.ts new file mode 100644 index 0000000..2792389 --- /dev/null +++ b/src/main/webapp/app/entities/user/user.model.ts @@ -0,0 +1,12 @@ +export interface IUser { + id?: number; + login?: string; +} + +export class User implements IUser { + constructor(public id: number, public login: string) {} +} + +export function getUserIdentifier(user: IUser): number | undefined { + return user.id; +} diff --git a/src/main/webapp/app/entities/user/user.service.spec.ts b/src/main/webapp/app/entities/user/user.service.spec.ts new file mode 100644 index 0000000..02c8695 --- /dev/null +++ b/src/main/webapp/app/entities/user/user.service.spec.ts @@ -0,0 +1,111 @@ +import { TestBed } from '@angular/core/testing'; +import { HttpErrorResponse } from '@angular/common/http'; +import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; + +import { User, IUser } from './user.model'; + +import { UserService } from './user.service'; + +describe('Service Tests', () => { + describe('User Service', () => { + let service: UserService; + let httpMock: HttpTestingController; + let expectedResult: IUser | IUser[] | boolean | number | null; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + }); + expectedResult = null; + service = TestBed.inject(UserService); + httpMock = TestBed.inject(HttpTestingController); + }); + + afterEach(() => { + httpMock.verify(); + }); + + describe('Service methods', () => { + it('should return Users', () => { + service.query().subscribe(received => { + expectedResult = received.body; + }); + + const req = httpMock.expectOne({ method: 'GET' }); + req.flush([new User(123, 'user')]); + expect(expectedResult).toEqual([{ id: 123, login: 'user' }]); + }); + + it('should propagate not found response', () => { + service.query().subscribe({ + error: (error: HttpErrorResponse) => (expectedResult = error.status), + }); + + const req = httpMock.expectOne({ method: 'GET' }); + req.flush('Internal Server Error', { + status: 500, + statusText: 'Inernal Server Error', + }); + expect(expectedResult).toEqual(500); + }); + + describe('addUserToCollectionIfMissing', () => { + it('should add a User to an empty array', () => { + const user: IUser = { id: 123 }; + expectedResult = service.addUserToCollectionIfMissing([], user); + expect(expectedResult).toHaveLength(1); + expect(expectedResult).toContain(user); + }); + + it('should not add a User to an array that contains it', () => { + const user: IUser = { id: 123 }; + const userCollection: IUser[] = [ + { + ...user, + }, + { id: 456 }, + ]; + expectedResult = service.addUserToCollectionIfMissing(userCollection, user); + expect(expectedResult).toHaveLength(2); + }); + + it("should add a User to an array that doesn't contain it", () => { + const user: IUser = { id: 123 }; + const userCollection: IUser[] = [{ id: 456 }]; + expectedResult = service.addUserToCollectionIfMissing(userCollection, user); + expect(expectedResult).toHaveLength(2); + expect(expectedResult).toContain(user); + }); + + it('should add only unique User to an array', () => { + const userArray: IUser[] = [{ id: 123 }, { id: 456 }, { id: 27699 }]; + const userCollection: IUser[] = [{ id: 456 }]; + expectedResult = service.addUserToCollectionIfMissing(userCollection, ...userArray); + expect(expectedResult).toHaveLength(3); + }); + + it('should accept varargs', () => { + const user: IUser = { id: 123 }; + const user2: IUser = { id: 456 }; + expectedResult = service.addUserToCollectionIfMissing([], user, user2); + expect(expectedResult).toHaveLength(2); + expect(expectedResult).toContain(user); + expect(expectedResult).toContain(user2); + }); + + it('should accept null and undefined values', () => { + const user: IUser = { id: 123 }; + expectedResult = service.addUserToCollectionIfMissing([], null, user, undefined); + expect(expectedResult).toHaveLength(1); + expect(expectedResult).toContain(user); + }); + + it('should return initial array if no users is added', () => { + const userCollection: IUser[] = [{ id: 456 }]; + expectedResult = service.addUserToCollectionIfMissing(userCollection, null, undefined); + expect(expectedResult).toEqual(userCollection); + }); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/user/user.service.ts b/src/main/webapp/app/entities/user/user.service.ts new file mode 100644 index 0000000..7d23e9e --- /dev/null +++ b/src/main/webapp/app/entities/user/user.service.ts @@ -0,0 +1,38 @@ +import { Injectable } from '@angular/core'; +import { HttpClient, HttpResponse } from '@angular/common/http'; +import { Observable } from 'rxjs'; + +import { ApplicationConfigService } from 'app/core/config/application-config.service'; +import { createRequestOption } from 'app/core/request/request-util'; +import { isPresent } from 'app/core/util/operators'; +import { Pagination } from 'app/core/request/request.model'; +import { IUser, getUserIdentifier } from './user.model'; + +@Injectable({ providedIn: 'root' }) +export class UserService { + private resourceUrl = this.applicationConfigService.getEndpointFor('api/users'); + + constructor(private http: HttpClient, private applicationConfigService: ApplicationConfigService) {} + + query(req?: Pagination): Observable> { + const options = createRequestOption(req); + return this.http.get(this.resourceUrl, { params: options, observe: 'response' }); + } + + addUserToCollectionIfMissing(userCollection: IUser[], ...usersToCheck: (IUser | null | undefined)[]): IUser[] { + const users: IUser[] = usersToCheck.filter(isPresent); + if (users.length > 0) { + const userCollectionIdentifiers = userCollection.map(userItem => getUserIdentifier(userItem)!); + const usersToAdd = users.filter(userItem => { + const userIdentifier = getUserIdentifier(userItem); + if (userIdentifier == null || userCollectionIdentifiers.includes(userIdentifier)) { + return false; + } + userCollectionIdentifiers.push(userIdentifier); + return true; + }); + return [...usersToAdd, ...userCollection]; + } + return userCollection; + } +} diff --git a/src/main/webapp/app/entities/usuario-encuesta/delete/usuario-encuesta-delete-dialog.component.html b/src/main/webapp/app/entities/usuario-encuesta/delete/usuario-encuesta-delete-dialog.component.html new file mode 100644 index 0000000..cf63eb5 --- /dev/null +++ b/src/main/webapp/app/entities/usuario-encuesta/delete/usuario-encuesta-delete-dialog.component.html @@ -0,0 +1,29 @@ +
+ + + + + +
diff --git a/src/main/webapp/app/entities/usuario-encuesta/delete/usuario-encuesta-delete-dialog.component.spec.ts b/src/main/webapp/app/entities/usuario-encuesta/delete/usuario-encuesta-delete-dialog.component.spec.ts new file mode 100644 index 0000000..fc9c195 --- /dev/null +++ b/src/main/webapp/app/entities/usuario-encuesta/delete/usuario-encuesta-delete-dialog.component.spec.ts @@ -0,0 +1,65 @@ +jest.mock('@ng-bootstrap/ng-bootstrap'); + +import { ComponentFixture, TestBed, inject, fakeAsync, tick } from '@angular/core/testing'; +import { HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { of } from 'rxjs'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; + +import { UsuarioEncuestaService } from '../service/usuario-encuesta.service'; + +import { UsuarioEncuestaDeleteDialogComponent } from './usuario-encuesta-delete-dialog.component'; + +describe('Component Tests', () => { + describe('UsuarioEncuesta Management Delete Component', () => { + let comp: UsuarioEncuestaDeleteDialogComponent; + let fixture: ComponentFixture; + let service: UsuarioEncuestaService; + let mockActiveModal: NgbActiveModal; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [UsuarioEncuestaDeleteDialogComponent], + providers: [NgbActiveModal], + }) + .overrideTemplate(UsuarioEncuestaDeleteDialogComponent, '') + .compileComponents(); + fixture = TestBed.createComponent(UsuarioEncuestaDeleteDialogComponent); + comp = fixture.componentInstance; + service = TestBed.inject(UsuarioEncuestaService); + mockActiveModal = TestBed.inject(NgbActiveModal); + }); + + describe('confirmDelete', () => { + it('Should call delete service on confirmDelete', inject( + [], + fakeAsync(() => { + // GIVEN + jest.spyOn(service, 'delete').mockReturnValue(of(new HttpResponse({}))); + + // WHEN + comp.confirmDelete(123); + tick(); + + // THEN + expect(service.delete).toHaveBeenCalledWith(123); + expect(mockActiveModal.close).toHaveBeenCalledWith('deleted'); + }) + )); + + it('Should not call delete service on clear', () => { + // GIVEN + jest.spyOn(service, 'delete'); + + // WHEN + comp.cancel(); + + // THEN + expect(service.delete).not.toHaveBeenCalled(); + expect(mockActiveModal.close).not.toHaveBeenCalled(); + expect(mockActiveModal.dismiss).toHaveBeenCalled(); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/usuario-encuesta/delete/usuario-encuesta-delete-dialog.component.ts b/src/main/webapp/app/entities/usuario-encuesta/delete/usuario-encuesta-delete-dialog.component.ts new file mode 100644 index 0000000..3894523 --- /dev/null +++ b/src/main/webapp/app/entities/usuario-encuesta/delete/usuario-encuesta-delete-dialog.component.ts @@ -0,0 +1,24 @@ +import { Component } from '@angular/core'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; + +import { IUsuarioEncuesta } from '../usuario-encuesta.model'; +import { UsuarioEncuestaService } from '../service/usuario-encuesta.service'; + +@Component({ + templateUrl: './usuario-encuesta-delete-dialog.component.html', +}) +export class UsuarioEncuestaDeleteDialogComponent { + usuarioEncuesta?: IUsuarioEncuesta; + + constructor(protected usuarioEncuestaService: UsuarioEncuestaService, protected activeModal: NgbActiveModal) {} + + cancel(): void { + this.activeModal.dismiss(); + } + + confirmDelete(id: number): void { + this.usuarioEncuestaService.delete(id).subscribe(() => { + this.activeModal.close('deleted'); + }); + } +} diff --git a/src/main/webapp/app/entities/usuario-encuesta/detail/usuario-encuesta-detail.component.html b/src/main/webapp/app/entities/usuario-encuesta/detail/usuario-encuesta-detail.component.html new file mode 100644 index 0000000..5f20ae1 --- /dev/null +++ b/src/main/webapp/app/entities/usuario-encuesta/detail/usuario-encuesta-detail.component.html @@ -0,0 +1,54 @@ +
+
+
+

+ Usuario Encuesta +

+ +
+ + + + + +
+
ID
+
+ {{ usuarioEncuesta.id }} +
+
Rol
+
+ {{ usuarioEncuesta.rol }} +
+
Estado
+
+ {{ usuarioEncuesta.estado }} +
+
Fecha Agregado
+
+ {{ usuarioEncuesta.fechaAgregado | formatMediumDatetime }} +
+
Usuario Extra
+
+ +
+
Encuesta
+
+ +
+
+ + + + +
+
+
diff --git a/src/main/webapp/app/entities/usuario-encuesta/detail/usuario-encuesta-detail.component.spec.ts b/src/main/webapp/app/entities/usuario-encuesta/detail/usuario-encuesta-detail.component.spec.ts new file mode 100644 index 0000000..58d324a --- /dev/null +++ b/src/main/webapp/app/entities/usuario-encuesta/detail/usuario-encuesta-detail.component.spec.ts @@ -0,0 +1,38 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { ActivatedRoute } from '@angular/router'; +import { of } from 'rxjs'; + +import { UsuarioEncuestaDetailComponent } from './usuario-encuesta-detail.component'; + +describe('Component Tests', () => { + describe('UsuarioEncuesta Management Detail Component', () => { + let comp: UsuarioEncuestaDetailComponent; + let fixture: ComponentFixture; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [UsuarioEncuestaDetailComponent], + providers: [ + { + provide: ActivatedRoute, + useValue: { data: of({ usuarioEncuesta: { id: 123 } }) }, + }, + ], + }) + .overrideTemplate(UsuarioEncuestaDetailComponent, '') + .compileComponents(); + fixture = TestBed.createComponent(UsuarioEncuestaDetailComponent); + comp = fixture.componentInstance; + }); + + describe('OnInit', () => { + it('Should load usuarioEncuesta on init', () => { + // WHEN + comp.ngOnInit(); + + // THEN + expect(comp.usuarioEncuesta).toEqual(expect.objectContaining({ id: 123 })); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/usuario-encuesta/detail/usuario-encuesta-detail.component.ts b/src/main/webapp/app/entities/usuario-encuesta/detail/usuario-encuesta-detail.component.ts new file mode 100644 index 0000000..1843b8e --- /dev/null +++ b/src/main/webapp/app/entities/usuario-encuesta/detail/usuario-encuesta-detail.component.ts @@ -0,0 +1,24 @@ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; + +import { IUsuarioEncuesta } from '../usuario-encuesta.model'; + +@Component({ + selector: 'jhi-usuario-encuesta-detail', + templateUrl: './usuario-encuesta-detail.component.html', +}) +export class UsuarioEncuestaDetailComponent implements OnInit { + usuarioEncuesta: IUsuarioEncuesta | null = null; + + constructor(protected activatedRoute: ActivatedRoute) {} + + ngOnInit(): void { + this.activatedRoute.data.subscribe(({ usuarioEncuesta }) => { + this.usuarioEncuesta = usuarioEncuesta; + }); + } + + previousState(): void { + window.history.back(); + } +} diff --git a/src/main/webapp/app/entities/usuario-encuesta/list/usuario-encuesta.component.html b/src/main/webapp/app/entities/usuario-encuesta/list/usuario-encuesta.component.html new file mode 100644 index 0000000..4dd1821 --- /dev/null +++ b/src/main/webapp/app/entities/usuario-encuesta/list/usuario-encuesta.component.html @@ -0,0 +1,94 @@ +
+

+ Usuario Encuestas + +
+ + + +
+

+ + + + + +
+ No usuarioEncuestas found +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + +
IDRolEstadoFecha AgregadoUsuario ExtraEncuesta
+ {{ usuarioEncuesta.id }} + {{ usuarioEncuesta.rol }}{{ usuarioEncuesta.estado }}{{ usuarioEncuesta.fechaAgregado | formatMediumDatetime }} + + + + +
+ + + + + +
+
+
+
diff --git a/src/main/webapp/app/entities/usuario-encuesta/list/usuario-encuesta.component.spec.ts b/src/main/webapp/app/entities/usuario-encuesta/list/usuario-encuesta.component.spec.ts new file mode 100644 index 0000000..ffbbc5e --- /dev/null +++ b/src/main/webapp/app/entities/usuario-encuesta/list/usuario-encuesta.component.spec.ts @@ -0,0 +1,48 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { HttpHeaders, HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { of } from 'rxjs'; + +import { UsuarioEncuestaService } from '../service/usuario-encuesta.service'; + +import { UsuarioEncuestaComponent } from './usuario-encuesta.component'; + +describe('Component Tests', () => { + describe('UsuarioEncuesta Management Component', () => { + let comp: UsuarioEncuestaComponent; + let fixture: ComponentFixture; + let service: UsuarioEncuestaService; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [UsuarioEncuestaComponent], + }) + .overrideTemplate(UsuarioEncuestaComponent, '') + .compileComponents(); + + fixture = TestBed.createComponent(UsuarioEncuestaComponent); + comp = fixture.componentInstance; + service = TestBed.inject(UsuarioEncuestaService); + + const headers = new HttpHeaders().append('link', 'link;link'); + jest.spyOn(service, 'query').mockReturnValue( + of( + new HttpResponse({ + body: [{ id: 123 }], + headers, + }) + ) + ); + }); + + it('Should call load all on init', () => { + // WHEN + comp.ngOnInit(); + + // THEN + expect(service.query).toHaveBeenCalled(); + expect(comp.usuarioEncuestas?.[0]).toEqual(expect.objectContaining({ id: 123 })); + }); + }); +}); diff --git a/src/main/webapp/app/entities/usuario-encuesta/list/usuario-encuesta.component.ts b/src/main/webapp/app/entities/usuario-encuesta/list/usuario-encuesta.component.ts new file mode 100644 index 0000000..dfcef9d --- /dev/null +++ b/src/main/webapp/app/entities/usuario-encuesta/list/usuario-encuesta.component.ts @@ -0,0 +1,51 @@ +import { Component, OnInit } from '@angular/core'; +import { HttpResponse } from '@angular/common/http'; +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; + +import { IUsuarioEncuesta } from '../usuario-encuesta.model'; +import { UsuarioEncuestaService } from '../service/usuario-encuesta.service'; +import { UsuarioEncuestaDeleteDialogComponent } from '../delete/usuario-encuesta-delete-dialog.component'; + +@Component({ + selector: 'jhi-usuario-encuesta', + templateUrl: './usuario-encuesta.component.html', +}) +export class UsuarioEncuestaComponent implements OnInit { + usuarioEncuestas?: IUsuarioEncuesta[]; + isLoading = false; + + constructor(protected usuarioEncuestaService: UsuarioEncuestaService, protected modalService: NgbModal) {} + + loadAll(): void { + this.isLoading = true; + + this.usuarioEncuestaService.query().subscribe( + (res: HttpResponse) => { + this.isLoading = false; + this.usuarioEncuestas = res.body ?? []; + }, + () => { + this.isLoading = false; + } + ); + } + + ngOnInit(): void { + this.loadAll(); + } + + trackId(index: number, item: IUsuarioEncuesta): number { + return item.id!; + } + + delete(usuarioEncuesta: IUsuarioEncuesta): void { + const modalRef = this.modalService.open(UsuarioEncuestaDeleteDialogComponent, { size: 'lg', backdrop: 'static' }); + modalRef.componentInstance.usuarioEncuesta = usuarioEncuesta; + // unsubscribe not needed because closed completes on modal close + modalRef.closed.subscribe(reason => { + if (reason === 'deleted') { + this.loadAll(); + } + }); + } +} diff --git a/src/main/webapp/app/entities/usuario-encuesta/route/usuario-encuesta-routing-resolve.service.spec.ts b/src/main/webapp/app/entities/usuario-encuesta/route/usuario-encuesta-routing-resolve.service.spec.ts new file mode 100644 index 0000000..c8a47f4 --- /dev/null +++ b/src/main/webapp/app/entities/usuario-encuesta/route/usuario-encuesta-routing-resolve.service.spec.ts @@ -0,0 +1,82 @@ +jest.mock('@angular/router'); + +import { TestBed } from '@angular/core/testing'; +import { HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { ActivatedRouteSnapshot, Router } from '@angular/router'; +import { of } from 'rxjs'; + +import { IUsuarioEncuesta, UsuarioEncuesta } from '../usuario-encuesta.model'; +import { UsuarioEncuestaService } from '../service/usuario-encuesta.service'; + +import { UsuarioEncuestaRoutingResolveService } from './usuario-encuesta-routing-resolve.service'; + +describe('Service Tests', () => { + describe('UsuarioEncuesta routing resolve service', () => { + let mockRouter: Router; + let mockActivatedRouteSnapshot: ActivatedRouteSnapshot; + let routingResolveService: UsuarioEncuestaRoutingResolveService; + let service: UsuarioEncuestaService; + let resultUsuarioEncuesta: IUsuarioEncuesta | undefined; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [Router, ActivatedRouteSnapshot], + }); + mockRouter = TestBed.inject(Router); + mockActivatedRouteSnapshot = TestBed.inject(ActivatedRouteSnapshot); + routingResolveService = TestBed.inject(UsuarioEncuestaRoutingResolveService); + service = TestBed.inject(UsuarioEncuestaService); + resultUsuarioEncuesta = undefined; + }); + + describe('resolve', () => { + it('should return IUsuarioEncuesta returned by find', () => { + // GIVEN + service.find = jest.fn(id => of(new HttpResponse({ body: { id } }))); + mockActivatedRouteSnapshot.params = { id: 123 }; + + // WHEN + routingResolveService.resolve(mockActivatedRouteSnapshot).subscribe(result => { + resultUsuarioEncuesta = result; + }); + + // THEN + expect(service.find).toBeCalledWith(123); + expect(resultUsuarioEncuesta).toEqual({ id: 123 }); + }); + + it('should return new IUsuarioEncuesta if id is not provided', () => { + // GIVEN + service.find = jest.fn(); + mockActivatedRouteSnapshot.params = {}; + + // WHEN + routingResolveService.resolve(mockActivatedRouteSnapshot).subscribe(result => { + resultUsuarioEncuesta = result; + }); + + // THEN + expect(service.find).not.toBeCalled(); + expect(resultUsuarioEncuesta).toEqual(new UsuarioEncuesta()); + }); + + it('should route to 404 page if data not found in server', () => { + // GIVEN + jest.spyOn(service, 'find').mockReturnValue(of(new HttpResponse({ body: null as unknown as UsuarioEncuesta }))); + mockActivatedRouteSnapshot.params = { id: 123 }; + + // WHEN + routingResolveService.resolve(mockActivatedRouteSnapshot).subscribe(result => { + resultUsuarioEncuesta = result; + }); + + // THEN + expect(service.find).toBeCalledWith(123); + expect(resultUsuarioEncuesta).toEqual(undefined); + expect(mockRouter.navigate).toHaveBeenCalledWith(['404']); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/usuario-encuesta/route/usuario-encuesta-routing-resolve.service.ts b/src/main/webapp/app/entities/usuario-encuesta/route/usuario-encuesta-routing-resolve.service.ts new file mode 100644 index 0000000..b2d688a --- /dev/null +++ b/src/main/webapp/app/entities/usuario-encuesta/route/usuario-encuesta-routing-resolve.service.ts @@ -0,0 +1,30 @@ +import { Injectable } from '@angular/core'; +import { HttpResponse } from '@angular/common/http'; +import { Resolve, ActivatedRouteSnapshot, Router } from '@angular/router'; +import { Observable, of, EMPTY } from 'rxjs'; +import { mergeMap } from 'rxjs/operators'; + +import { IUsuarioEncuesta, UsuarioEncuesta } from '../usuario-encuesta.model'; +import { UsuarioEncuestaService } from '../service/usuario-encuesta.service'; + +@Injectable({ providedIn: 'root' }) +export class UsuarioEncuestaRoutingResolveService implements Resolve { + constructor(protected service: UsuarioEncuestaService, protected router: Router) {} + + resolve(route: ActivatedRouteSnapshot): Observable | Observable { + const id = route.params['id']; + if (id) { + return this.service.find(id).pipe( + mergeMap((usuarioEncuesta: HttpResponse) => { + if (usuarioEncuesta.body) { + return of(usuarioEncuesta.body); + } else { + this.router.navigate(['404']); + return EMPTY; + } + }) + ); + } + return of(new UsuarioEncuesta()); + } +} diff --git a/src/main/webapp/app/entities/usuario-encuesta/route/usuario-encuesta-routing.module.ts b/src/main/webapp/app/entities/usuario-encuesta/route/usuario-encuesta-routing.module.ts new file mode 100644 index 0000000..32ab08b --- /dev/null +++ b/src/main/webapp/app/entities/usuario-encuesta/route/usuario-encuesta-routing.module.ts @@ -0,0 +1,46 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; + +import { UserRouteAccessService } from 'app/core/auth/user-route-access.service'; +import { UsuarioEncuestaComponent } from '../list/usuario-encuesta.component'; +import { UsuarioEncuestaDetailComponent } from '../detail/usuario-encuesta-detail.component'; +import { UsuarioEncuestaUpdateComponent } from '../update/usuario-encuesta-update.component'; +import { UsuarioEncuestaRoutingResolveService } from './usuario-encuesta-routing-resolve.service'; + +const usuarioEncuestaRoute: Routes = [ + { + path: '', + component: UsuarioEncuestaComponent, + canActivate: [UserRouteAccessService], + }, + { + path: ':id/view', + component: UsuarioEncuestaDetailComponent, + resolve: { + usuarioEncuesta: UsuarioEncuestaRoutingResolveService, + }, + canActivate: [UserRouteAccessService], + }, + { + path: 'new', + component: UsuarioEncuestaUpdateComponent, + resolve: { + usuarioEncuesta: UsuarioEncuestaRoutingResolveService, + }, + canActivate: [UserRouteAccessService], + }, + { + path: ':id/edit', + component: UsuarioEncuestaUpdateComponent, + resolve: { + usuarioEncuesta: UsuarioEncuestaRoutingResolveService, + }, + canActivate: [UserRouteAccessService], + }, +]; + +@NgModule({ + imports: [RouterModule.forChild(usuarioEncuestaRoute)], + exports: [RouterModule], +}) +export class UsuarioEncuestaRoutingModule {} diff --git a/src/main/webapp/app/entities/usuario-encuesta/service/usuario-encuesta.service.spec.ts b/src/main/webapp/app/entities/usuario-encuesta/service/usuario-encuesta.service.spec.ts new file mode 100644 index 0000000..8c77bde --- /dev/null +++ b/src/main/webapp/app/entities/usuario-encuesta/service/usuario-encuesta.service.spec.ts @@ -0,0 +1,223 @@ +import { TestBed } from '@angular/core/testing'; +import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; +import * as dayjs from 'dayjs'; + +import { DATE_TIME_FORMAT } from 'app/config/input.constants'; +import { RolColaborador } from 'app/entities/enumerations/rol-colaborador.model'; +import { EstadoColaborador } from 'app/entities/enumerations/estado-colaborador.model'; +import { IUsuarioEncuesta, UsuarioEncuesta } from '../usuario-encuesta.model'; + +import { UsuarioEncuestaService } from './usuario-encuesta.service'; + +describe('Service Tests', () => { + describe('UsuarioEncuesta Service', () => { + let service: UsuarioEncuestaService; + let httpMock: HttpTestingController; + let elemDefault: IUsuarioEncuesta; + let expectedResult: IUsuarioEncuesta | IUsuarioEncuesta[] | boolean | null; + let currentDate: dayjs.Dayjs; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + }); + expectedResult = null; + service = TestBed.inject(UsuarioEncuestaService); + httpMock = TestBed.inject(HttpTestingController); + currentDate = dayjs(); + + elemDefault = { + id: 0, + rol: RolColaborador.READ, + estado: EstadoColaborador.PENDING, + fechaAgregado: currentDate, + }; + }); + + describe('Service methods', () => { + it('should find an element', () => { + const returnedFromService = Object.assign( + { + fechaAgregado: currentDate.format(DATE_TIME_FORMAT), + }, + elemDefault + ); + + service.find(123).subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'GET' }); + req.flush(returnedFromService); + expect(expectedResult).toMatchObject(elemDefault); + }); + + it('should create a UsuarioEncuesta', () => { + const returnedFromService = Object.assign( + { + id: 0, + fechaAgregado: currentDate.format(DATE_TIME_FORMAT), + }, + elemDefault + ); + + const expected = Object.assign( + { + fechaAgregado: currentDate, + }, + returnedFromService + ); + + service.create(new UsuarioEncuesta()).subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'POST' }); + req.flush(returnedFromService); + expect(expectedResult).toMatchObject(expected); + }); + + it('should update a UsuarioEncuesta', () => { + const returnedFromService = Object.assign( + { + id: 1, + rol: 'BBBBBB', + estado: 'BBBBBB', + fechaAgregado: currentDate.format(DATE_TIME_FORMAT), + }, + elemDefault + ); + + const expected = Object.assign( + { + fechaAgregado: currentDate, + }, + returnedFromService + ); + + service.update(expected).subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'PUT' }); + req.flush(returnedFromService); + expect(expectedResult).toMatchObject(expected); + }); + + it('should partial update a UsuarioEncuesta', () => { + const patchObject = Object.assign( + { + rol: 'BBBBBB', + estado: 'BBBBBB', + }, + new UsuarioEncuesta() + ); + + const returnedFromService = Object.assign(patchObject, elemDefault); + + const expected = Object.assign( + { + fechaAgregado: currentDate, + }, + returnedFromService + ); + + service.partialUpdate(patchObject).subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'PATCH' }); + req.flush(returnedFromService); + expect(expectedResult).toMatchObject(expected); + }); + + it('should return a list of UsuarioEncuesta', () => { + const returnedFromService = Object.assign( + { + id: 1, + rol: 'BBBBBB', + estado: 'BBBBBB', + fechaAgregado: currentDate.format(DATE_TIME_FORMAT), + }, + elemDefault + ); + + const expected = Object.assign( + { + fechaAgregado: currentDate, + }, + returnedFromService + ); + + service.query().subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'GET' }); + req.flush([returnedFromService]); + httpMock.verify(); + expect(expectedResult).toContainEqual(expected); + }); + + it('should delete a UsuarioEncuesta', () => { + service.delete(123).subscribe(resp => (expectedResult = resp.ok)); + + const req = httpMock.expectOne({ method: 'DELETE' }); + req.flush({ status: 200 }); + expect(expectedResult); + }); + + describe('addUsuarioEncuestaToCollectionIfMissing', () => { + it('should add a UsuarioEncuesta to an empty array', () => { + const usuarioEncuesta: IUsuarioEncuesta = { id: 123 }; + expectedResult = service.addUsuarioEncuestaToCollectionIfMissing([], usuarioEncuesta); + expect(expectedResult).toHaveLength(1); + expect(expectedResult).toContain(usuarioEncuesta); + }); + + it('should not add a UsuarioEncuesta to an array that contains it', () => { + const usuarioEncuesta: IUsuarioEncuesta = { id: 123 }; + const usuarioEncuestaCollection: IUsuarioEncuesta[] = [ + { + ...usuarioEncuesta, + }, + { id: 456 }, + ]; + expectedResult = service.addUsuarioEncuestaToCollectionIfMissing(usuarioEncuestaCollection, usuarioEncuesta); + expect(expectedResult).toHaveLength(2); + }); + + it("should add a UsuarioEncuesta to an array that doesn't contain it", () => { + const usuarioEncuesta: IUsuarioEncuesta = { id: 123 }; + const usuarioEncuestaCollection: IUsuarioEncuesta[] = [{ id: 456 }]; + expectedResult = service.addUsuarioEncuestaToCollectionIfMissing(usuarioEncuestaCollection, usuarioEncuesta); + expect(expectedResult).toHaveLength(2); + expect(expectedResult).toContain(usuarioEncuesta); + }); + + it('should add only unique UsuarioEncuesta to an array', () => { + const usuarioEncuestaArray: IUsuarioEncuesta[] = [{ id: 123 }, { id: 456 }, { id: 52103 }]; + const usuarioEncuestaCollection: IUsuarioEncuesta[] = [{ id: 123 }]; + expectedResult = service.addUsuarioEncuestaToCollectionIfMissing(usuarioEncuestaCollection, ...usuarioEncuestaArray); + expect(expectedResult).toHaveLength(3); + }); + + it('should accept varargs', () => { + const usuarioEncuesta: IUsuarioEncuesta = { id: 123 }; + const usuarioEncuesta2: IUsuarioEncuesta = { id: 456 }; + expectedResult = service.addUsuarioEncuestaToCollectionIfMissing([], usuarioEncuesta, usuarioEncuesta2); + expect(expectedResult).toHaveLength(2); + expect(expectedResult).toContain(usuarioEncuesta); + expect(expectedResult).toContain(usuarioEncuesta2); + }); + + it('should accept null and undefined values', () => { + const usuarioEncuesta: IUsuarioEncuesta = { id: 123 }; + expectedResult = service.addUsuarioEncuestaToCollectionIfMissing([], null, usuarioEncuesta, undefined); + expect(expectedResult).toHaveLength(1); + expect(expectedResult).toContain(usuarioEncuesta); + }); + + it('should return initial array if no UsuarioEncuesta is added', () => { + const usuarioEncuestaCollection: IUsuarioEncuesta[] = [{ id: 123 }]; + expectedResult = service.addUsuarioEncuestaToCollectionIfMissing(usuarioEncuestaCollection, undefined, null); + expect(expectedResult).toEqual(usuarioEncuestaCollection); + }); + }); + }); + + afterEach(() => { + httpMock.verify(); + }); + }); +}); diff --git a/src/main/webapp/app/entities/usuario-encuesta/service/usuario-encuesta.service.ts b/src/main/webapp/app/entities/usuario-encuesta/service/usuario-encuesta.service.ts new file mode 100644 index 0000000..aefe0b9 --- /dev/null +++ b/src/main/webapp/app/entities/usuario-encuesta/service/usuario-encuesta.service.ts @@ -0,0 +1,106 @@ +import { Injectable } from '@angular/core'; +import { HttpClient, HttpResponse } from '@angular/common/http'; +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; +import * as dayjs from 'dayjs'; + +import { isPresent } from 'app/core/util/operators'; +import { ApplicationConfigService } from 'app/core/config/application-config.service'; +import { createRequestOption } from 'app/core/request/request-util'; +import { IUsuarioEncuesta, getUsuarioEncuestaIdentifier } from '../usuario-encuesta.model'; + +export type EntityResponseType = HttpResponse; +export type EntityArrayResponseType = HttpResponse; + +@Injectable({ providedIn: 'root' }) +export class UsuarioEncuestaService { + protected resourceUrl = this.applicationConfigService.getEndpointFor('api/usuario-encuestas'); + + constructor(protected http: HttpClient, protected applicationConfigService: ApplicationConfigService) {} + + create(usuarioEncuesta: IUsuarioEncuesta): Observable { + const copy = this.convertDateFromClient(usuarioEncuesta); + return this.http + .post(this.resourceUrl, copy, { observe: 'response' }) + .pipe(map((res: EntityResponseType) => this.convertDateFromServer(res))); + } + + update(usuarioEncuesta: IUsuarioEncuesta): Observable { + const copy = this.convertDateFromClient(usuarioEncuesta); + return this.http + .put(`${this.resourceUrl}/${getUsuarioEncuestaIdentifier(usuarioEncuesta) as number}`, copy, { + observe: 'response', + }) + .pipe(map((res: EntityResponseType) => this.convertDateFromServer(res))); + } + + partialUpdate(usuarioEncuesta: IUsuarioEncuesta): Observable { + const copy = this.convertDateFromClient(usuarioEncuesta); + return this.http + .patch(`${this.resourceUrl}/${getUsuarioEncuestaIdentifier(usuarioEncuesta) as number}`, copy, { + observe: 'response', + }) + .pipe(map((res: EntityResponseType) => this.convertDateFromServer(res))); + } + + find(id: number): Observable { + return this.http + .get(`${this.resourceUrl}/${id}`, { observe: 'response' }) + .pipe(map((res: EntityResponseType) => this.convertDateFromServer(res))); + } + + query(req?: any): Observable { + const options = createRequestOption(req); + return this.http + .get(this.resourceUrl, { params: options, observe: 'response' }) + .pipe(map((res: EntityArrayResponseType) => this.convertDateArrayFromServer(res))); + } + + delete(id: number): Observable> { + return this.http.delete(`${this.resourceUrl}/${id}`, { observe: 'response' }); + } + + addUsuarioEncuestaToCollectionIfMissing( + usuarioEncuestaCollection: IUsuarioEncuesta[], + ...usuarioEncuestasToCheck: (IUsuarioEncuesta | null | undefined)[] + ): IUsuarioEncuesta[] { + const usuarioEncuestas: IUsuarioEncuesta[] = usuarioEncuestasToCheck.filter(isPresent); + if (usuarioEncuestas.length > 0) { + const usuarioEncuestaCollectionIdentifiers = usuarioEncuestaCollection.map( + usuarioEncuestaItem => getUsuarioEncuestaIdentifier(usuarioEncuestaItem)! + ); + const usuarioEncuestasToAdd = usuarioEncuestas.filter(usuarioEncuestaItem => { + const usuarioEncuestaIdentifier = getUsuarioEncuestaIdentifier(usuarioEncuestaItem); + if (usuarioEncuestaIdentifier == null || usuarioEncuestaCollectionIdentifiers.includes(usuarioEncuestaIdentifier)) { + return false; + } + usuarioEncuestaCollectionIdentifiers.push(usuarioEncuestaIdentifier); + return true; + }); + return [...usuarioEncuestasToAdd, ...usuarioEncuestaCollection]; + } + return usuarioEncuestaCollection; + } + + protected convertDateFromClient(usuarioEncuesta: IUsuarioEncuesta): IUsuarioEncuesta { + return Object.assign({}, usuarioEncuesta, { + fechaAgregado: usuarioEncuesta.fechaAgregado?.isValid() ? usuarioEncuesta.fechaAgregado.toJSON() : undefined, + }); + } + + protected convertDateFromServer(res: EntityResponseType): EntityResponseType { + if (res.body) { + res.body.fechaAgregado = res.body.fechaAgregado ? dayjs(res.body.fechaAgregado) : undefined; + } + return res; + } + + protected convertDateArrayFromServer(res: EntityArrayResponseType): EntityArrayResponseType { + if (res.body) { + res.body.forEach((usuarioEncuesta: IUsuarioEncuesta) => { + usuarioEncuesta.fechaAgregado = usuarioEncuesta.fechaAgregado ? dayjs(usuarioEncuesta.fechaAgregado) : undefined; + }); + } + return res; + } +} diff --git a/src/main/webapp/app/entities/usuario-encuesta/update/usuario-encuesta-update.component.html b/src/main/webapp/app/entities/usuario-encuesta/update/usuario-encuesta-update.component.html new file mode 100644 index 0000000..d6adcc9 --- /dev/null +++ b/src/main/webapp/app/entities/usuario-encuesta/update/usuario-encuesta-update.component.html @@ -0,0 +1,133 @@ +
+
+
+

+ Create or edit a Usuario Encuesta +

+ +
+ + +
+ + +
+ +
+ + +
+ + This field is required. + +
+
+ +
+ + +
+ + This field is required. + +
+
+ +
+ +
+ +
+
+ + This field is required. + + + This field should be a date and time. + +
+
+ +
+ + +
+ +
+ + +
+
+ +
+ + + +
+
+
+
diff --git a/src/main/webapp/app/entities/usuario-encuesta/update/usuario-encuesta-update.component.spec.ts b/src/main/webapp/app/entities/usuario-encuesta/update/usuario-encuesta-update.component.spec.ts new file mode 100644 index 0000000..6c314d3 --- /dev/null +++ b/src/main/webapp/app/entities/usuario-encuesta/update/usuario-encuesta-update.component.spec.ts @@ -0,0 +1,186 @@ +jest.mock('@angular/router'); + +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { FormBuilder } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; +import { of, Subject } from 'rxjs'; + +import { UsuarioEncuestaService } from '../service/usuario-encuesta.service'; +import { IUsuarioEncuesta, UsuarioEncuesta } from '../usuario-encuesta.model'; +import { IUsuarioExtra } from 'app/entities/usuario-extra/usuario-extra.model'; +import { UsuarioExtraService } from 'app/entities/usuario-extra/service/usuario-extra.service'; +import { IEncuesta } from 'app/entities/encuesta/encuesta.model'; +import { EncuestaService } from 'app/entities/encuesta/service/encuesta.service'; + +import { UsuarioEncuestaUpdateComponent } from './usuario-encuesta-update.component'; + +describe('Component Tests', () => { + describe('UsuarioEncuesta Management Update Component', () => { + let comp: UsuarioEncuestaUpdateComponent; + let fixture: ComponentFixture; + let activatedRoute: ActivatedRoute; + let usuarioEncuestaService: UsuarioEncuestaService; + let usuarioExtraService: UsuarioExtraService; + let encuestaService: EncuestaService; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [UsuarioEncuestaUpdateComponent], + providers: [FormBuilder, ActivatedRoute], + }) + .overrideTemplate(UsuarioEncuestaUpdateComponent, '') + .compileComponents(); + + fixture = TestBed.createComponent(UsuarioEncuestaUpdateComponent); + activatedRoute = TestBed.inject(ActivatedRoute); + usuarioEncuestaService = TestBed.inject(UsuarioEncuestaService); + usuarioExtraService = TestBed.inject(UsuarioExtraService); + encuestaService = TestBed.inject(EncuestaService); + + comp = fixture.componentInstance; + }); + + describe('ngOnInit', () => { + it('Should call UsuarioExtra query and add missing value', () => { + const usuarioEncuesta: IUsuarioEncuesta = { id: 456 }; + const usuarioExtra: IUsuarioExtra = { id: 70975 }; + usuarioEncuesta.usuarioExtra = usuarioExtra; + + const usuarioExtraCollection: IUsuarioExtra[] = [{ id: 39782 }]; + jest.spyOn(usuarioExtraService, 'query').mockReturnValue(of(new HttpResponse({ body: usuarioExtraCollection }))); + const additionalUsuarioExtras = [usuarioExtra]; + const expectedCollection: IUsuarioExtra[] = [...additionalUsuarioExtras, ...usuarioExtraCollection]; + jest.spyOn(usuarioExtraService, 'addUsuarioExtraToCollectionIfMissing').mockReturnValue(expectedCollection); + + activatedRoute.data = of({ usuarioEncuesta }); + comp.ngOnInit(); + + expect(usuarioExtraService.query).toHaveBeenCalled(); + expect(usuarioExtraService.addUsuarioExtraToCollectionIfMissing).toHaveBeenCalledWith( + usuarioExtraCollection, + ...additionalUsuarioExtras + ); + expect(comp.usuarioExtrasSharedCollection).toEqual(expectedCollection); + }); + + it('Should call Encuesta query and add missing value', () => { + const usuarioEncuesta: IUsuarioEncuesta = { id: 456 }; + const encuesta: IEncuesta = { id: 77959 }; + usuarioEncuesta.encuesta = encuesta; + + const encuestaCollection: IEncuesta[] = [{ id: 65363 }]; + jest.spyOn(encuestaService, 'query').mockReturnValue(of(new HttpResponse({ body: encuestaCollection }))); + const additionalEncuestas = [encuesta]; + const expectedCollection: IEncuesta[] = [...additionalEncuestas, ...encuestaCollection]; + jest.spyOn(encuestaService, 'addEncuestaToCollectionIfMissing').mockReturnValue(expectedCollection); + + activatedRoute.data = of({ usuarioEncuesta }); + comp.ngOnInit(); + + expect(encuestaService.query).toHaveBeenCalled(); + expect(encuestaService.addEncuestaToCollectionIfMissing).toHaveBeenCalledWith(encuestaCollection, ...additionalEncuestas); + expect(comp.encuestasSharedCollection).toEqual(expectedCollection); + }); + + it('Should update editForm', () => { + const usuarioEncuesta: IUsuarioEncuesta = { id: 456 }; + const usuarioExtra: IUsuarioExtra = { id: 58090 }; + usuarioEncuesta.usuarioExtra = usuarioExtra; + const encuesta: IEncuesta = { id: 899 }; + usuarioEncuesta.encuesta = encuesta; + + activatedRoute.data = of({ usuarioEncuesta }); + comp.ngOnInit(); + + expect(comp.editForm.value).toEqual(expect.objectContaining(usuarioEncuesta)); + expect(comp.usuarioExtrasSharedCollection).toContain(usuarioExtra); + expect(comp.encuestasSharedCollection).toContain(encuesta); + }); + }); + + describe('save', () => { + it('Should call update service on save for existing entity', () => { + // GIVEN + const saveSubject = new Subject>(); + const usuarioEncuesta = { id: 123 }; + jest.spyOn(usuarioEncuestaService, 'update').mockReturnValue(saveSubject); + jest.spyOn(comp, 'previousState'); + activatedRoute.data = of({ usuarioEncuesta }); + comp.ngOnInit(); + + // WHEN + comp.save(); + expect(comp.isSaving).toEqual(true); + saveSubject.next(new HttpResponse({ body: usuarioEncuesta })); + saveSubject.complete(); + + // THEN + expect(comp.previousState).toHaveBeenCalled(); + expect(usuarioEncuestaService.update).toHaveBeenCalledWith(usuarioEncuesta); + expect(comp.isSaving).toEqual(false); + }); + + it('Should call create service on save for new entity', () => { + // GIVEN + const saveSubject = new Subject>(); + const usuarioEncuesta = new UsuarioEncuesta(); + jest.spyOn(usuarioEncuestaService, 'create').mockReturnValue(saveSubject); + jest.spyOn(comp, 'previousState'); + activatedRoute.data = of({ usuarioEncuesta }); + comp.ngOnInit(); + + // WHEN + comp.save(); + expect(comp.isSaving).toEqual(true); + saveSubject.next(new HttpResponse({ body: usuarioEncuesta })); + saveSubject.complete(); + + // THEN + expect(usuarioEncuestaService.create).toHaveBeenCalledWith(usuarioEncuesta); + expect(comp.isSaving).toEqual(false); + expect(comp.previousState).toHaveBeenCalled(); + }); + + it('Should set isSaving to false on error', () => { + // GIVEN + const saveSubject = new Subject>(); + const usuarioEncuesta = { id: 123 }; + jest.spyOn(usuarioEncuestaService, 'update').mockReturnValue(saveSubject); + jest.spyOn(comp, 'previousState'); + activatedRoute.data = of({ usuarioEncuesta }); + comp.ngOnInit(); + + // WHEN + comp.save(); + expect(comp.isSaving).toEqual(true); + saveSubject.error('This is an error!'); + + // THEN + expect(usuarioEncuestaService.update).toHaveBeenCalledWith(usuarioEncuesta); + expect(comp.isSaving).toEqual(false); + expect(comp.previousState).not.toHaveBeenCalled(); + }); + }); + + describe('Tracking relationships identifiers', () => { + describe('trackUsuarioExtraById', () => { + it('Should return tracked UsuarioExtra primary key', () => { + const entity = { id: 123 }; + const trackResult = comp.trackUsuarioExtraById(0, entity); + expect(trackResult).toEqual(entity.id); + }); + }); + + describe('trackEncuestaById', () => { + it('Should return tracked Encuesta primary key', () => { + const entity = { id: 123 }; + const trackResult = comp.trackEncuestaById(0, entity); + expect(trackResult).toEqual(entity.id); + }); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/usuario-encuesta/update/usuario-encuesta-update.component.ts b/src/main/webapp/app/entities/usuario-encuesta/update/usuario-encuesta-update.component.ts new file mode 100644 index 0000000..eb04f44 --- /dev/null +++ b/src/main/webapp/app/entities/usuario-encuesta/update/usuario-encuesta-update.component.ts @@ -0,0 +1,154 @@ +import { Component, OnInit } from '@angular/core'; +import { HttpResponse } from '@angular/common/http'; +import { FormBuilder, Validators } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; +import { Observable } from 'rxjs'; +import { finalize, map } from 'rxjs/operators'; + +import * as dayjs from 'dayjs'; +import { DATE_TIME_FORMAT } from 'app/config/input.constants'; + +import { IUsuarioEncuesta, UsuarioEncuesta } from '../usuario-encuesta.model'; +import { UsuarioEncuestaService } from '../service/usuario-encuesta.service'; +import { IUsuarioExtra } from 'app/entities/usuario-extra/usuario-extra.model'; +import { UsuarioExtraService } from 'app/entities/usuario-extra/service/usuario-extra.service'; +import { IEncuesta } from 'app/entities/encuesta/encuesta.model'; +import { EncuestaService } from 'app/entities/encuesta/service/encuesta.service'; + +@Component({ + selector: 'jhi-usuario-encuesta-update', + templateUrl: './usuario-encuesta-update.component.html', +}) +export class UsuarioEncuestaUpdateComponent implements OnInit { + isSaving = false; + + usuarioExtrasSharedCollection: IUsuarioExtra[] = []; + encuestasSharedCollection: IEncuesta[] = []; + + editForm = this.fb.group({ + id: [], + rol: [null, [Validators.required]], + estado: [null, [Validators.required]], + fechaAgregado: [null, [Validators.required]], + usuarioExtra: [], + encuesta: [], + }); + + constructor( + protected usuarioEncuestaService: UsuarioEncuestaService, + protected usuarioExtraService: UsuarioExtraService, + protected encuestaService: EncuestaService, + protected activatedRoute: ActivatedRoute, + protected fb: FormBuilder + ) {} + + ngOnInit(): void { + this.activatedRoute.data.subscribe(({ usuarioEncuesta }) => { + if (usuarioEncuesta.id === undefined) { + const today = dayjs().startOf('day'); + usuarioEncuesta.fechaAgregado = today; + } + + this.updateForm(usuarioEncuesta); + + this.loadRelationshipsOptions(); + }); + } + + previousState(): void { + window.history.back(); + } + + save(): void { + this.isSaving = true; + const usuarioEncuesta = this.createFromForm(); + if (usuarioEncuesta.id !== undefined) { + this.subscribeToSaveResponse(this.usuarioEncuestaService.update(usuarioEncuesta)); + } else { + this.subscribeToSaveResponse(this.usuarioEncuestaService.create(usuarioEncuesta)); + } + } + + trackUsuarioExtraById(index: number, item: IUsuarioExtra): number { + return item.id!; + } + + trackEncuestaById(index: number, item: IEncuesta): number { + return item.id!; + } + + protected subscribeToSaveResponse(result: Observable>): void { + result.pipe(finalize(() => this.onSaveFinalize())).subscribe( + () => this.onSaveSuccess(), + () => this.onSaveError() + ); + } + + protected onSaveSuccess(): void { + this.previousState(); + } + + protected onSaveError(): void { + // Api for inheritance. + } + + protected onSaveFinalize(): void { + this.isSaving = false; + } + + protected updateForm(usuarioEncuesta: IUsuarioEncuesta): void { + this.editForm.patchValue({ + id: usuarioEncuesta.id, + rol: usuarioEncuesta.rol, + estado: usuarioEncuesta.estado, + fechaAgregado: usuarioEncuesta.fechaAgregado ? usuarioEncuesta.fechaAgregado.format(DATE_TIME_FORMAT) : null, + usuarioExtra: usuarioEncuesta.usuarioExtra, + encuesta: usuarioEncuesta.encuesta, + }); + + this.usuarioExtrasSharedCollection = this.usuarioExtraService.addUsuarioExtraToCollectionIfMissing( + this.usuarioExtrasSharedCollection, + usuarioEncuesta.usuarioExtra + ); + this.encuestasSharedCollection = this.encuestaService.addEncuestaToCollectionIfMissing( + this.encuestasSharedCollection, + usuarioEncuesta.encuesta + ); + } + + protected loadRelationshipsOptions(): void { + this.usuarioExtraService + .query() + .pipe(map((res: HttpResponse) => res.body ?? [])) + .pipe( + map((usuarioExtras: IUsuarioExtra[]) => + this.usuarioExtraService.addUsuarioExtraToCollectionIfMissing(usuarioExtras, this.editForm.get('usuarioExtra')!.value) + ) + ) + .subscribe((usuarioExtras: IUsuarioExtra[]) => (this.usuarioExtrasSharedCollection = usuarioExtras)); + + this.encuestaService + .query() + .pipe(map((res: HttpResponse) => res.body ?? [])) + .pipe( + map((encuestas: IEncuesta[]) => + this.encuestaService.addEncuestaToCollectionIfMissing(encuestas, this.editForm.get('encuesta')!.value) + ) + ) + .subscribe((encuestas: IEncuesta[]) => (this.encuestasSharedCollection = encuestas)); + } + + protected createFromForm(): IUsuarioEncuesta { + return { + ...new UsuarioEncuesta(), + id: this.editForm.get(['id'])!.value, + rol: this.editForm.get(['rol'])!.value, + estado: this.editForm.get(['estado'])!.value, + fechaAgregado: this.editForm.get(['fechaAgregado'])!.value + ? dayjs(this.editForm.get(['fechaAgregado'])!.value, DATE_TIME_FORMAT) + : undefined, + usuarioExtra: this.editForm.get(['usuarioExtra'])!.value, + encuesta: this.editForm.get(['encuesta'])!.value, + }; + } +} diff --git a/src/main/webapp/app/entities/usuario-encuesta/usuario-encuesta.model.ts b/src/main/webapp/app/entities/usuario-encuesta/usuario-encuesta.model.ts new file mode 100644 index 0000000..e73a32a --- /dev/null +++ b/src/main/webapp/app/entities/usuario-encuesta/usuario-encuesta.model.ts @@ -0,0 +1,29 @@ +import * as dayjs from 'dayjs'; +import { IUsuarioExtra } from 'app/entities/usuario-extra/usuario-extra.model'; +import { IEncuesta } from 'app/entities/encuesta/encuesta.model'; +import { RolColaborador } from 'app/entities/enumerations/rol-colaborador.model'; +import { EstadoColaborador } from 'app/entities/enumerations/estado-colaborador.model'; + +export interface IUsuarioEncuesta { + id?: number; + rol?: RolColaborador; + estado?: EstadoColaborador; + fechaAgregado?: dayjs.Dayjs; + usuarioExtra?: IUsuarioExtra | null; + encuesta?: IEncuesta | null; +} + +export class UsuarioEncuesta implements IUsuarioEncuesta { + constructor( + public id?: number, + public rol?: RolColaborador, + public estado?: EstadoColaborador, + public fechaAgregado?: dayjs.Dayjs, + public usuarioExtra?: IUsuarioExtra | null, + public encuesta?: IEncuesta | null + ) {} +} + +export function getUsuarioEncuestaIdentifier(usuarioEncuesta: IUsuarioEncuesta): number | undefined { + return usuarioEncuesta.id; +} diff --git a/src/main/webapp/app/entities/usuario-encuesta/usuario-encuesta.module.ts b/src/main/webapp/app/entities/usuario-encuesta/usuario-encuesta.module.ts new file mode 100644 index 0000000..c4b2256 --- /dev/null +++ b/src/main/webapp/app/entities/usuario-encuesta/usuario-encuesta.module.ts @@ -0,0 +1,19 @@ +import { NgModule } from '@angular/core'; +import { SharedModule } from 'app/shared/shared.module'; +import { UsuarioEncuestaComponent } from './list/usuario-encuesta.component'; +import { UsuarioEncuestaDetailComponent } from './detail/usuario-encuesta-detail.component'; +import { UsuarioEncuestaUpdateComponent } from './update/usuario-encuesta-update.component'; +import { UsuarioEncuestaDeleteDialogComponent } from './delete/usuario-encuesta-delete-dialog.component'; +import { UsuarioEncuestaRoutingModule } from './route/usuario-encuesta-routing.module'; + +@NgModule({ + imports: [SharedModule, UsuarioEncuestaRoutingModule], + declarations: [ + UsuarioEncuestaComponent, + UsuarioEncuestaDetailComponent, + UsuarioEncuestaUpdateComponent, + UsuarioEncuestaDeleteDialogComponent, + ], + entryComponents: [UsuarioEncuestaDeleteDialogComponent], +}) +export class UsuarioEncuestaModule {} diff --git a/src/main/webapp/app/entities/usuario-extra/delete/usuario-extra-delete-dialog.component.html b/src/main/webapp/app/entities/usuario-extra/delete/usuario-extra-delete-dialog.component.html new file mode 100644 index 0000000..805ea79 --- /dev/null +++ b/src/main/webapp/app/entities/usuario-extra/delete/usuario-extra-delete-dialog.component.html @@ -0,0 +1,29 @@ +
+ + + + + +
diff --git a/src/main/webapp/app/entities/usuario-extra/delete/usuario-extra-delete-dialog.component.spec.ts b/src/main/webapp/app/entities/usuario-extra/delete/usuario-extra-delete-dialog.component.spec.ts new file mode 100644 index 0000000..4649c87 --- /dev/null +++ b/src/main/webapp/app/entities/usuario-extra/delete/usuario-extra-delete-dialog.component.spec.ts @@ -0,0 +1,65 @@ +jest.mock('@ng-bootstrap/ng-bootstrap'); + +import { ComponentFixture, TestBed, inject, fakeAsync, tick } from '@angular/core/testing'; +import { HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { of } from 'rxjs'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; + +import { UsuarioExtraService } from '../service/usuario-extra.service'; + +import { UsuarioExtraDeleteDialogComponent } from './usuario-extra-delete-dialog.component'; + +describe('Component Tests', () => { + describe('UsuarioExtra Management Delete Component', () => { + let comp: UsuarioExtraDeleteDialogComponent; + let fixture: ComponentFixture; + let service: UsuarioExtraService; + let mockActiveModal: NgbActiveModal; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [UsuarioExtraDeleteDialogComponent], + providers: [NgbActiveModal], + }) + .overrideTemplate(UsuarioExtraDeleteDialogComponent, '') + .compileComponents(); + fixture = TestBed.createComponent(UsuarioExtraDeleteDialogComponent); + comp = fixture.componentInstance; + service = TestBed.inject(UsuarioExtraService); + mockActiveModal = TestBed.inject(NgbActiveModal); + }); + + describe('confirmDelete', () => { + it('Should call delete service on confirmDelete', inject( + [], + fakeAsync(() => { + // GIVEN + jest.spyOn(service, 'delete').mockReturnValue(of(new HttpResponse({}))); + + // WHEN + comp.confirmDelete(123); + tick(); + + // THEN + expect(service.delete).toHaveBeenCalledWith(123); + expect(mockActiveModal.close).toHaveBeenCalledWith('deleted'); + }) + )); + + it('Should not call delete service on clear', () => { + // GIVEN + jest.spyOn(service, 'delete'); + + // WHEN + comp.cancel(); + + // THEN + expect(service.delete).not.toHaveBeenCalled(); + expect(mockActiveModal.close).not.toHaveBeenCalled(); + expect(mockActiveModal.dismiss).toHaveBeenCalled(); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/usuario-extra/delete/usuario-extra-delete-dialog.component.ts b/src/main/webapp/app/entities/usuario-extra/delete/usuario-extra-delete-dialog.component.ts new file mode 100644 index 0000000..1f610cc --- /dev/null +++ b/src/main/webapp/app/entities/usuario-extra/delete/usuario-extra-delete-dialog.component.ts @@ -0,0 +1,24 @@ +import { Component } from '@angular/core'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; + +import { IUsuarioExtra } from '../usuario-extra.model'; +import { UsuarioExtraService } from '../service/usuario-extra.service'; + +@Component({ + templateUrl: './usuario-extra-delete-dialog.component.html', +}) +export class UsuarioExtraDeleteDialogComponent { + usuarioExtra?: IUsuarioExtra; + + constructor(protected usuarioExtraService: UsuarioExtraService, protected activeModal: NgbActiveModal) {} + + cancel(): void { + this.activeModal.dismiss(); + } + + confirmDelete(id: number): void { + this.usuarioExtraService.delete(id).subscribe(() => { + this.activeModal.close('deleted'); + }); + } +} diff --git a/src/main/webapp/app/entities/usuario-extra/detail/usuario-extra-detail.component.html b/src/main/webapp/app/entities/usuario-extra/detail/usuario-extra-detail.component.html new file mode 100644 index 0000000..893602f --- /dev/null +++ b/src/main/webapp/app/entities/usuario-extra/detail/usuario-extra-detail.component.html @@ -0,0 +1,55 @@ +
+
+
+

Usuario Extra

+ +
+ + + + + +
+
ID
+
+ {{ usuarioExtra.id }} +
+
Nombre
+
+ {{ usuarioExtra.nombre }} +
+
Icono Perfil
+
+ {{ usuarioExtra.iconoPerfil }} +
+
Fecha Nacimiento
+
+ {{ usuarioExtra.fechaNacimiento | formatMediumDatetime }} +
+
Estado
+
+ {{ usuarioExtra.estado }} +
+
User
+
+ {{ usuarioExtra.user?.id }} +
+
Plantilla
+
+ + {{ plantilla.id }}{{ last ? '' : ', ' }} + +
+
+ + + + +
+
+
diff --git a/src/main/webapp/app/entities/usuario-extra/detail/usuario-extra-detail.component.spec.ts b/src/main/webapp/app/entities/usuario-extra/detail/usuario-extra-detail.component.spec.ts new file mode 100644 index 0000000..3b58259 --- /dev/null +++ b/src/main/webapp/app/entities/usuario-extra/detail/usuario-extra-detail.component.spec.ts @@ -0,0 +1,38 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { ActivatedRoute } from '@angular/router'; +import { of } from 'rxjs'; + +import { UsuarioExtraDetailComponent } from './usuario-extra-detail.component'; + +describe('Component Tests', () => { + describe('UsuarioExtra Management Detail Component', () => { + let comp: UsuarioExtraDetailComponent; + let fixture: ComponentFixture; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [UsuarioExtraDetailComponent], + providers: [ + { + provide: ActivatedRoute, + useValue: { data: of({ usuarioExtra: { id: 123 } }) }, + }, + ], + }) + .overrideTemplate(UsuarioExtraDetailComponent, '') + .compileComponents(); + fixture = TestBed.createComponent(UsuarioExtraDetailComponent); + comp = fixture.componentInstance; + }); + + describe('OnInit', () => { + it('Should load usuarioExtra on init', () => { + // WHEN + comp.ngOnInit(); + + // THEN + expect(comp.usuarioExtra).toEqual(expect.objectContaining({ id: 123 })); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/usuario-extra/detail/usuario-extra-detail.component.ts b/src/main/webapp/app/entities/usuario-extra/detail/usuario-extra-detail.component.ts new file mode 100644 index 0000000..a6b4e82 --- /dev/null +++ b/src/main/webapp/app/entities/usuario-extra/detail/usuario-extra-detail.component.ts @@ -0,0 +1,24 @@ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; + +import { IUsuarioExtra } from '../usuario-extra.model'; + +@Component({ + selector: 'jhi-usuario-extra-detail', + templateUrl: './usuario-extra-detail.component.html', +}) +export class UsuarioExtraDetailComponent implements OnInit { + usuarioExtra: IUsuarioExtra | null = null; + + constructor(protected activatedRoute: ActivatedRoute) {} + + ngOnInit(): void { + this.activatedRoute.data.subscribe(({ usuarioExtra }) => { + this.usuarioExtra = usuarioExtra; + }); + } + + previousState(): void { + window.history.back(); + } +} diff --git a/src/main/webapp/app/entities/usuario-extra/list/usuario-extra.component.html b/src/main/webapp/app/entities/usuario-extra/list/usuario-extra.component.html new file mode 100644 index 0000000..768a830 --- /dev/null +++ b/src/main/webapp/app/entities/usuario-extra/list/usuario-extra.component.html @@ -0,0 +1,95 @@ +
+

+ Usuario Extras + +
+ + + +
+

+ + + + + +
+ No usuarioExtras found +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
IDNombreIcono PerfilFecha NacimientoEstadoUserPlantilla
+ {{ usuarioExtra.id }} + {{ usuarioExtra.nombre }}{{ usuarioExtra.iconoPerfil }}{{ usuarioExtra.fechaNacimiento | formatMediumDatetime }}{{ usuarioExtra.estado }} + {{ usuarioExtra.user?.id }} + + + {{ plantilla.id }}{{ last ? '' : ', ' }} + + +
+ + + + + +
+
+
+
diff --git a/src/main/webapp/app/entities/usuario-extra/list/usuario-extra.component.spec.ts b/src/main/webapp/app/entities/usuario-extra/list/usuario-extra.component.spec.ts new file mode 100644 index 0000000..1a8c654 --- /dev/null +++ b/src/main/webapp/app/entities/usuario-extra/list/usuario-extra.component.spec.ts @@ -0,0 +1,48 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { HttpHeaders, HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { of } from 'rxjs'; + +import { UsuarioExtraService } from '../service/usuario-extra.service'; + +import { UsuarioExtraComponent } from './usuario-extra.component'; + +describe('Component Tests', () => { + describe('UsuarioExtra Management Component', () => { + let comp: UsuarioExtraComponent; + let fixture: ComponentFixture; + let service: UsuarioExtraService; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [UsuarioExtraComponent], + }) + .overrideTemplate(UsuarioExtraComponent, '') + .compileComponents(); + + fixture = TestBed.createComponent(UsuarioExtraComponent); + comp = fixture.componentInstance; + service = TestBed.inject(UsuarioExtraService); + + const headers = new HttpHeaders().append('link', 'link;link'); + jest.spyOn(service, 'query').mockReturnValue( + of( + new HttpResponse({ + body: [{ id: 123 }], + headers, + }) + ) + ); + }); + + it('Should call load all on init', () => { + // WHEN + comp.ngOnInit(); + + // THEN + expect(service.query).toHaveBeenCalled(); + expect(comp.usuarioExtras?.[0]).toEqual(expect.objectContaining({ id: 123 })); + }); + }); +}); diff --git a/src/main/webapp/app/entities/usuario-extra/list/usuario-extra.component.ts b/src/main/webapp/app/entities/usuario-extra/list/usuario-extra.component.ts new file mode 100644 index 0000000..d537a82 --- /dev/null +++ b/src/main/webapp/app/entities/usuario-extra/list/usuario-extra.component.ts @@ -0,0 +1,51 @@ +import { Component, OnInit } from '@angular/core'; +import { HttpResponse } from '@angular/common/http'; +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; + +import { IUsuarioExtra } from '../usuario-extra.model'; +import { UsuarioExtraService } from '../service/usuario-extra.service'; +import { UsuarioExtraDeleteDialogComponent } from '../delete/usuario-extra-delete-dialog.component'; + +@Component({ + selector: 'jhi-usuario-extra', + templateUrl: './usuario-extra.component.html', +}) +export class UsuarioExtraComponent implements OnInit { + usuarioExtras?: IUsuarioExtra[]; + isLoading = false; + + constructor(protected usuarioExtraService: UsuarioExtraService, protected modalService: NgbModal) {} + + loadAll(): void { + this.isLoading = true; + + this.usuarioExtraService.query().subscribe( + (res: HttpResponse) => { + this.isLoading = false; + this.usuarioExtras = res.body ?? []; + }, + () => { + this.isLoading = false; + } + ); + } + + ngOnInit(): void { + this.loadAll(); + } + + trackId(index: number, item: IUsuarioExtra): number { + return item.id!; + } + + delete(usuarioExtra: IUsuarioExtra): void { + const modalRef = this.modalService.open(UsuarioExtraDeleteDialogComponent, { size: 'lg', backdrop: 'static' }); + modalRef.componentInstance.usuarioExtra = usuarioExtra; + // unsubscribe not needed because closed completes on modal close + modalRef.closed.subscribe(reason => { + if (reason === 'deleted') { + this.loadAll(); + } + }); + } +} diff --git a/src/main/webapp/app/entities/usuario-extra/route/usuario-extra-routing-resolve.service.spec.ts b/src/main/webapp/app/entities/usuario-extra/route/usuario-extra-routing-resolve.service.spec.ts new file mode 100644 index 0000000..ec6c6b5 --- /dev/null +++ b/src/main/webapp/app/entities/usuario-extra/route/usuario-extra-routing-resolve.service.spec.ts @@ -0,0 +1,82 @@ +jest.mock('@angular/router'); + +import { TestBed } from '@angular/core/testing'; +import { HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { ActivatedRouteSnapshot, Router } from '@angular/router'; +import { of } from 'rxjs'; + +import { IUsuarioExtra, UsuarioExtra } from '../usuario-extra.model'; +import { UsuarioExtraService } from '../service/usuario-extra.service'; + +import { UsuarioExtraRoutingResolveService } from './usuario-extra-routing-resolve.service'; + +describe('Service Tests', () => { + describe('UsuarioExtra routing resolve service', () => { + let mockRouter: Router; + let mockActivatedRouteSnapshot: ActivatedRouteSnapshot; + let routingResolveService: UsuarioExtraRoutingResolveService; + let service: UsuarioExtraService; + let resultUsuarioExtra: IUsuarioExtra | undefined; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [Router, ActivatedRouteSnapshot], + }); + mockRouter = TestBed.inject(Router); + mockActivatedRouteSnapshot = TestBed.inject(ActivatedRouteSnapshot); + routingResolveService = TestBed.inject(UsuarioExtraRoutingResolveService); + service = TestBed.inject(UsuarioExtraService); + resultUsuarioExtra = undefined; + }); + + describe('resolve', () => { + it('should return IUsuarioExtra returned by find', () => { + // GIVEN + service.find = jest.fn(id => of(new HttpResponse({ body: { id } }))); + mockActivatedRouteSnapshot.params = { id: 123 }; + + // WHEN + routingResolveService.resolve(mockActivatedRouteSnapshot).subscribe(result => { + resultUsuarioExtra = result; + }); + + // THEN + expect(service.find).toBeCalledWith(123); + expect(resultUsuarioExtra).toEqual({ id: 123 }); + }); + + it('should return new IUsuarioExtra if id is not provided', () => { + // GIVEN + service.find = jest.fn(); + mockActivatedRouteSnapshot.params = {}; + + // WHEN + routingResolveService.resolve(mockActivatedRouteSnapshot).subscribe(result => { + resultUsuarioExtra = result; + }); + + // THEN + expect(service.find).not.toBeCalled(); + expect(resultUsuarioExtra).toEqual(new UsuarioExtra()); + }); + + it('should route to 404 page if data not found in server', () => { + // GIVEN + jest.spyOn(service, 'find').mockReturnValue(of(new HttpResponse({ body: null as unknown as UsuarioExtra }))); + mockActivatedRouteSnapshot.params = { id: 123 }; + + // WHEN + routingResolveService.resolve(mockActivatedRouteSnapshot).subscribe(result => { + resultUsuarioExtra = result; + }); + + // THEN + expect(service.find).toBeCalledWith(123); + expect(resultUsuarioExtra).toEqual(undefined); + expect(mockRouter.navigate).toHaveBeenCalledWith(['404']); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/usuario-extra/route/usuario-extra-routing-resolve.service.ts b/src/main/webapp/app/entities/usuario-extra/route/usuario-extra-routing-resolve.service.ts new file mode 100644 index 0000000..c6f1c70 --- /dev/null +++ b/src/main/webapp/app/entities/usuario-extra/route/usuario-extra-routing-resolve.service.ts @@ -0,0 +1,30 @@ +import { Injectable } from '@angular/core'; +import { HttpResponse } from '@angular/common/http'; +import { Resolve, ActivatedRouteSnapshot, Router } from '@angular/router'; +import { Observable, of, EMPTY } from 'rxjs'; +import { mergeMap } from 'rxjs/operators'; + +import { IUsuarioExtra, UsuarioExtra } from '../usuario-extra.model'; +import { UsuarioExtraService } from '../service/usuario-extra.service'; + +@Injectable({ providedIn: 'root' }) +export class UsuarioExtraRoutingResolveService implements Resolve { + constructor(protected service: UsuarioExtraService, protected router: Router) {} + + resolve(route: ActivatedRouteSnapshot): Observable | Observable { + const id = route.params['id']; + if (id) { + return this.service.find(id).pipe( + mergeMap((usuarioExtra: HttpResponse) => { + if (usuarioExtra.body) { + return of(usuarioExtra.body); + } else { + this.router.navigate(['404']); + return EMPTY; + } + }) + ); + } + return of(new UsuarioExtra()); + } +} diff --git a/src/main/webapp/app/entities/usuario-extra/route/usuario-extra-routing.module.ts b/src/main/webapp/app/entities/usuario-extra/route/usuario-extra-routing.module.ts new file mode 100644 index 0000000..435c454 --- /dev/null +++ b/src/main/webapp/app/entities/usuario-extra/route/usuario-extra-routing.module.ts @@ -0,0 +1,46 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; + +import { UserRouteAccessService } from 'app/core/auth/user-route-access.service'; +import { UsuarioExtraComponent } from '../list/usuario-extra.component'; +import { UsuarioExtraDetailComponent } from '../detail/usuario-extra-detail.component'; +import { UsuarioExtraUpdateComponent } from '../update/usuario-extra-update.component'; +import { UsuarioExtraRoutingResolveService } from './usuario-extra-routing-resolve.service'; + +const usuarioExtraRoute: Routes = [ + { + path: '', + component: UsuarioExtraComponent, + canActivate: [UserRouteAccessService], + }, + { + path: ':id/view', + component: UsuarioExtraDetailComponent, + resolve: { + usuarioExtra: UsuarioExtraRoutingResolveService, + }, + canActivate: [UserRouteAccessService], + }, + { + path: 'new', + component: UsuarioExtraUpdateComponent, + resolve: { + usuarioExtra: UsuarioExtraRoutingResolveService, + }, + canActivate: [UserRouteAccessService], + }, + { + path: ':id/edit', + component: UsuarioExtraUpdateComponent, + resolve: { + usuarioExtra: UsuarioExtraRoutingResolveService, + }, + canActivate: [UserRouteAccessService], + }, +]; + +@NgModule({ + imports: [RouterModule.forChild(usuarioExtraRoute)], + exports: [RouterModule], +}) +export class UsuarioExtraRoutingModule {} diff --git a/src/main/webapp/app/entities/usuario-extra/service/usuario-extra.service.spec.ts b/src/main/webapp/app/entities/usuario-extra/service/usuario-extra.service.spec.ts new file mode 100644 index 0000000..7de8c84 --- /dev/null +++ b/src/main/webapp/app/entities/usuario-extra/service/usuario-extra.service.spec.ts @@ -0,0 +1,225 @@ +import { TestBed } from '@angular/core/testing'; +import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; +import * as dayjs from 'dayjs'; + +import { DATE_TIME_FORMAT } from 'app/config/input.constants'; +import { EstadoUsuario } from 'app/entities/enumerations/estado-usuario.model'; +import { IUsuarioExtra, UsuarioExtra } from '../usuario-extra.model'; + +import { UsuarioExtraService } from './usuario-extra.service'; + +describe('Service Tests', () => { + describe('UsuarioExtra Service', () => { + let service: UsuarioExtraService; + let httpMock: HttpTestingController; + let elemDefault: IUsuarioExtra; + let expectedResult: IUsuarioExtra | IUsuarioExtra[] | boolean | null; + let currentDate: dayjs.Dayjs; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + }); + expectedResult = null; + service = TestBed.inject(UsuarioExtraService); + httpMock = TestBed.inject(HttpTestingController); + currentDate = dayjs(); + + elemDefault = { + id: 0, + nombre: 'AAAAAAA', + iconoPerfil: 'AAAAAAA', + fechaNacimiento: currentDate, + estado: EstadoUsuario.ACTIVE, + }; + }); + + describe('Service methods', () => { + it('should find an element', () => { + const returnedFromService = Object.assign( + { + fechaNacimiento: currentDate.format(DATE_TIME_FORMAT), + }, + elemDefault + ); + + service.find(123).subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'GET' }); + req.flush(returnedFromService); + expect(expectedResult).toMatchObject(elemDefault); + }); + + it('should create a UsuarioExtra', () => { + const returnedFromService = Object.assign( + { + id: 0, + fechaNacimiento: currentDate.format(DATE_TIME_FORMAT), + }, + elemDefault + ); + + const expected = Object.assign( + { + fechaNacimiento: currentDate, + }, + returnedFromService + ); + + service.create(new UsuarioExtra()).subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'POST' }); + req.flush(returnedFromService); + expect(expectedResult).toMatchObject(expected); + }); + + it('should update a UsuarioExtra', () => { + const returnedFromService = Object.assign( + { + id: 1, + nombre: 'BBBBBB', + iconoPerfil: 'BBBBBB', + fechaNacimiento: currentDate.format(DATE_TIME_FORMAT), + estado: 'BBBBBB', + }, + elemDefault + ); + + const expected = Object.assign( + { + fechaNacimiento: currentDate, + }, + returnedFromService + ); + + service.update(expected).subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'PUT' }); + req.flush(returnedFromService); + expect(expectedResult).toMatchObject(expected); + }); + + it('should partial update a UsuarioExtra', () => { + const patchObject = Object.assign( + { + nombre: 'BBBBBB', + iconoPerfil: 'BBBBBB', + }, + new UsuarioExtra() + ); + + const returnedFromService = Object.assign(patchObject, elemDefault); + + const expected = Object.assign( + { + fechaNacimiento: currentDate, + }, + returnedFromService + ); + + service.partialUpdate(patchObject).subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'PATCH' }); + req.flush(returnedFromService); + expect(expectedResult).toMatchObject(expected); + }); + + it('should return a list of UsuarioExtra', () => { + const returnedFromService = Object.assign( + { + id: 1, + nombre: 'BBBBBB', + iconoPerfil: 'BBBBBB', + fechaNacimiento: currentDate.format(DATE_TIME_FORMAT), + estado: 'BBBBBB', + }, + elemDefault + ); + + const expected = Object.assign( + { + fechaNacimiento: currentDate, + }, + returnedFromService + ); + + service.query().subscribe(resp => (expectedResult = resp.body)); + + const req = httpMock.expectOne({ method: 'GET' }); + req.flush([returnedFromService]); + httpMock.verify(); + expect(expectedResult).toContainEqual(expected); + }); + + it('should delete a UsuarioExtra', () => { + service.delete(123).subscribe(resp => (expectedResult = resp.ok)); + + const req = httpMock.expectOne({ method: 'DELETE' }); + req.flush({ status: 200 }); + expect(expectedResult); + }); + + describe('addUsuarioExtraToCollectionIfMissing', () => { + it('should add a UsuarioExtra to an empty array', () => { + const usuarioExtra: IUsuarioExtra = { id: 123 }; + expectedResult = service.addUsuarioExtraToCollectionIfMissing([], usuarioExtra); + expect(expectedResult).toHaveLength(1); + expect(expectedResult).toContain(usuarioExtra); + }); + + it('should not add a UsuarioExtra to an array that contains it', () => { + const usuarioExtra: IUsuarioExtra = { id: 123 }; + const usuarioExtraCollection: IUsuarioExtra[] = [ + { + ...usuarioExtra, + }, + { id: 456 }, + ]; + expectedResult = service.addUsuarioExtraToCollectionIfMissing(usuarioExtraCollection, usuarioExtra); + expect(expectedResult).toHaveLength(2); + }); + + it("should add a UsuarioExtra to an array that doesn't contain it", () => { + const usuarioExtra: IUsuarioExtra = { id: 123 }; + const usuarioExtraCollection: IUsuarioExtra[] = [{ id: 456 }]; + expectedResult = service.addUsuarioExtraToCollectionIfMissing(usuarioExtraCollection, usuarioExtra); + expect(expectedResult).toHaveLength(2); + expect(expectedResult).toContain(usuarioExtra); + }); + + it('should add only unique UsuarioExtra to an array', () => { + const usuarioExtraArray: IUsuarioExtra[] = [{ id: 123 }, { id: 456 }, { id: 53810 }]; + const usuarioExtraCollection: IUsuarioExtra[] = [{ id: 123 }]; + expectedResult = service.addUsuarioExtraToCollectionIfMissing(usuarioExtraCollection, ...usuarioExtraArray); + expect(expectedResult).toHaveLength(3); + }); + + it('should accept varargs', () => { + const usuarioExtra: IUsuarioExtra = { id: 123 }; + const usuarioExtra2: IUsuarioExtra = { id: 456 }; + expectedResult = service.addUsuarioExtraToCollectionIfMissing([], usuarioExtra, usuarioExtra2); + expect(expectedResult).toHaveLength(2); + expect(expectedResult).toContain(usuarioExtra); + expect(expectedResult).toContain(usuarioExtra2); + }); + + it('should accept null and undefined values', () => { + const usuarioExtra: IUsuarioExtra = { id: 123 }; + expectedResult = service.addUsuarioExtraToCollectionIfMissing([], null, usuarioExtra, undefined); + expect(expectedResult).toHaveLength(1); + expect(expectedResult).toContain(usuarioExtra); + }); + + it('should return initial array if no UsuarioExtra is added', () => { + const usuarioExtraCollection: IUsuarioExtra[] = [{ id: 123 }]; + expectedResult = service.addUsuarioExtraToCollectionIfMissing(usuarioExtraCollection, undefined, null); + expect(expectedResult).toEqual(usuarioExtraCollection); + }); + }); + }); + + afterEach(() => { + httpMock.verify(); + }); + }); +}); diff --git a/src/main/webapp/app/entities/usuario-extra/service/usuario-extra.service.ts b/src/main/webapp/app/entities/usuario-extra/service/usuario-extra.service.ts new file mode 100644 index 0000000..de5f5f7 --- /dev/null +++ b/src/main/webapp/app/entities/usuario-extra/service/usuario-extra.service.ts @@ -0,0 +1,102 @@ +import { Injectable } from '@angular/core'; +import { HttpClient, HttpResponse } from '@angular/common/http'; +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; +import * as dayjs from 'dayjs'; + +import { isPresent } from 'app/core/util/operators'; +import { ApplicationConfigService } from 'app/core/config/application-config.service'; +import { createRequestOption } from 'app/core/request/request-util'; +import { IUsuarioExtra, getUsuarioExtraIdentifier } from '../usuario-extra.model'; + +export type EntityResponseType = HttpResponse; +export type EntityArrayResponseType = HttpResponse; + +@Injectable({ providedIn: 'root' }) +export class UsuarioExtraService { + protected resourceUrl = this.applicationConfigService.getEndpointFor('api/usuario-extras'); + + constructor(protected http: HttpClient, protected applicationConfigService: ApplicationConfigService) {} + + create(usuarioExtra: IUsuarioExtra): Observable { + const copy = this.convertDateFromClient(usuarioExtra); + return this.http + .post(this.resourceUrl, copy, { observe: 'response' }) + .pipe(map((res: EntityResponseType) => this.convertDateFromServer(res))); + } + + update(usuarioExtra: IUsuarioExtra): Observable { + const copy = this.convertDateFromClient(usuarioExtra); + return this.http + .put(`${this.resourceUrl}/${getUsuarioExtraIdentifier(usuarioExtra) as number}`, copy, { observe: 'response' }) + .pipe(map((res: EntityResponseType) => this.convertDateFromServer(res))); + } + + partialUpdate(usuarioExtra: IUsuarioExtra): Observable { + const copy = this.convertDateFromClient(usuarioExtra); + return this.http + .patch(`${this.resourceUrl}/${getUsuarioExtraIdentifier(usuarioExtra) as number}`, copy, { observe: 'response' }) + .pipe(map((res: EntityResponseType) => this.convertDateFromServer(res))); + } + + find(id: number): Observable { + return this.http + .get(`${this.resourceUrl}/${id}`, { observe: 'response' }) + .pipe(map((res: EntityResponseType) => this.convertDateFromServer(res))); + } + + query(req?: any): Observable { + const options = createRequestOption(req); + return this.http + .get(this.resourceUrl, { params: options, observe: 'response' }) + .pipe(map((res: EntityArrayResponseType) => this.convertDateArrayFromServer(res))); + } + + delete(id: number): Observable> { + return this.http.delete(`${this.resourceUrl}/${id}`, { observe: 'response' }); + } + + addUsuarioExtraToCollectionIfMissing( + usuarioExtraCollection: IUsuarioExtra[], + ...usuarioExtrasToCheck: (IUsuarioExtra | null | undefined)[] + ): IUsuarioExtra[] { + const usuarioExtras: IUsuarioExtra[] = usuarioExtrasToCheck.filter(isPresent); + if (usuarioExtras.length > 0) { + const usuarioExtraCollectionIdentifiers = usuarioExtraCollection.map( + usuarioExtraItem => getUsuarioExtraIdentifier(usuarioExtraItem)! + ); + const usuarioExtrasToAdd = usuarioExtras.filter(usuarioExtraItem => { + const usuarioExtraIdentifier = getUsuarioExtraIdentifier(usuarioExtraItem); + if (usuarioExtraIdentifier == null || usuarioExtraCollectionIdentifiers.includes(usuarioExtraIdentifier)) { + return false; + } + usuarioExtraCollectionIdentifiers.push(usuarioExtraIdentifier); + return true; + }); + return [...usuarioExtrasToAdd, ...usuarioExtraCollection]; + } + return usuarioExtraCollection; + } + + protected convertDateFromClient(usuarioExtra: IUsuarioExtra): IUsuarioExtra { + return Object.assign({}, usuarioExtra, { + fechaNacimiento: usuarioExtra.fechaNacimiento?.isValid() ? usuarioExtra.fechaNacimiento.toJSON() : undefined, + }); + } + + protected convertDateFromServer(res: EntityResponseType): EntityResponseType { + if (res.body) { + res.body.fechaNacimiento = res.body.fechaNacimiento ? dayjs(res.body.fechaNacimiento) : undefined; + } + return res; + } + + protected convertDateArrayFromServer(res: EntityArrayResponseType): EntityArrayResponseType { + if (res.body) { + res.body.forEach((usuarioExtra: IUsuarioExtra) => { + usuarioExtra.fechaNacimiento = usuarioExtra.fechaNacimiento ? dayjs(usuarioExtra.fechaNacimiento) : undefined; + }); + } + return res; + } +} diff --git a/src/main/webapp/app/entities/usuario-extra/update/usuario-extra-update.component.html b/src/main/webapp/app/entities/usuario-extra/update/usuario-extra-update.component.html new file mode 100644 index 0000000..68ee81c --- /dev/null +++ b/src/main/webapp/app/entities/usuario-extra/update/usuario-extra-update.component.html @@ -0,0 +1,118 @@ +
+
+
+

+ Create or edit a Usuario Extra +

+ +
+ + +
+ + +
+ +
+ + +
+ + This field is required. + +
+
+ +
+ + +
+ +
+ +
+ +
+
+ +
+ + +
+ + This field is required. + +
+
+ +
+ + +
+ +
+ + +
+
+ +
+ + + +
+
+
+
diff --git a/src/main/webapp/app/entities/usuario-extra/update/usuario-extra-update.component.spec.ts b/src/main/webapp/app/entities/usuario-extra/update/usuario-extra-update.component.spec.ts new file mode 100644 index 0000000..d980272 --- /dev/null +++ b/src/main/webapp/app/entities/usuario-extra/update/usuario-extra-update.component.spec.ts @@ -0,0 +1,212 @@ +jest.mock('@angular/router'); + +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { HttpResponse } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { FormBuilder } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; +import { of, Subject } from 'rxjs'; + +import { UsuarioExtraService } from '../service/usuario-extra.service'; +import { IUsuarioExtra, UsuarioExtra } from '../usuario-extra.model'; + +import { IUser } from 'app/entities/user/user.model'; +import { UserService } from 'app/entities/user/user.service'; +import { IPlantilla } from 'app/entities/plantilla/plantilla.model'; +import { PlantillaService } from 'app/entities/plantilla/service/plantilla.service'; + +import { UsuarioExtraUpdateComponent } from './usuario-extra-update.component'; + +describe('Component Tests', () => { + describe('UsuarioExtra Management Update Component', () => { + let comp: UsuarioExtraUpdateComponent; + let fixture: ComponentFixture; + let activatedRoute: ActivatedRoute; + let usuarioExtraService: UsuarioExtraService; + let userService: UserService; + let plantillaService: PlantillaService; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [UsuarioExtraUpdateComponent], + providers: [FormBuilder, ActivatedRoute], + }) + .overrideTemplate(UsuarioExtraUpdateComponent, '') + .compileComponents(); + + fixture = TestBed.createComponent(UsuarioExtraUpdateComponent); + activatedRoute = TestBed.inject(ActivatedRoute); + usuarioExtraService = TestBed.inject(UsuarioExtraService); + userService = TestBed.inject(UserService); + plantillaService = TestBed.inject(PlantillaService); + + comp = fixture.componentInstance; + }); + + describe('ngOnInit', () => { + it('Should call User query and add missing value', () => { + const usuarioExtra: IUsuarioExtra = { id: 456 }; + const user: IUser = { id: 58280 }; + usuarioExtra.user = user; + + const userCollection: IUser[] = [{ id: 29686 }]; + jest.spyOn(userService, 'query').mockReturnValue(of(new HttpResponse({ body: userCollection }))); + const additionalUsers = [user]; + const expectedCollection: IUser[] = [...additionalUsers, ...userCollection]; + jest.spyOn(userService, 'addUserToCollectionIfMissing').mockReturnValue(expectedCollection); + + activatedRoute.data = of({ usuarioExtra }); + comp.ngOnInit(); + + expect(userService.query).toHaveBeenCalled(); + expect(userService.addUserToCollectionIfMissing).toHaveBeenCalledWith(userCollection, ...additionalUsers); + expect(comp.usersSharedCollection).toEqual(expectedCollection); + }); + + it('Should call Plantilla query and add missing value', () => { + const usuarioExtra: IUsuarioExtra = { id: 456 }; + const plantillas: IPlantilla[] = [{ id: 54411 }]; + usuarioExtra.plantillas = plantillas; + + const plantillaCollection: IPlantilla[] = [{ id: 32212 }]; + jest.spyOn(plantillaService, 'query').mockReturnValue(of(new HttpResponse({ body: plantillaCollection }))); + const additionalPlantillas = [...plantillas]; + const expectedCollection: IPlantilla[] = [...additionalPlantillas, ...plantillaCollection]; + jest.spyOn(plantillaService, 'addPlantillaToCollectionIfMissing').mockReturnValue(expectedCollection); + + activatedRoute.data = of({ usuarioExtra }); + comp.ngOnInit(); + + expect(plantillaService.query).toHaveBeenCalled(); + expect(plantillaService.addPlantillaToCollectionIfMissing).toHaveBeenCalledWith(plantillaCollection, ...additionalPlantillas); + expect(comp.plantillasSharedCollection).toEqual(expectedCollection); + }); + + it('Should update editForm', () => { + const usuarioExtra: IUsuarioExtra = { id: 456 }; + const user: IUser = { id: 30429 }; + usuarioExtra.user = user; + const plantillas: IPlantilla = { id: 61011 }; + usuarioExtra.plantillas = [plantillas]; + + activatedRoute.data = of({ usuarioExtra }); + comp.ngOnInit(); + + expect(comp.editForm.value).toEqual(expect.objectContaining(usuarioExtra)); + expect(comp.usersSharedCollection).toContain(user); + expect(comp.plantillasSharedCollection).toContain(plantillas); + }); + }); + + describe('save', () => { + it('Should call update service on save for existing entity', () => { + // GIVEN + const saveSubject = new Subject>(); + const usuarioExtra = { id: 123 }; + jest.spyOn(usuarioExtraService, 'update').mockReturnValue(saveSubject); + jest.spyOn(comp, 'previousState'); + activatedRoute.data = of({ usuarioExtra }); + comp.ngOnInit(); + + // WHEN + comp.save(); + expect(comp.isSaving).toEqual(true); + saveSubject.next(new HttpResponse({ body: usuarioExtra })); + saveSubject.complete(); + + // THEN + expect(comp.previousState).toHaveBeenCalled(); + expect(usuarioExtraService.update).toHaveBeenCalledWith(usuarioExtra); + expect(comp.isSaving).toEqual(false); + }); + + it('Should call create service on save for new entity', () => { + // GIVEN + const saveSubject = new Subject>(); + const usuarioExtra = new UsuarioExtra(); + jest.spyOn(usuarioExtraService, 'create').mockReturnValue(saveSubject); + jest.spyOn(comp, 'previousState'); + activatedRoute.data = of({ usuarioExtra }); + comp.ngOnInit(); + + // WHEN + comp.save(); + expect(comp.isSaving).toEqual(true); + saveSubject.next(new HttpResponse({ body: usuarioExtra })); + saveSubject.complete(); + + // THEN + expect(usuarioExtraService.create).toHaveBeenCalledWith(usuarioExtra); + expect(comp.isSaving).toEqual(false); + expect(comp.previousState).toHaveBeenCalled(); + }); + + it('Should set isSaving to false on error', () => { + // GIVEN + const saveSubject = new Subject>(); + const usuarioExtra = { id: 123 }; + jest.spyOn(usuarioExtraService, 'update').mockReturnValue(saveSubject); + jest.spyOn(comp, 'previousState'); + activatedRoute.data = of({ usuarioExtra }); + comp.ngOnInit(); + + // WHEN + comp.save(); + expect(comp.isSaving).toEqual(true); + saveSubject.error('This is an error!'); + + // THEN + expect(usuarioExtraService.update).toHaveBeenCalledWith(usuarioExtra); + expect(comp.isSaving).toEqual(false); + expect(comp.previousState).not.toHaveBeenCalled(); + }); + }); + + describe('Tracking relationships identifiers', () => { + describe('trackUserById', () => { + it('Should return tracked User primary key', () => { + const entity = { id: 123 }; + const trackResult = comp.trackUserById(0, entity); + expect(trackResult).toEqual(entity.id); + }); + }); + + describe('trackPlantillaById', () => { + it('Should return tracked Plantilla primary key', () => { + const entity = { id: 123 }; + const trackResult = comp.trackPlantillaById(0, entity); + expect(trackResult).toEqual(entity.id); + }); + }); + }); + + describe('Getting selected relationships', () => { + describe('getSelectedPlantilla', () => { + it('Should return option if no Plantilla is selected', () => { + const option = { id: 123 }; + const result = comp.getSelectedPlantilla(option); + expect(result === option).toEqual(true); + }); + + it('Should return selected Plantilla for according option', () => { + const option = { id: 123 }; + const selected = { id: 123 }; + const selected2 = { id: 456 }; + const result = comp.getSelectedPlantilla(option, [selected2, selected]); + expect(result === selected).toEqual(true); + expect(result === selected2).toEqual(false); + expect(result === option).toEqual(false); + }); + + it('Should return option if this Plantilla is not selected', () => { + const option = { id: 123 }; + const selected = { id: 456 }; + const result = comp.getSelectedPlantilla(option, [selected]); + expect(result === option).toEqual(true); + expect(result === selected).toEqual(false); + }); + }); + }); + }); +}); diff --git a/src/main/webapp/app/entities/usuario-extra/update/usuario-extra-update.component.ts b/src/main/webapp/app/entities/usuario-extra/update/usuario-extra-update.component.ts new file mode 100644 index 0000000..b790e73 --- /dev/null +++ b/src/main/webapp/app/entities/usuario-extra/update/usuario-extra-update.component.ts @@ -0,0 +1,161 @@ +import { Component, OnInit } from '@angular/core'; +import { HttpResponse } from '@angular/common/http'; +import { FormBuilder, Validators } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; +import { Observable } from 'rxjs'; +import { finalize, map } from 'rxjs/operators'; + +import * as dayjs from 'dayjs'; +import { DATE_TIME_FORMAT } from 'app/config/input.constants'; + +import { IUsuarioExtra, UsuarioExtra } from '../usuario-extra.model'; +import { UsuarioExtraService } from '../service/usuario-extra.service'; +import { IUser } from 'app/entities/user/user.model'; +import { UserService } from 'app/entities/user/user.service'; +import { IPlantilla } from 'app/entities/plantilla/plantilla.model'; +import { PlantillaService } from 'app/entities/plantilla/service/plantilla.service'; + +@Component({ + selector: 'jhi-usuario-extra-update', + templateUrl: './usuario-extra-update.component.html', +}) +export class UsuarioExtraUpdateComponent implements OnInit { + isSaving = false; + + usersSharedCollection: IUser[] = []; + plantillasSharedCollection: IPlantilla[] = []; + + editForm = this.fb.group({ + id: [], + nombre: [null, [Validators.required]], + iconoPerfil: [], + fechaNacimiento: [], + estado: [null, [Validators.required]], + user: [], + plantillas: [], + }); + + constructor( + protected usuarioExtraService: UsuarioExtraService, + protected userService: UserService, + protected plantillaService: PlantillaService, + protected activatedRoute: ActivatedRoute, + protected fb: FormBuilder + ) {} + + ngOnInit(): void { + this.activatedRoute.data.subscribe(({ usuarioExtra }) => { + if (usuarioExtra.id === undefined) { + const today = dayjs().startOf('day'); + usuarioExtra.fechaNacimiento = today; + } + + this.updateForm(usuarioExtra); + + this.loadRelationshipsOptions(); + }); + } + + previousState(): void { + window.history.back(); + } + + save(): void { + this.isSaving = true; + const usuarioExtra = this.createFromForm(); + if (usuarioExtra.id !== undefined) { + this.subscribeToSaveResponse(this.usuarioExtraService.update(usuarioExtra)); + } else { + this.subscribeToSaveResponse(this.usuarioExtraService.create(usuarioExtra)); + } + } + + trackUserById(index: number, item: IUser): number { + return item.id!; + } + + trackPlantillaById(index: number, item: IPlantilla): number { + return item.id!; + } + + getSelectedPlantilla(option: IPlantilla, selectedVals?: IPlantilla[]): IPlantilla { + if (selectedVals) { + for (const selectedVal of selectedVals) { + if (option.id === selectedVal.id) { + return selectedVal; + } + } + } + return option; + } + + protected subscribeToSaveResponse(result: Observable>): void { + result.pipe(finalize(() => this.onSaveFinalize())).subscribe( + () => this.onSaveSuccess(), + () => this.onSaveError() + ); + } + + protected onSaveSuccess(): void { + this.previousState(); + } + + protected onSaveError(): void { + // Api for inheritance. + } + + protected onSaveFinalize(): void { + this.isSaving = false; + } + + protected updateForm(usuarioExtra: IUsuarioExtra): void { + this.editForm.patchValue({ + id: usuarioExtra.id, + nombre: usuarioExtra.nombre, + iconoPerfil: usuarioExtra.iconoPerfil, + fechaNacimiento: usuarioExtra.fechaNacimiento ? usuarioExtra.fechaNacimiento.format(DATE_TIME_FORMAT) : null, + estado: usuarioExtra.estado, + user: usuarioExtra.user, + plantillas: usuarioExtra.plantillas, + }); + + this.usersSharedCollection = this.userService.addUserToCollectionIfMissing(this.usersSharedCollection, usuarioExtra.user); + this.plantillasSharedCollection = this.plantillaService.addPlantillaToCollectionIfMissing( + this.plantillasSharedCollection, + ...(usuarioExtra.plantillas ?? []) + ); + } + + protected loadRelationshipsOptions(): void { + this.userService + .query() + .pipe(map((res: HttpResponse) => res.body ?? [])) + .pipe(map((users: IUser[]) => this.userService.addUserToCollectionIfMissing(users, this.editForm.get('user')!.value))) + .subscribe((users: IUser[]) => (this.usersSharedCollection = users)); + + this.plantillaService + .query() + .pipe(map((res: HttpResponse) => res.body ?? [])) + .pipe( + map((plantillas: IPlantilla[]) => + this.plantillaService.addPlantillaToCollectionIfMissing(plantillas, ...(this.editForm.get('plantillas')!.value ?? [])) + ) + ) + .subscribe((plantillas: IPlantilla[]) => (this.plantillasSharedCollection = plantillas)); + } + + protected createFromForm(): IUsuarioExtra { + return { + ...new UsuarioExtra(), + id: this.editForm.get(['id'])!.value, + nombre: this.editForm.get(['nombre'])!.value, + iconoPerfil: this.editForm.get(['iconoPerfil'])!.value, + fechaNacimiento: this.editForm.get(['fechaNacimiento'])!.value + ? dayjs(this.editForm.get(['fechaNacimiento'])!.value, DATE_TIME_FORMAT) + : undefined, + estado: this.editForm.get(['estado'])!.value, + user: this.editForm.get(['user'])!.value, + plantillas: this.editForm.get(['plantillas'])!.value, + }; + } +} diff --git a/src/main/webapp/app/entities/usuario-extra/usuario-extra.model.ts b/src/main/webapp/app/entities/usuario-extra/usuario-extra.model.ts new file mode 100644 index 0000000..5f4c94f --- /dev/null +++ b/src/main/webapp/app/entities/usuario-extra/usuario-extra.model.ts @@ -0,0 +1,36 @@ +import * as dayjs from 'dayjs'; +import { IUser } from 'app/entities/user/user.model'; +import { IEncuesta } from 'app/entities/encuesta/encuesta.model'; +import { IUsuarioEncuesta } from 'app/entities/usuario-encuesta/usuario-encuesta.model'; +import { IPlantilla } from 'app/entities/plantilla/plantilla.model'; +import { EstadoUsuario } from 'app/entities/enumerations/estado-usuario.model'; + +export interface IUsuarioExtra { + id?: number; + nombre?: string; + iconoPerfil?: string | null; + fechaNacimiento?: dayjs.Dayjs | null; + estado?: EstadoUsuario; + user?: IUser | null; + encuestas?: IEncuesta[] | null; + usuarioEncuestas?: IUsuarioEncuesta[] | null; + plantillas?: IPlantilla[] | null; +} + +export class UsuarioExtra implements IUsuarioExtra { + constructor( + public id?: number, + public nombre?: string, + public iconoPerfil?: string | null, + public fechaNacimiento?: dayjs.Dayjs | null, + public estado?: EstadoUsuario, + public user?: IUser | null, + public encuestas?: IEncuesta[] | null, + public usuarioEncuestas?: IUsuarioEncuesta[] | null, + public plantillas?: IPlantilla[] | null + ) {} +} + +export function getUsuarioExtraIdentifier(usuarioExtra: IUsuarioExtra): number | undefined { + return usuarioExtra.id; +} diff --git a/src/main/webapp/app/entities/usuario-extra/usuario-extra.module.ts b/src/main/webapp/app/entities/usuario-extra/usuario-extra.module.ts new file mode 100644 index 0000000..beab505 --- /dev/null +++ b/src/main/webapp/app/entities/usuario-extra/usuario-extra.module.ts @@ -0,0 +1,14 @@ +import { NgModule } from '@angular/core'; +import { SharedModule } from 'app/shared/shared.module'; +import { UsuarioExtraComponent } from './list/usuario-extra.component'; +import { UsuarioExtraDetailComponent } from './detail/usuario-extra-detail.component'; +import { UsuarioExtraUpdateComponent } from './update/usuario-extra-update.component'; +import { UsuarioExtraDeleteDialogComponent } from './delete/usuario-extra-delete-dialog.component'; +import { UsuarioExtraRoutingModule } from './route/usuario-extra-routing.module'; + +@NgModule({ + imports: [SharedModule, UsuarioExtraRoutingModule], + declarations: [UsuarioExtraComponent, UsuarioExtraDetailComponent, UsuarioExtraUpdateComponent, UsuarioExtraDeleteDialogComponent], + entryComponents: [UsuarioExtraDeleteDialogComponent], +}) +export class UsuarioExtraModule {} diff --git a/src/main/webapp/app/home/home.component.html b/src/main/webapp/app/home/home.component.html new file mode 100644 index 0000000..80b9fdf --- /dev/null +++ b/src/main/webapp/app/home/home.component.html @@ -0,0 +1,78 @@ +
+
+ +
+ +
+

Welcome, Java Hipster! (Data Survey)

+ +

This is your homepage

+ +
+
+ You are logged in as user "{{ account.login }}". +
+ +
+ If you want to + sign in, you can try the default accounts:
- Administrator (login="admin" and password="admin")
- User (login="user" and + password="user").
+
+ +
+ You don't have an account yet?  + Register a new account +
+
+ +

If you have any question on JHipster:

+ + + +

+ If you like JHipster, don't forget to give us a star on + GitHub! +

+
+
diff --git a/src/main/webapp/app/home/home.component.scss b/src/main/webapp/app/home/home.component.scss new file mode 100644 index 0000000..c731f12 --- /dev/null +++ b/src/main/webapp/app/home/home.component.scss @@ -0,0 +1,23 @@ +/* ========================================================================== +Main page styles +========================================================================== */ + +.hipster { + display: inline-block; + width: 347px; + height: 497px; + background: url('../../content/images/jhipster_family_member_0.svg') no-repeat center top; + background-size: contain; +} + +/* wait autoprefixer update to allow simple generation of high pixel density media query */ +@media only screen and (-webkit-min-device-pixel-ratio: 2), + only screen and (-moz-min-device-pixel-ratio: 2), + only screen and (-o-min-device-pixel-ratio: 2/1), + only screen and (min-resolution: 192dpi), + only screen and (min-resolution: 2dppx) { + .hipster { + background: url('../../content/images/jhipster_family_member_0.svg') no-repeat center top; + background-size: contain; + } +} diff --git a/src/main/webapp/app/home/home.component.spec.ts b/src/main/webapp/app/home/home.component.spec.ts new file mode 100644 index 0000000..7d3229c --- /dev/null +++ b/src/main/webapp/app/home/home.component.spec.ts @@ -0,0 +1,113 @@ +jest.mock('app/core/auth/account.service'); +jest.mock('@angular/router'); + +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { Router } from '@angular/router'; +import { of, Subject } from 'rxjs'; + +import { AccountService } from 'app/core/auth/account.service'; +import { Account } from 'app/core/auth/account.model'; + +import { HomeComponent } from './home.component'; + +describe('Component Tests', () => { + describe('Home Component', () => { + let comp: HomeComponent; + let fixture: ComponentFixture; + let mockAccountService: AccountService; + let mockRouter: Router; + const account: Account = { + activated: true, + authorities: [], + email: '', + firstName: null, + langKey: '', + lastName: null, + login: 'login', + imageUrl: null, + }; + + beforeEach( + waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [HomeComponent], + providers: [AccountService, Router], + }) + .overrideTemplate(HomeComponent, '') + .compileComponents(); + }) + ); + + beforeEach(() => { + fixture = TestBed.createComponent(HomeComponent); + comp = fixture.componentInstance; + mockAccountService = TestBed.inject(AccountService); + mockAccountService.identity = jest.fn(() => of(null)); + mockAccountService.getAuthenticationState = jest.fn(() => of(null)); + mockRouter = TestBed.inject(Router); + }); + + describe('ngOnInit', () => { + it('Should synchronize account variable with current account', () => { + // GIVEN + const authenticationState = new Subject(); + mockAccountService.getAuthenticationState = jest.fn(() => authenticationState.asObservable()); + + // WHEN + comp.ngOnInit(); + + // THEN + expect(comp.account).toBeNull(); + + // WHEN + authenticationState.next(account); + + // THEN + expect(comp.account).toEqual(account); + + // WHEN + authenticationState.next(null); + + // THEN + expect(comp.account).toBeNull(); + }); + }); + + describe('login', () => { + it('Should navigate to /login on login', () => { + // WHEN + comp.login(); + + // THEN + expect(mockRouter.navigate).toHaveBeenCalledWith(['/login']); + }); + }); + + describe('ngOnDestroy', () => { + it('Should destroy authentication state subscription on component destroy', () => { + // GIVEN + const authenticationState = new Subject(); + mockAccountService.getAuthenticationState = jest.fn(() => authenticationState.asObservable()); + + // WHEN + comp.ngOnInit(); + + // THEN + expect(comp.account).toBeNull(); + + // WHEN + authenticationState.next(account); + + // THEN + expect(comp.account).toEqual(account); + + // WHEN + comp.ngOnDestroy(); + authenticationState.next(null); + + // THEN + expect(comp.account).toEqual(account); + }); + }); + }); +}); diff --git a/src/main/webapp/app/home/home.component.ts b/src/main/webapp/app/home/home.component.ts new file mode 100644 index 0000000..9010227 --- /dev/null +++ b/src/main/webapp/app/home/home.component.ts @@ -0,0 +1,36 @@ +import { Component, OnInit, OnDestroy } from '@angular/core'; +import { Router } from '@angular/router'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; + +import { AccountService } from 'app/core/auth/account.service'; +import { Account } from 'app/core/auth/account.model'; + +@Component({ + selector: 'jhi-home', + templateUrl: './home.component.html', + styleUrls: ['./home.component.scss'], +}) +export class HomeComponent implements OnInit, OnDestroy { + account: Account | null = null; + + private readonly destroy$ = new Subject(); + + constructor(private accountService: AccountService, private router: Router) {} + + ngOnInit(): void { + this.accountService + .getAuthenticationState() + .pipe(takeUntil(this.destroy$)) + .subscribe(account => (this.account = account)); + } + + login(): void { + this.router.navigate(['/login']); + } + + ngOnDestroy(): void { + this.destroy$.next(); + this.destroy$.complete(); + } +} diff --git a/src/main/webapp/app/home/home.module.ts b/src/main/webapp/app/home/home.module.ts new file mode 100644 index 0000000..758f5c4 --- /dev/null +++ b/src/main/webapp/app/home/home.module.ts @@ -0,0 +1,12 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import { SharedModule } from 'app/shared/shared.module'; +import { HOME_ROUTE } from './home.route'; +import { HomeComponent } from './home.component'; + +@NgModule({ + imports: [SharedModule, RouterModule.forChild([HOME_ROUTE])], + declarations: [HomeComponent], +}) +export class HomeModule {} diff --git a/src/main/webapp/app/home/home.route.ts b/src/main/webapp/app/home/home.route.ts new file mode 100644 index 0000000..213002d --- /dev/null +++ b/src/main/webapp/app/home/home.route.ts @@ -0,0 +1,11 @@ +import { Route } from '@angular/router'; + +import { HomeComponent } from './home.component'; + +export const HOME_ROUTE: Route = { + path: '', + component: HomeComponent, + data: { + pageTitle: 'home.title', + }, +}; diff --git a/src/main/webapp/app/layouts/error/error.component.html b/src/main/webapp/app/layouts/error/error.component.html new file mode 100644 index 0000000..570dd10 --- /dev/null +++ b/src/main/webapp/app/layouts/error/error.component.html @@ -0,0 +1,15 @@ +
+
+
+ +
+ +
+

Error Page!

+ +
+
{{ errorMessage }}
+
+
+
+
diff --git a/src/main/webapp/app/layouts/error/error.component.ts b/src/main/webapp/app/layouts/error/error.component.ts new file mode 100644 index 0000000..86ba978 --- /dev/null +++ b/src/main/webapp/app/layouts/error/error.component.ts @@ -0,0 +1,41 @@ +import { Component, OnInit, OnDestroy } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { Subscription } from 'rxjs'; +import { TranslateService } from '@ngx-translate/core'; + +@Component({ + selector: 'jhi-error', + templateUrl: './error.component.html', +}) +export class ErrorComponent implements OnInit, OnDestroy { + errorMessage?: string; + errorKey?: string; + langChangeSubscription?: Subscription; + + constructor(private translateService: TranslateService, private route: ActivatedRoute) {} + + ngOnInit(): void { + this.route.data.subscribe(routeData => { + if (routeData.errorMessage) { + this.errorKey = routeData.errorMessage; + this.getErrorMessageTranslation(); + this.langChangeSubscription = this.translateService.onLangChange.subscribe(() => this.getErrorMessageTranslation()); + } + }); + } + + ngOnDestroy(): void { + if (this.langChangeSubscription) { + this.langChangeSubscription.unsubscribe(); + } + } + + private getErrorMessageTranslation(): void { + this.errorMessage = ''; + if (this.errorKey) { + this.translateService.get(this.errorKey).subscribe(translatedErrorMessage => { + this.errorMessage = translatedErrorMessage; + }); + } + } +} diff --git a/src/main/webapp/app/layouts/error/error.route.ts b/src/main/webapp/app/layouts/error/error.route.ts new file mode 100644 index 0000000..a857401 --- /dev/null +++ b/src/main/webapp/app/layouts/error/error.route.ts @@ -0,0 +1,33 @@ +import { Routes } from '@angular/router'; + +import { ErrorComponent } from './error.component'; + +export const errorRoute: Routes = [ + { + path: 'error', + component: ErrorComponent, + data: { + pageTitle: 'error.title', + }, + }, + { + path: 'accessdenied', + component: ErrorComponent, + data: { + pageTitle: 'error.title', + errorMessage: 'error.http.403', + }, + }, + { + path: '404', + component: ErrorComponent, + data: { + pageTitle: 'error.title', + errorMessage: 'error.http.404', + }, + }, + { + path: '**', + redirectTo: '/404', + }, +]; diff --git a/src/main/webapp/app/layouts/footer/footer.component.html b/src/main/webapp/app/layouts/footer/footer.component.html new file mode 100644 index 0000000..30aca31 --- /dev/null +++ b/src/main/webapp/app/layouts/footer/footer.component.html @@ -0,0 +1,3 @@ + diff --git a/src/main/webapp/app/layouts/footer/footer.component.ts b/src/main/webapp/app/layouts/footer/footer.component.ts new file mode 100644 index 0000000..7c640ec --- /dev/null +++ b/src/main/webapp/app/layouts/footer/footer.component.ts @@ -0,0 +1,7 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'jhi-footer', + templateUrl: './footer.component.html', +}) +export class FooterComponent {} diff --git a/src/main/webapp/app/layouts/main/main.component.html b/src/main/webapp/app/layouts/main/main.component.html new file mode 100644 index 0000000..3ac9be9 --- /dev/null +++ b/src/main/webapp/app/layouts/main/main.component.html @@ -0,0 +1,13 @@ + + +
+ +
+ +
+
+ +
+ + +
diff --git a/src/main/webapp/app/layouts/main/main.component.spec.ts b/src/main/webapp/app/layouts/main/main.component.spec.ts new file mode 100644 index 0000000..3c086c6 --- /dev/null +++ b/src/main/webapp/app/layouts/main/main.component.spec.ts @@ -0,0 +1,200 @@ +jest.mock('app/core/auth/account.service'); + +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { Router, RouterEvent, NavigationEnd, NavigationStart } from '@angular/router'; +import { Title } from '@angular/platform-browser'; +import { Subject, of } from 'rxjs'; +import { TranslateModule, TranslateService, LangChangeEvent } from '@ngx-translate/core'; + +import { AccountService } from 'app/core/auth/account.service'; + +import { MainComponent } from './main.component'; + +describe('Component Tests', () => { + describe('MainComponent', () => { + let comp: MainComponent; + let fixture: ComponentFixture; + let titleService: Title; + let translateService: TranslateService; + let mockAccountService: AccountService; + const routerEventsSubject = new Subject(); + const routerState: any = { snapshot: { root: { data: {} } } }; + class MockRouter { + events = routerEventsSubject; + routerState = routerState; + } + + beforeEach( + waitForAsync(() => { + TestBed.configureTestingModule({ + imports: [TranslateModule.forRoot()], + declarations: [MainComponent], + providers: [ + Title, + AccountService, + { + provide: Router, + useClass: MockRouter, + }, + ], + }) + .overrideTemplate(MainComponent, '') + .compileComponents(); + }) + ); + + beforeEach(() => { + fixture = TestBed.createComponent(MainComponent); + comp = fixture.componentInstance; + titleService = TestBed.inject(Title); + translateService = TestBed.inject(TranslateService); + mockAccountService = TestBed.inject(AccountService); + mockAccountService.identity = jest.fn(() => of(null)); + mockAccountService.getAuthenticationState = jest.fn(() => of(null)); + }); + + describe('page title', () => { + const defaultPageTitle = 'global.title'; + const parentRoutePageTitle = 'parentTitle'; + const childRoutePageTitle = 'childTitle'; + const navigationEnd = new NavigationEnd(1, '', ''); + const navigationStart = new NavigationStart(1, ''); + const langChangeEvent: LangChangeEvent = { lang: 'es', translations: null }; + + beforeEach(() => { + routerState.snapshot.root = { data: {} }; + jest.spyOn(translateService, 'get').mockImplementation((key: string | string[]) => of(`${key as string} translated`)); + translateService.currentLang = 'es'; + jest.spyOn(titleService, 'setTitle'); + comp.ngOnInit(); + }); + + describe('navigation end', () => { + it('should set page title to default title if pageTitle is missing on routes', () => { + // WHEN + routerEventsSubject.next(navigationEnd); + + // THEN + expect(translateService.get).toHaveBeenCalledWith(defaultPageTitle); + expect(titleService.setTitle).toHaveBeenCalledWith(defaultPageTitle + ' translated'); + }); + + it('should set page title to root route pageTitle if there is no child routes', () => { + // GIVEN + routerState.snapshot.root.data = { pageTitle: parentRoutePageTitle }; + + // WHEN + routerEventsSubject.next(navigationEnd); + + // THEN + expect(translateService.get).toHaveBeenCalledWith(parentRoutePageTitle); + expect(titleService.setTitle).toHaveBeenCalledWith(parentRoutePageTitle + ' translated'); + }); + + it('should set page title to child route pageTitle if child routes exist and pageTitle is set for child route', () => { + // GIVEN + routerState.snapshot.root.data = { pageTitle: parentRoutePageTitle }; + routerState.snapshot.root.firstChild = { data: { pageTitle: childRoutePageTitle } }; + + // WHEN + routerEventsSubject.next(navigationEnd); + + // THEN + expect(translateService.get).toHaveBeenCalledWith(childRoutePageTitle); + expect(titleService.setTitle).toHaveBeenCalledWith(childRoutePageTitle + ' translated'); + }); + + it('should set page title to parent route pageTitle if child routes exists but pageTitle is not set for child route data', () => { + // GIVEN + routerState.snapshot.root.data = { pageTitle: parentRoutePageTitle }; + routerState.snapshot.root.firstChild = { data: {} }; + + // WHEN + routerEventsSubject.next(navigationEnd); + + // THEN + expect(translateService.get).toHaveBeenCalledWith(parentRoutePageTitle); + expect(titleService.setTitle).toHaveBeenCalledWith(parentRoutePageTitle + ' translated'); + }); + }); + + describe('navigation start', () => { + it('should not set page title on navigation start', () => { + // WHEN + routerEventsSubject.next(navigationStart); + + // THEN + expect(titleService.setTitle).not.toHaveBeenCalled(); + }); + }); + + describe('language change', () => { + it('should set page title to default title if pageTitle is missing on routes', () => { + // WHEN + translateService.onLangChange.emit(langChangeEvent); + + // THEN + expect(translateService.get).toHaveBeenCalledWith(defaultPageTitle); + expect(titleService.setTitle).toHaveBeenCalledWith(defaultPageTitle + ' translated'); + }); + + it('should set page title to root route pageTitle if there is no child routes', () => { + // GIVEN + routerState.snapshot.root.data = { pageTitle: parentRoutePageTitle }; + + // WHEN + translateService.onLangChange.emit(langChangeEvent); + + // THEN + expect(translateService.get).toHaveBeenCalledWith(parentRoutePageTitle); + expect(titleService.setTitle).toHaveBeenCalledWith(parentRoutePageTitle + ' translated'); + }); + + it('should set page title to child route pageTitle if child routes exist and pageTitle is set for child route', () => { + // GIVEN + routerState.snapshot.root.data = { pageTitle: parentRoutePageTitle }; + routerState.snapshot.root.firstChild = { data: { pageTitle: childRoutePageTitle } }; + + // WHEN + translateService.onLangChange.emit(langChangeEvent); + + // THEN + expect(translateService.get).toHaveBeenCalledWith(childRoutePageTitle); + expect(titleService.setTitle).toHaveBeenCalledWith(childRoutePageTitle + ' translated'); + }); + + it('should set page title to parent route pageTitle if child routes exists but pageTitle is not set for child route data', () => { + // GIVEN + routerState.snapshot.root.data = { pageTitle: parentRoutePageTitle }; + routerState.snapshot.root.firstChild = { data: {} }; + + // WHEN + translateService.onLangChange.emit(langChangeEvent); + + // THEN + expect(translateService.get).toHaveBeenCalledWith(parentRoutePageTitle); + expect(titleService.setTitle).toHaveBeenCalledWith(parentRoutePageTitle + ' translated'); + }); + }); + }); + + describe('page language attribute', () => { + it('should change page language attribute on language change', () => { + // GIVEN + comp.ngOnInit(); + + // WHEN + translateService.onLangChange.emit({ lang: 'lang1', translations: null }); + + // THEN + expect(document.querySelector('html')?.getAttribute('lang')).toEqual('lang1'); + + // WHEN + translateService.onLangChange.emit({ lang: 'lang2', translations: null }); + + // THEN + expect(document.querySelector('html')?.getAttribute('lang')).toEqual('lang2'); + }); + }); + }); +}); diff --git a/src/main/webapp/app/layouts/main/main.component.ts b/src/main/webapp/app/layouts/main/main.component.ts new file mode 100644 index 0000000..714687f --- /dev/null +++ b/src/main/webapp/app/layouts/main/main.component.ts @@ -0,0 +1,58 @@ +import { Component, OnInit, RendererFactory2, Renderer2 } from '@angular/core'; +import { Title } from '@angular/platform-browser'; +import { Router, ActivatedRouteSnapshot, NavigationEnd } from '@angular/router'; +import { TranslateService, LangChangeEvent } from '@ngx-translate/core'; +import * as dayjs from 'dayjs'; + +import { AccountService } from 'app/core/auth/account.service'; + +@Component({ + selector: 'jhi-main', + templateUrl: './main.component.html', +}) +export class MainComponent implements OnInit { + private renderer: Renderer2; + + constructor( + private accountService: AccountService, + private titleService: Title, + private router: Router, + private translateService: TranslateService, + rootRenderer: RendererFactory2 + ) { + this.renderer = rootRenderer.createRenderer(document.querySelector('html'), null); + } + + ngOnInit(): void { + // try to log in automatically + this.accountService.identity().subscribe(); + + this.router.events.subscribe(event => { + if (event instanceof NavigationEnd) { + this.updateTitle(); + } + }); + + this.translateService.onLangChange.subscribe((langChangeEvent: LangChangeEvent) => { + this.updateTitle(); + dayjs.locale(langChangeEvent.lang); + this.renderer.setAttribute(document.querySelector('html'), 'lang', langChangeEvent.lang); + }); + } + + private getPageTitle(routeSnapshot: ActivatedRouteSnapshot): string { + let title: string = routeSnapshot.data['pageTitle'] ?? ''; + if (routeSnapshot.firstChild) { + title = this.getPageTitle(routeSnapshot.firstChild) || title; + } + return title; + } + + private updateTitle(): void { + let pageTitle = this.getPageTitle(this.router.routerState.snapshot.root); + if (!pageTitle) { + pageTitle = 'global.title'; + } + this.translateService.get(pageTitle).subscribe(title => this.titleService.setTitle(title)); + } +} diff --git a/src/main/webapp/app/layouts/navbar/active-menu.directive.ts b/src/main/webapp/app/layouts/navbar/active-menu.directive.ts new file mode 100644 index 0000000..6150841 --- /dev/null +++ b/src/main/webapp/app/layouts/navbar/active-menu.directive.ts @@ -0,0 +1,27 @@ +import { Directive, OnInit, ElementRef, Renderer2, Input } from '@angular/core'; +import { TranslateService, LangChangeEvent } from '@ngx-translate/core'; + +@Directive({ + selector: '[jhiActiveMenu]', +}) +export class ActiveMenuDirective implements OnInit { + @Input() jhiActiveMenu?: string; + + constructor(private el: ElementRef, private renderer: Renderer2, private translateService: TranslateService) {} + + ngOnInit(): void { + this.translateService.onLangChange.subscribe((event: LangChangeEvent) => { + this.updateActiveFlag(event.lang); + }); + + this.updateActiveFlag(this.translateService.currentLang); + } + + updateActiveFlag(selectedLanguage: string): void { + if (this.jhiActiveMenu === selectedLanguage) { + this.renderer.addClass(this.el.nativeElement, 'active'); + } else { + this.renderer.removeClass(this.el.nativeElement, 'active'); + } + } +} diff --git a/src/main/webapp/app/layouts/navbar/navbar.component.html b/src/main/webapp/app/layouts/navbar/navbar.component.html new file mode 100644 index 0000000..48de3b3 --- /dev/null +++ b/src/main/webapp/app/layouts/navbar/navbar.component.html @@ -0,0 +1,352 @@ + diff --git a/src/main/webapp/app/layouts/navbar/navbar.component.scss b/src/main/webapp/app/layouts/navbar/navbar.component.scss new file mode 100644 index 0000000..1ff209b --- /dev/null +++ b/src/main/webapp/app/layouts/navbar/navbar.component.scss @@ -0,0 +1,42 @@ +@import '~bootstrap/scss/functions'; +@import '~bootstrap/scss/variables'; + +/* ========================================================================== +Navbar +========================================================================== */ + +.navbar-version { + font-size: 0.65em; + color: $navbar-dark-color; +} + +.profile-image { + height: 1.75em; + width: 1.75em; +} + +.navbar { + padding: 0.2rem 1rem; + + ul.navbar-nav { + .nav-item { + margin-left: 0.5em; + } + } + + a.nav-link { + font-weight: 400; + } +} + +/* ========================================================================== +Logo styles +========================================================================== */ +.logo-img { + height: 45px; + width: 45px; + display: inline-block; + vertical-align: middle; + background: url('../../../content/images/logo-jhipster.png') no-repeat center center; + background-size: contain; +} diff --git a/src/main/webapp/app/layouts/navbar/navbar.component.spec.ts b/src/main/webapp/app/layouts/navbar/navbar.component.spec.ts new file mode 100644 index 0000000..3e2ec36 --- /dev/null +++ b/src/main/webapp/app/layouts/navbar/navbar.component.spec.ts @@ -0,0 +1,103 @@ +jest.mock('@angular/router'); +jest.mock('app/login/login.service'); + +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { Router } from '@angular/router'; +import { of } from 'rxjs'; +import { NgxWebstorageModule } from 'ngx-webstorage'; +import { TranslateModule } from '@ngx-translate/core'; + +import { ProfileInfo } from 'app/layouts/profiles/profile-info.model'; +import { Account } from 'app/core/auth/account.model'; +import { AccountService } from 'app/core/auth/account.service'; +import { ProfileService } from 'app/layouts/profiles/profile.service'; +import { LoginService } from 'app/login/login.service'; + +import { NavbarComponent } from './navbar.component'; + +describe('Component Tests', () => { + describe('Navbar Component', () => { + let comp: NavbarComponent; + let fixture: ComponentFixture; + let accountService: AccountService; + let profileService: ProfileService; + const account: Account = { + activated: true, + authorities: [], + email: '', + firstName: 'John', + langKey: '', + lastName: 'Doe', + login: 'john.doe', + imageUrl: '', + }; + + beforeEach( + waitForAsync(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule, NgxWebstorageModule.forRoot(), TranslateModule.forRoot()], + declarations: [NavbarComponent], + providers: [Router, LoginService], + }) + .overrideTemplate(NavbarComponent, '') + .compileComponents(); + }) + ); + + beforeEach(() => { + fixture = TestBed.createComponent(NavbarComponent); + comp = fixture.componentInstance; + accountService = TestBed.inject(AccountService); + profileService = TestBed.inject(ProfileService); + }); + + it('Should call profileService.getProfileInfo on init', () => { + // GIVEN + jest.spyOn(profileService, 'getProfileInfo').mockReturnValue(of(new ProfileInfo())); + + // WHEN + comp.ngOnInit(); + + // THEN + expect(profileService.getProfileInfo).toHaveBeenCalled(); + }); + + it('Should hold current authenticated user in variable account', () => { + // WHEN + comp.ngOnInit(); + + // THEN + expect(comp.account).toBeNull(); + + // WHEN + accountService.authenticate(account); + + // THEN + expect(comp.account).toEqual(account); + + // WHEN + accountService.authenticate(null); + + // THEN + expect(comp.account).toBeNull(); + }); + + it('Should hold current authenticated user in variable account if user is authenticated before page load', () => { + // GIVEN + accountService.authenticate(account); + + // WHEN + comp.ngOnInit(); + + // THEN + expect(comp.account).toEqual(account); + + // WHEN + accountService.authenticate(null); + + // THEN + expect(comp.account).toBeNull(); + }); + }); +}); diff --git a/src/main/webapp/app/layouts/navbar/navbar.component.ts b/src/main/webapp/app/layouts/navbar/navbar.component.ts new file mode 100644 index 0000000..e3e6494 --- /dev/null +++ b/src/main/webapp/app/layouts/navbar/navbar.component.ts @@ -0,0 +1,69 @@ +import { Component, OnInit } from '@angular/core'; +import { Router } from '@angular/router'; +import { TranslateService } from '@ngx-translate/core'; +import { SessionStorageService } from 'ngx-webstorage'; + +import { VERSION } from 'app/app.constants'; +import { LANGUAGES } from 'app/config/language.constants'; +import { Account } from 'app/core/auth/account.model'; +import { AccountService } from 'app/core/auth/account.service'; +import { LoginService } from 'app/login/login.service'; +import { ProfileService } from 'app/layouts/profiles/profile.service'; + +@Component({ + selector: 'jhi-navbar', + templateUrl: './navbar.component.html', + styleUrls: ['./navbar.component.scss'], +}) +export class NavbarComponent implements OnInit { + inProduction?: boolean; + isNavbarCollapsed = true; + languages = LANGUAGES; + openAPIEnabled?: boolean; + version = ''; + account: Account | null = null; + + constructor( + private loginService: LoginService, + private translateService: TranslateService, + private sessionStorageService: SessionStorageService, + private accountService: AccountService, + private profileService: ProfileService, + private router: Router + ) { + if (VERSION) { + this.version = VERSION.toLowerCase().startsWith('v') ? VERSION : 'v' + VERSION; + } + } + + ngOnInit(): void { + this.profileService.getProfileInfo().subscribe(profileInfo => { + this.inProduction = profileInfo.inProduction; + this.openAPIEnabled = profileInfo.openAPIEnabled; + }); + this.accountService.getAuthenticationState().subscribe(account => (this.account = account)); + } + + changeLanguage(languageKey: string): void { + this.sessionStorageService.store('locale', languageKey); + this.translateService.use(languageKey); + } + + collapseNavbar(): void { + this.isNavbarCollapsed = true; + } + + login(): void { + this.router.navigate(['/login']); + } + + logout(): void { + this.collapseNavbar(); + this.loginService.logout(); + this.router.navigate(['']); + } + + toggleNavbar(): void { + this.isNavbarCollapsed = !this.isNavbarCollapsed; + } +} diff --git a/src/main/webapp/app/layouts/navbar/navbar.route.ts b/src/main/webapp/app/layouts/navbar/navbar.route.ts new file mode 100644 index 0000000..82c591f --- /dev/null +++ b/src/main/webapp/app/layouts/navbar/navbar.route.ts @@ -0,0 +1,9 @@ +import { Route } from '@angular/router'; + +import { NavbarComponent } from './navbar.component'; + +export const navbarRoute: Route = { + path: '', + component: NavbarComponent, + outlet: 'navbar', +}; diff --git a/src/main/webapp/app/layouts/profiles/page-ribbon.component.scss b/src/main/webapp/app/layouts/profiles/page-ribbon.component.scss new file mode 100644 index 0000000..a78f268 --- /dev/null +++ b/src/main/webapp/app/layouts/profiles/page-ribbon.component.scss @@ -0,0 +1,31 @@ +/* ========================================================================== +Developement Ribbon +========================================================================== */ +.ribbon { + background-color: rgba(170, 0, 0, 0.5); + left: -3.5em; + -moz-transform: rotate(-45deg); + -ms-transform: rotate(-45deg); + -o-transform: rotate(-45deg); + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); + overflow: hidden; + position: absolute; + top: 40px; + white-space: nowrap; + width: 15em; + z-index: 9999; + pointer-events: none; + opacity: 0.75; + a { + color: #fff; + display: block; + font-weight: 400; + margin: 1px 0; + padding: 10px 50px; + text-align: center; + text-decoration: none; + text-shadow: 0 0 5px #444; + pointer-events: none; + } +} diff --git a/src/main/webapp/app/layouts/profiles/page-ribbon.component.spec.ts b/src/main/webapp/app/layouts/profiles/page-ribbon.component.spec.ts new file mode 100644 index 0000000..bd000b8 --- /dev/null +++ b/src/main/webapp/app/layouts/profiles/page-ribbon.component.spec.ts @@ -0,0 +1,44 @@ +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { of } from 'rxjs'; + +import { ProfileInfo } from 'app/layouts/profiles/profile-info.model'; +import { ProfileService } from 'app/layouts/profiles/profile.service'; + +import { PageRibbonComponent } from './page-ribbon.component'; + +describe('Component Tests', () => { + describe('Page Ribbon Component', () => { + let comp: PageRibbonComponent; + let fixture: ComponentFixture; + let profileService: ProfileService; + + beforeEach( + waitForAsync(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + declarations: [PageRibbonComponent], + }) + .overrideTemplate(PageRibbonComponent, '') + .compileComponents(); + }) + ); + + beforeEach(() => { + fixture = TestBed.createComponent(PageRibbonComponent); + comp = fixture.componentInstance; + profileService = TestBed.inject(ProfileService); + }); + + it('Should call profileService.getProfileInfo on init', () => { + // GIVEN + jest.spyOn(profileService, 'getProfileInfo').mockReturnValue(of(new ProfileInfo())); + + // WHEN + comp.ngOnInit(); + + // THEN + expect(profileService.getProfileInfo).toHaveBeenCalled(); + }); + }); +}); diff --git a/src/main/webapp/app/layouts/profiles/page-ribbon.component.ts b/src/main/webapp/app/layouts/profiles/page-ribbon.component.ts new file mode 100644 index 0000000..24b87b5 --- /dev/null +++ b/src/main/webapp/app/layouts/profiles/page-ribbon.component.ts @@ -0,0 +1,24 @@ +import { Component, OnInit } from '@angular/core'; +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; + +import { ProfileService } from './profile.service'; + +@Component({ + selector: 'jhi-page-ribbon', + template: ` + + `, + styleUrls: ['./page-ribbon.component.scss'], +}) +export class PageRibbonComponent implements OnInit { + ribbonEnv$?: Observable; + + constructor(private profileService: ProfileService) {} + + ngOnInit(): void { + this.ribbonEnv$ = this.profileService.getProfileInfo().pipe(map(profileInfo => profileInfo.ribbonEnv)); + } +} diff --git a/src/main/webapp/app/layouts/profiles/profile-info.model.ts b/src/main/webapp/app/layouts/profiles/profile-info.model.ts new file mode 100644 index 0000000..8c769c7 --- /dev/null +++ b/src/main/webapp/app/layouts/profiles/profile-info.model.ts @@ -0,0 +1,15 @@ +export interface InfoResponse { + 'display-ribbon-on-profiles'?: string; + git?: any; + build?: any; + activeProfiles?: string[]; +} + +export class ProfileInfo { + constructor( + public activeProfiles?: string[], + public ribbonEnv?: string, + public inProduction?: boolean, + public openAPIEnabled?: boolean + ) {} +} diff --git a/src/main/webapp/app/layouts/profiles/profile.service.ts b/src/main/webapp/app/layouts/profiles/profile.service.ts new file mode 100644 index 0000000..b379d3c --- /dev/null +++ b/src/main/webapp/app/layouts/profiles/profile.service.ts @@ -0,0 +1,41 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { map, shareReplay } from 'rxjs/operators'; +import { Observable } from 'rxjs'; + +import { ApplicationConfigService } from 'app/core/config/application-config.service'; +import { ProfileInfo, InfoResponse } from './profile-info.model'; + +@Injectable({ providedIn: 'root' }) +export class ProfileService { + private infoUrl = this.applicationConfigService.getEndpointFor('management/info'); + private profileInfo$?: Observable; + + constructor(private http: HttpClient, private applicationConfigService: ApplicationConfigService) {} + + getProfileInfo(): Observable { + if (this.profileInfo$) { + return this.profileInfo$; + } + + this.profileInfo$ = this.http.get(this.infoUrl).pipe( + map((response: InfoResponse) => { + const profileInfo: ProfileInfo = { + activeProfiles: response.activeProfiles, + inProduction: response.activeProfiles?.includes('prod'), + openAPIEnabled: response.activeProfiles?.includes('api-docs'), + }; + if (response.activeProfiles && response['display-ribbon-on-profiles']) { + const displayRibbonOnProfiles = response['display-ribbon-on-profiles'].split(','); + const ribbonProfiles = displayRibbonOnProfiles.filter(profile => response.activeProfiles?.includes(profile)); + if (ribbonProfiles.length > 0) { + profileInfo.ribbonEnv = ribbonProfiles[0]; + } + } + return profileInfo; + }), + shareReplay() + ); + return this.profileInfo$; + } +} diff --git a/src/main/webapp/app/login/login.component.html b/src/main/webapp/app/login/login.component.html new file mode 100644 index 0000000..ff21a81 --- /dev/null +++ b/src/main/webapp/app/login/login.component.html @@ -0,0 +1,57 @@ +
+
+
+

Sign in

+
+ Failed to sign in! Please check your credentials and try again. +
+
+
+ + +
+ +
+ + +
+ +
+ +
+ + +
+ + +
+ You don't have an account yet? + Register a new account +
+
+
+
diff --git a/src/main/webapp/app/login/login.component.spec.ts b/src/main/webapp/app/login/login.component.spec.ts new file mode 100644 index 0000000..9631606 --- /dev/null +++ b/src/main/webapp/app/login/login.component.spec.ts @@ -0,0 +1,156 @@ +jest.mock('@angular/router'); +jest.mock('app/core/auth/account.service'); +jest.mock('app/login/login.service'); + +import { ElementRef } from '@angular/core'; +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { FormBuilder } from '@angular/forms'; +import { Router, Navigation } from '@angular/router'; +import { of, throwError } from 'rxjs'; + +import { AccountService } from 'app/core/auth/account.service'; + +import { LoginService } from './login.service'; +import { LoginComponent } from './login.component'; + +describe('Component Tests', () => { + describe('LoginComponent', () => { + let comp: LoginComponent; + let fixture: ComponentFixture; + let mockRouter: Router; + let mockAccountService: AccountService; + let mockLoginService: LoginService; + + beforeEach( + waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [LoginComponent], + providers: [ + FormBuilder, + AccountService, + Router, + { + provide: LoginService, + useValue: { + login: jest.fn(() => of({})), + }, + }, + ], + }) + .overrideTemplate(LoginComponent, '') + .compileComponents(); + }) + ); + + beforeEach(() => { + fixture = TestBed.createComponent(LoginComponent); + comp = fixture.componentInstance; + mockRouter = TestBed.inject(Router); + mockLoginService = TestBed.inject(LoginService); + mockAccountService = TestBed.inject(AccountService); + }); + + describe('ngOnInit', () => { + it('Should call accountService.identity on Init', () => { + // GIVEN + mockAccountService.identity = jest.fn(() => of(null)); + mockAccountService.getAuthenticationState = jest.fn(() => of(null)); + + // WHEN + comp.ngOnInit(); + + // THEN + expect(mockAccountService.identity).toHaveBeenCalled(); + }); + + it('Should call accountService.isAuthenticated on Init', () => { + // GIVEN + mockAccountService.identity = jest.fn(() => of(null)); + + // WHEN + comp.ngOnInit(); + + // THEN + expect(mockAccountService.isAuthenticated).toHaveBeenCalled(); + }); + + it('should navigate to home page on Init if authenticated=true', () => { + // GIVEN + mockAccountService.identity = jest.fn(() => of(null)); + mockAccountService.getAuthenticationState = jest.fn(() => of(null)); + mockAccountService.isAuthenticated = () => true; + + // WHEN + comp.ngOnInit(); + + // THEN + expect(mockRouter.navigate).toHaveBeenCalledWith(['']); + }); + }); + + describe('ngAfterViewInit', () => { + it('shoult set focus to username input after the view has been initialized', () => { + // GIVEN + const node = { + focus: jest.fn(), + }; + comp.username = new ElementRef(node); + + // WHEN + comp.ngAfterViewInit(); + + // THEN + expect(node.focus).toHaveBeenCalled(); + }); + }); + + describe('login', () => { + it('should authenticate the user and navigate to home page', () => { + // GIVEN + const credentials = { + username: 'admin', + password: 'admin', + rememberMe: true, + }; + + comp.loginForm.patchValue({ + username: 'admin', + password: 'admin', + rememberMe: true, + }); + + // WHEN + comp.login(); + + // THEN + expect(comp.authenticationError).toEqual(false); + expect(mockLoginService.login).toHaveBeenCalledWith(credentials); + expect(mockRouter.navigate).toHaveBeenCalledWith(['']); + }); + + it('should authenticate the user but not navigate to home page if authentication process is already routing to cached url from localstorage', () => { + // GIVEN + jest.spyOn(mockRouter, 'getCurrentNavigation').mockReturnValue({} as Navigation); + + // WHEN + comp.login(); + + // THEN + expect(comp.authenticationError).toEqual(false); + expect(mockRouter.navigate).not.toHaveBeenCalled(); + }); + + it('should stay on login form and show error message on login error', () => { + // GIVEN + mockLoginService.login = jest.fn(() => throwError({})); + + // WHEN + comp.login(); + + // THEN + expect(comp.authenticationError).toEqual(true); + expect(mockRouter.navigate).not.toHaveBeenCalled(); + }); + }); + }); +}); diff --git a/src/main/webapp/app/login/login.component.ts b/src/main/webapp/app/login/login.component.ts new file mode 100644 index 0000000..cab77b2 --- /dev/null +++ b/src/main/webapp/app/login/login.component.ts @@ -0,0 +1,62 @@ +import { Component, ViewChild, OnInit, AfterViewInit, ElementRef } from '@angular/core'; +import { FormBuilder, Validators } from '@angular/forms'; +import { Router } from '@angular/router'; + +import { LoginService } from 'app/login/login.service'; +import { AccountService } from 'app/core/auth/account.service'; + +@Component({ + selector: 'jhi-login', + templateUrl: './login.component.html', +}) +export class LoginComponent implements OnInit, AfterViewInit { + @ViewChild('username', { static: false }) + username!: ElementRef; + + authenticationError = false; + + loginForm = this.fb.group({ + username: [null, [Validators.required]], + password: [null, [Validators.required]], + rememberMe: [false], + }); + + constructor( + private accountService: AccountService, + private loginService: LoginService, + private router: Router, + private fb: FormBuilder + ) {} + + ngOnInit(): void { + // if already authenticated then navigate to home page + this.accountService.identity().subscribe(() => { + if (this.accountService.isAuthenticated()) { + this.router.navigate(['']); + } + }); + } + + ngAfterViewInit(): void { + this.username.nativeElement.focus(); + } + + login(): void { + this.loginService + .login({ + username: this.loginForm.get('username')!.value, + password: this.loginForm.get('password')!.value, + rememberMe: this.loginForm.get('rememberMe')!.value, + }) + .subscribe( + () => { + this.authenticationError = false; + if (!this.router.getCurrentNavigation()) { + // There were no routing during login (eg from navigationToStoredUrl) + this.router.navigate(['']); + } + }, + () => (this.authenticationError = true) + ); + } +} diff --git a/src/main/webapp/app/login/login.model.ts b/src/main/webapp/app/login/login.model.ts new file mode 100644 index 0000000..422fce9 --- /dev/null +++ b/src/main/webapp/app/login/login.model.ts @@ -0,0 +1,3 @@ +export class Login { + constructor(public username: string, public password: string, public rememberMe: boolean) {} +} diff --git a/src/main/webapp/app/login/login.module.ts b/src/main/webapp/app/login/login.module.ts new file mode 100644 index 0000000..6dbd185 --- /dev/null +++ b/src/main/webapp/app/login/login.module.ts @@ -0,0 +1,12 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import { SharedModule } from 'app/shared/shared.module'; +import { LOGIN_ROUTE } from './login.route'; +import { LoginComponent } from './login.component'; + +@NgModule({ + imports: [SharedModule, RouterModule.forChild([LOGIN_ROUTE])], + declarations: [LoginComponent], +}) +export class LoginModule {} diff --git a/src/main/webapp/app/login/login.route.ts b/src/main/webapp/app/login/login.route.ts new file mode 100644 index 0000000..002cc9d --- /dev/null +++ b/src/main/webapp/app/login/login.route.ts @@ -0,0 +1,11 @@ +import { Route } from '@angular/router'; + +import { LoginComponent } from './login.component'; + +export const LOGIN_ROUTE: Route = { + path: '', + component: LoginComponent, + data: { + pageTitle: 'login.title', + }, +}; diff --git a/src/main/webapp/app/login/login.service.ts b/src/main/webapp/app/login/login.service.ts new file mode 100644 index 0000000..bc97be6 --- /dev/null +++ b/src/main/webapp/app/login/login.service.ts @@ -0,0 +1,21 @@ +import { Injectable } from '@angular/core'; +import { Observable } from 'rxjs'; +import { mergeMap } from 'rxjs/operators'; + +import { Account } from 'app/core/auth/account.model'; +import { AccountService } from 'app/core/auth/account.service'; +import { AuthServerProvider } from 'app/core/auth/auth-jwt.service'; +import { Login } from './login.model'; + +@Injectable({ providedIn: 'root' }) +export class LoginService { + constructor(private accountService: AccountService, private authServerProvider: AuthServerProvider) {} + + login(credentials: Login): Observable { + return this.authServerProvider.login(credentials).pipe(mergeMap(() => this.accountService.identity(true))); + } + + logout(): void { + this.authServerProvider.logout().subscribe({ complete: () => this.accountService.authenticate(null) }); + } +} diff --git a/src/main/webapp/app/shared/alert/alert-error.component.html b/src/main/webapp/app/shared/alert/alert-error.component.html new file mode 100644 index 0000000..76ff881 --- /dev/null +++ b/src/main/webapp/app/shared/alert/alert-error.component.html @@ -0,0 +1,7 @@ + diff --git a/src/main/webapp/app/shared/alert/alert-error.component.spec.ts b/src/main/webapp/app/shared/alert/alert-error.component.spec.ts new file mode 100644 index 0000000..6c1db89 --- /dev/null +++ b/src/main/webapp/app/shared/alert/alert-error.component.spec.ts @@ -0,0 +1,164 @@ +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { HttpErrorResponse, HttpHeaders } from '@angular/common/http'; +import { TranslateModule } from '@ngx-translate/core'; + +import { EventManager } from 'app/core/util/event-manager.service'; +import { Alert, AlertService } from 'app/core/util/alert.service'; + +import { AlertErrorComponent } from './alert-error.component'; + +describe('Component Tests', () => { + describe('Alert Error Component', () => { + let comp: AlertErrorComponent; + let fixture: ComponentFixture; + let eventManager: EventManager; + let alertService: AlertService; + + beforeEach( + waitForAsync(() => { + TestBed.configureTestingModule({ + imports: [TranslateModule.forRoot()], + declarations: [AlertErrorComponent], + providers: [EventManager, AlertService], + }) + .overrideTemplate(AlertErrorComponent, '') + .compileComponents(); + }) + ); + + beforeEach(() => { + fixture = TestBed.createComponent(AlertErrorComponent); + comp = fixture.componentInstance; + eventManager = TestBed.inject(EventManager); + alertService = TestBed.inject(AlertService); + alertService.addAlert = (alert: Alert, alerts?: Alert[]) => { + if (alerts) { + alerts.push(alert); + } + return alert; + }; + }); + + describe('Error Handling', () => { + it('Should display an alert on status 0', () => { + // GIVEN + eventManager.broadcast({ name: 'dataSurveyApp.httpError', content: { status: 0 } }); + // THEN + expect(comp.alerts.length).toBe(1); + expect(comp.alerts[0].translationKey).toBe('error.server.not.reachable'); + }); + + it('Should display an alert on status 404', () => { + // GIVEN + eventManager.broadcast({ name: 'dataSurveyApp.httpError', content: { status: 404 } }); + // THEN + expect(comp.alerts.length).toBe(1); + expect(comp.alerts[0].translationKey).toBe('error.url.not.found'); + }); + + it('Should display an alert on generic error', () => { + // GIVEN + eventManager.broadcast({ name: 'dataSurveyApp.httpError', content: { error: { message: 'Error Message' } } }); + eventManager.broadcast({ name: 'dataSurveyApp.httpError', content: { error: 'Second Error Message' } }); + // THEN + expect(comp.alerts.length).toBe(2); + expect(comp.alerts[0].translationKey).toBe('Error Message'); + expect(comp.alerts[1].translationKey).toBe('Second Error Message'); + }); + + it('Should display an alert on status 400 for generic error', () => { + // GIVEN + const response = new HttpErrorResponse({ + url: 'http://localhost:8080/api/foos', + headers: new HttpHeaders(), + status: 400, + statusText: 'Bad Request', + error: { + type: 'https://www.jhipster.tech/problem/constraint-violation', + title: 'Bad Request', + status: 400, + path: '/api/foos', + message: 'error.validation', + }, + }); + eventManager.broadcast({ name: 'dataSurveyApp.httpError', content: response }); + // THEN + expect(comp.alerts.length).toBe(1); + expect(comp.alerts[0].translationKey).toBe('error.validation'); + }); + + it('Should display an alert on status 400 for generic error without message', () => { + // GIVEN + const response = new HttpErrorResponse({ + url: 'http://localhost:8080/api/foos', + headers: new HttpHeaders(), + status: 400, + error: 'Bad Request', + }); + eventManager.broadcast({ name: 'dataSurveyApp.httpError', content: response }); + // THEN + expect(comp.alerts.length).toBe(1); + expect(comp.alerts[0].translationKey).toBe('Bad Request'); + }); + + it('Should display an alert on status 400 for invalid parameters', () => { + // GIVEN + const response = new HttpErrorResponse({ + url: 'http://localhost:8080/api/foos', + headers: new HttpHeaders(), + status: 400, + statusText: 'Bad Request', + error: { + type: 'https://www.jhipster.tech/problem/constraint-violation', + title: 'Method argument not valid', + status: 400, + path: '/api/foos', + message: 'error.validation', + fieldErrors: [{ objectName: 'foo', field: 'minField', message: 'Min' }], + }, + }); + eventManager.broadcast({ name: 'dataSurveyApp.httpError', content: response }); + // THEN + expect(comp.alerts.length).toBe(1); + expect(comp.alerts[0].translationKey).toBe('error.Size'); + }); + + it('Should display an alert on status 400 for error headers', () => { + // GIVEN + const response = new HttpErrorResponse({ + url: 'http://localhost:8080/api/foos', + headers: new HttpHeaders().append('app-error', 'Error Message').append('app-params', 'foo'), + status: 400, + statusText: 'Bad Request', + error: { + status: 400, + message: 'error.validation', + }, + }); + eventManager.broadcast({ name: 'dataSurveyApp.httpError', content: response }); + // THEN + expect(comp.alerts.length).toBe(1); + expect(comp.alerts[0].translationKey).toBe('Error Message'); + }); + + it('Should display an alert on status 500 with detail', () => { + // GIVEN + const response = new HttpErrorResponse({ + url: 'http://localhost:8080/api/foos', + headers: new HttpHeaders(), + status: 500, + statusText: 'Internal server error', + error: { + status: 500, + message: 'error.http.500', + detail: 'Detailed error message', + }, + }); + eventManager.broadcast({ name: 'dataSurveyApp.httpError', content: response }); + // THEN + expect(comp.alerts.length).toBe(1); + expect(comp.alerts[0].translationKey).toBe('error.http.500'); + }); + }); + }); +}); diff --git a/src/main/webapp/app/shared/alert/alert-error.component.ts b/src/main/webapp/app/shared/alert/alert-error.component.ts new file mode 100644 index 0000000..722b19f --- /dev/null +++ b/src/main/webapp/app/shared/alert/alert-error.component.ts @@ -0,0 +1,108 @@ +import { Component, OnDestroy } from '@angular/core'; +import { HttpErrorResponse } from '@angular/common/http'; +import { Subscription } from 'rxjs'; +import { TranslateService } from '@ngx-translate/core'; + +import { AlertError } from './alert-error.model'; +import { Alert, AlertService } from 'app/core/util/alert.service'; +import { EventManager, EventWithContent } from 'app/core/util/event-manager.service'; + +@Component({ + selector: 'jhi-alert-error', + templateUrl: './alert-error.component.html', +}) +export class AlertErrorComponent implements OnDestroy { + alerts: Alert[] = []; + errorListener: Subscription; + httpErrorListener: Subscription; + + constructor(private alertService: AlertService, private eventManager: EventManager, translateService: TranslateService) { + this.errorListener = eventManager.subscribe('dataSurveyApp.error', (response: EventWithContent | string) => { + const errorResponse = (response as EventWithContent).content; + this.addErrorAlert(errorResponse.message, errorResponse.key, errorResponse.params); + }); + + this.httpErrorListener = eventManager.subscribe('dataSurveyApp.httpError', (response: EventWithContent | string) => { + const httpErrorResponse = (response as EventWithContent).content; + switch (httpErrorResponse.status) { + // connection refused, server not reachable + case 0: + this.addErrorAlert('Server not reachable', 'error.server.not.reachable'); + break; + + case 400: { + const arr = httpErrorResponse.headers.keys(); + let errorHeader: string | null = null; + let entityKey: string | null = null; + for (const entry of arr) { + if (entry.toLowerCase().endsWith('app-error')) { + errorHeader = httpErrorResponse.headers.get(entry); + } else if (entry.toLowerCase().endsWith('app-params')) { + entityKey = httpErrorResponse.headers.get(entry); + } + } + if (errorHeader) { + const alertData = entityKey ? { entityName: translateService.instant(`global.menu.entities.${entityKey}`) } : undefined; + this.addErrorAlert(errorHeader, errorHeader, alertData); + } else if (httpErrorResponse.error !== '' && httpErrorResponse.error.fieldErrors) { + const fieldErrors = httpErrorResponse.error.fieldErrors; + for (const fieldError of fieldErrors) { + if (['Min', 'Max', 'DecimalMin', 'DecimalMax'].includes(fieldError.message)) { + fieldError.message = 'Size'; + } + // convert 'something[14].other[4].id' to 'something[].other[].id' so translations can be written to it + const convertedField: string = fieldError.field.replace(/\[\d*\]/g, '[]'); + const fieldName: string = translateService.instant(`dataSurveyApp.${fieldError.objectName as string}.${convertedField}`); + this.addErrorAlert(`Error on field "${fieldName}"`, `error.${fieldError.message as string}`, { fieldName }); + } + } else if (httpErrorResponse.error !== '' && httpErrorResponse.error.message) { + this.addErrorAlert( + httpErrorResponse.error.detail ?? httpErrorResponse.error.message, + httpErrorResponse.error.message, + httpErrorResponse.error.params + ); + } else { + this.addErrorAlert(httpErrorResponse.error, httpErrorResponse.error); + } + break; + } + + case 404: + this.addErrorAlert('Not found', 'error.url.not.found'); + break; + + default: + if (httpErrorResponse.error !== '' && httpErrorResponse.error.message) { + this.addErrorAlert( + httpErrorResponse.error.detail ?? httpErrorResponse.error.message, + httpErrorResponse.error.message, + httpErrorResponse.error.params + ); + } else { + this.addErrorAlert(httpErrorResponse.error, httpErrorResponse.error); + } + } + }); + } + + setClasses(alert: Alert): { [key: string]: boolean } { + const classes = { 'jhi-toast': Boolean(alert.toast) }; + if (alert.position) { + return { ...classes, [alert.position]: true }; + } + return classes; + } + + ngOnDestroy(): void { + this.eventManager.destroy(this.errorListener); + this.eventManager.destroy(this.httpErrorListener); + } + + close(alert: Alert): void { + alert.close?.(this.alerts); + } + + private addErrorAlert(message?: string, translationKey?: string, translationParams?: { [key: string]: unknown }): void { + this.alertService.addAlert({ type: 'danger', message, translationKey, translationParams }, this.alerts); + } +} diff --git a/src/main/webapp/app/shared/alert/alert-error.model.ts b/src/main/webapp/app/shared/alert/alert-error.model.ts new file mode 100644 index 0000000..4fca767 --- /dev/null +++ b/src/main/webapp/app/shared/alert/alert-error.model.ts @@ -0,0 +1,3 @@ +export class AlertError { + constructor(public message: string, public key?: string, public params?: { [key: string]: unknown }) {} +} diff --git a/src/main/webapp/app/shared/alert/alert.component.html b/src/main/webapp/app/shared/alert/alert.component.html new file mode 100644 index 0000000..76ff881 --- /dev/null +++ b/src/main/webapp/app/shared/alert/alert.component.html @@ -0,0 +1,7 @@ + diff --git a/src/main/webapp/app/shared/alert/alert.component.spec.ts b/src/main/webapp/app/shared/alert/alert.component.spec.ts new file mode 100644 index 0000000..345c0b3 --- /dev/null +++ b/src/main/webapp/app/shared/alert/alert.component.spec.ts @@ -0,0 +1,48 @@ +jest.mock('app/core/util/alert.service'); + +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; + +import { AlertService } from 'app/core/util/alert.service'; + +import { AlertComponent } from './alert.component'; + +describe('Component Tests', () => { + describe('Alert Component', () => { + let comp: AlertComponent; + let fixture: ComponentFixture; + let mockAlertService: AlertService; + + beforeEach( + waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [AlertComponent], + providers: [AlertService], + }) + .overrideTemplate(AlertComponent, '') + .compileComponents(); + }) + ); + + beforeEach(() => { + fixture = TestBed.createComponent(AlertComponent); + comp = fixture.componentInstance; + mockAlertService = TestBed.inject(AlertService); + }); + + it('Should call alertService.get on init', () => { + // WHEN + comp.ngOnInit(); + + // THEN + expect(mockAlertService.get).toHaveBeenCalled(); + }); + + it('Should call alertService.clear on destroy', () => { + // WHEN + comp.ngOnDestroy(); + + // THEN + expect(mockAlertService.clear).toHaveBeenCalled(); + }); + }); +}); diff --git a/src/main/webapp/app/shared/alert/alert.component.ts b/src/main/webapp/app/shared/alert/alert.component.ts new file mode 100644 index 0000000..2f8461c --- /dev/null +++ b/src/main/webapp/app/shared/alert/alert.component.ts @@ -0,0 +1,33 @@ +import { Component, OnDestroy, OnInit } from '@angular/core'; + +import { AlertService, Alert } from 'app/core/util/alert.service'; + +@Component({ + selector: 'jhi-alert', + templateUrl: './alert.component.html', +}) +export class AlertComponent implements OnInit, OnDestroy { + alerts: Alert[] = []; + + constructor(private alertService: AlertService) {} + + ngOnInit(): void { + this.alerts = this.alertService.get(); + } + + setClasses(alert: Alert): { [key: string]: boolean } { + const classes = { 'jhi-toast': Boolean(alert.toast) }; + if (alert.position) { + return { ...classes, [alert.position]: true }; + } + return classes; + } + + ngOnDestroy(): void { + this.alertService.clear(); + } + + close(alert: Alert): void { + alert.close?.(this.alerts); + } +} diff --git a/src/main/webapp/app/shared/auth/has-any-authority.directive.spec.ts b/src/main/webapp/app/shared/auth/has-any-authority.directive.spec.ts new file mode 100644 index 0000000..f509973 --- /dev/null +++ b/src/main/webapp/app/shared/auth/has-any-authority.directive.spec.ts @@ -0,0 +1,132 @@ +jest.mock('app/core/auth/account.service'); + +import { Component, ElementRef, ViewChild } from '@angular/core'; +import { TestBed, waitForAsync } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { Subject } from 'rxjs'; + +import { AccountService } from 'app/core/auth/account.service'; +import { Account } from 'app/core/auth/account.model'; + +import { HasAnyAuthorityDirective } from './has-any-authority.directive'; + +@Component({ + template: `
`, +}) +class TestHasAnyAuthorityDirectiveComponent { + @ViewChild('content', { static: false }) + content?: ElementRef; +} + +describe('HasAnyAuthorityDirective tests', () => { + let mockAccountService: AccountService; + const authenticationState = new Subject(); + + beforeEach( + waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [HasAnyAuthorityDirective, TestHasAnyAuthorityDirectiveComponent], + providers: [AccountService], + }); + }) + ); + + beforeEach(() => { + mockAccountService = TestBed.inject(AccountService); + mockAccountService.getAuthenticationState = jest.fn(() => authenticationState.asObservable()); + }); + + describe('set jhiHasAnyAuthority', () => { + it('should show restricted content to user if user has required role', () => { + // GIVEN + mockAccountService.hasAnyAuthority = jest.fn(() => true); + const fixture = TestBed.createComponent(TestHasAnyAuthorityDirectiveComponent); + const comp = fixture.componentInstance; + + // WHEN + fixture.detectChanges(); + + // THEN + expect(comp.content).toBeDefined(); + }); + + it('should not show restricted content to user if user has not required role', () => { + // GIVEN + mockAccountService.hasAnyAuthority = jest.fn(() => false); + const fixture = TestBed.createComponent(TestHasAnyAuthorityDirectiveComponent); + const comp = fixture.componentInstance; + + // WHEN + fixture.detectChanges(); + + // THEN + expect(comp.content).toBeUndefined(); + }); + }); + + describe('change authorities', () => { + it('should show or not show restricted content correctly if user authorities are changing', () => { + // GIVEN + mockAccountService.hasAnyAuthority = jest.fn(() => true); + const fixture = TestBed.createComponent(TestHasAnyAuthorityDirectiveComponent); + const comp = fixture.componentInstance; + + // WHEN + fixture.detectChanges(); + + // THEN + expect(comp.content).toBeDefined(); + + // GIVEN + mockAccountService.hasAnyAuthority = jest.fn(() => false); + + // WHEN + authenticationState.next(); + fixture.detectChanges(); + + // THEN + expect(comp.content).toBeUndefined(); + + // GIVEN + mockAccountService.hasAnyAuthority = jest.fn(() => true); + + // WHEN + authenticationState.next(); + fixture.detectChanges(); + + // THEN + expect(comp.content).toBeDefined(); + }); + }); + + describe('ngOnDestroy', () => { + it('should destroy authentication state subscription on component destroy', () => { + // GIVEN + mockAccountService.hasAnyAuthority = jest.fn(() => true); + const fixture = TestBed.createComponent(TestHasAnyAuthorityDirectiveComponent); + const div = fixture.debugElement.queryAllNodes(By.directive(HasAnyAuthorityDirective))[0]; + const hasAnyAuthorityDirective = div.injector.get(HasAnyAuthorityDirective); + + // WHEN + fixture.detectChanges(); + + // THEN + expect(mockAccountService.hasAnyAuthority).toHaveBeenCalled(); + + // WHEN + jest.clearAllMocks(); + authenticationState.next(); + + // THEN + expect(mockAccountService.hasAnyAuthority).toHaveBeenCalled(); + + // WHEN + jest.clearAllMocks(); + hasAnyAuthorityDirective.ngOnDestroy(); + authenticationState.next(); + + // THEN + expect(mockAccountService.hasAnyAuthority).not.toHaveBeenCalled(); + }); + }); +}); diff --git a/src/main/webapp/app/shared/auth/has-any-authority.directive.ts b/src/main/webapp/app/shared/auth/has-any-authority.directive.ts new file mode 100644 index 0000000..1e47438 --- /dev/null +++ b/src/main/webapp/app/shared/auth/has-any-authority.directive.ts @@ -0,0 +1,53 @@ +import { Directive, Input, TemplateRef, ViewContainerRef, OnDestroy } from '@angular/core'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; + +import { AccountService } from 'app/core/auth/account.service'; + +/** + * @whatItDoes Conditionally includes an HTML element if current user has any + * of the authorities passed as the `expression`. + * + * @howToUse + * ``` + * ... + * + * ... + * ``` + */ +@Directive({ + selector: '[jhiHasAnyAuthority]', +}) +export class HasAnyAuthorityDirective implements OnDestroy { + private authorities!: string | string[]; + + private readonly destroy$ = new Subject(); + + constructor(private accountService: AccountService, private templateRef: TemplateRef, private viewContainerRef: ViewContainerRef) {} + + @Input() + set jhiHasAnyAuthority(value: string | string[]) { + this.authorities = value; + this.updateView(); + // Get notified each time authentication state changes. + this.accountService + .getAuthenticationState() + .pipe(takeUntil(this.destroy$)) + .subscribe(() => { + this.updateView(); + }); + } + + ngOnDestroy(): void { + this.destroy$.next(); + this.destroy$.complete(); + } + + private updateView(): void { + const hasAnyAuthority = this.accountService.hasAnyAuthority(this.authorities); + this.viewContainerRef.clear(); + if (hasAnyAuthority) { + this.viewContainerRef.createEmbeddedView(this.templateRef); + } + } +} diff --git a/src/main/webapp/app/shared/date/duration.pipe.ts b/src/main/webapp/app/shared/date/duration.pipe.ts new file mode 100644 index 0000000..791b30b --- /dev/null +++ b/src/main/webapp/app/shared/date/duration.pipe.ts @@ -0,0 +1,15 @@ +import { Pipe, PipeTransform } from '@angular/core'; + +import * as dayjs from 'dayjs'; + +@Pipe({ + name: 'duration', +}) +export class DurationPipe implements PipeTransform { + transform(value: any): string { + if (value) { + return dayjs.duration(value).humanize(); + } + return ''; + } +} diff --git a/src/main/webapp/app/shared/date/format-medium-date.pipe.spec.ts b/src/main/webapp/app/shared/date/format-medium-date.pipe.spec.ts new file mode 100644 index 0000000..3ff3b9d --- /dev/null +++ b/src/main/webapp/app/shared/date/format-medium-date.pipe.spec.ts @@ -0,0 +1,19 @@ +import * as dayjs from 'dayjs'; + +import { FormatMediumDatePipe } from './format-medium-date.pipe'; + +describe('FormatMediumDatePipe', () => { + const formatMediumDatePipe = new FormatMediumDatePipe(); + + it('should return an empty string when receive undefined', () => { + expect(formatMediumDatePipe.transform(undefined)).toBe(''); + }); + + it('should return an empty string when receive null', () => { + expect(formatMediumDatePipe.transform(null)).toBe(''); + }); + + it('should format date like this D MMM YYYY', () => { + expect(formatMediumDatePipe.transform(dayjs('2020-11-16').locale('fr'))).toBe('16 Nov 2020'); + }); +}); diff --git a/src/main/webapp/app/shared/date/format-medium-date.pipe.ts b/src/main/webapp/app/shared/date/format-medium-date.pipe.ts new file mode 100644 index 0000000..c384108 --- /dev/null +++ b/src/main/webapp/app/shared/date/format-medium-date.pipe.ts @@ -0,0 +1,12 @@ +import { Pipe, PipeTransform } from '@angular/core'; + +import * as dayjs from 'dayjs'; + +@Pipe({ + name: 'formatMediumDate', +}) +export class FormatMediumDatePipe implements PipeTransform { + transform(day: dayjs.Dayjs | null | undefined): string { + return day ? day.format('D MMM YYYY') : ''; + } +} diff --git a/src/main/webapp/app/shared/date/format-medium-datetime.pipe.spec.ts b/src/main/webapp/app/shared/date/format-medium-datetime.pipe.spec.ts new file mode 100644 index 0000000..017c03c --- /dev/null +++ b/src/main/webapp/app/shared/date/format-medium-datetime.pipe.spec.ts @@ -0,0 +1,19 @@ +import * as dayjs from 'dayjs'; + +import { FormatMediumDatetimePipe } from './format-medium-datetime.pipe'; + +describe('FormatMediumDatePipe', () => { + const formatMediumDatetimePipe = new FormatMediumDatetimePipe(); + + it('should return an empty string when receive undefined', () => { + expect(formatMediumDatetimePipe.transform(undefined)).toBe(''); + }); + + it('should return an empty string when receive null', () => { + expect(formatMediumDatetimePipe.transform(null)).toBe(''); + }); + + it('should format date like this D MMM YYYY', () => { + expect(formatMediumDatetimePipe.transform(dayjs('2020-11-16').locale('fr'))).toBe('16 Nov 2020 00:00:00'); + }); +}); diff --git a/src/main/webapp/app/shared/date/format-medium-datetime.pipe.ts b/src/main/webapp/app/shared/date/format-medium-datetime.pipe.ts new file mode 100644 index 0000000..2a5954c --- /dev/null +++ b/src/main/webapp/app/shared/date/format-medium-datetime.pipe.ts @@ -0,0 +1,12 @@ +import { Pipe, PipeTransform } from '@angular/core'; + +import * as dayjs from 'dayjs'; + +@Pipe({ + name: 'formatMediumDatetime', +}) +export class FormatMediumDatetimePipe implements PipeTransform { + transform(day: dayjs.Dayjs | null | undefined): string { + return day ? day.format('D MMM YYYY HH:mm:ss') : ''; + } +} diff --git a/src/main/webapp/app/shared/language/find-language-from-key.pipe.ts b/src/main/webapp/app/shared/language/find-language-from-key.pipe.ts new file mode 100644 index 0000000..c003ecf --- /dev/null +++ b/src/main/webapp/app/shared/language/find-language-from-key.pipe.ts @@ -0,0 +1,13 @@ +import { Pipe, PipeTransform } from '@angular/core'; + +@Pipe({ name: 'findLanguageFromKey' }) +export class FindLanguageFromKeyPipe implements PipeTransform { + private languages: { [key: string]: { name: string; rtl?: boolean } } = { + es: { name: 'EspaƱol' }, + // jhipster-needle-i18n-language-key-pipe - JHipster will add/remove languages in this object + }; + + transform(lang: string): string { + return this.languages[lang].name; + } +} diff --git a/src/main/webapp/app/shared/language/translate.directive.spec.ts b/src/main/webapp/app/shared/language/translate.directive.spec.ts new file mode 100644 index 0000000..d64b6e7 --- /dev/null +++ b/src/main/webapp/app/shared/language/translate.directive.spec.ts @@ -0,0 +1,37 @@ +import { Component } from '@angular/core'; +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { TranslateModule, TranslateService } from '@ngx-translate/core'; + +import { TranslateDirective } from './translate.directive'; + +@Component({ + template: `
`, +}) +class TestTranslateDirectiveComponent {} + +describe('TranslateDirective Tests', () => { + let fixture: ComponentFixture; + let translateService: TranslateService; + + beforeEach( + waitForAsync(() => { + TestBed.configureTestingModule({ + imports: [TranslateModule.forRoot()], + declarations: [TranslateDirective, TestTranslateDirectiveComponent], + }); + }) + ); + + beforeEach(() => { + translateService = TestBed.inject(TranslateService); + fixture = TestBed.createComponent(TestTranslateDirectiveComponent); + }); + + it('should change HTML', () => { + const spy = jest.spyOn(translateService, 'get'); + + fixture.detectChanges(); + + expect(spy).toHaveBeenCalled(); + }); +}); diff --git a/src/main/webapp/app/shared/language/translate.directive.ts b/src/main/webapp/app/shared/language/translate.directive.ts new file mode 100644 index 0000000..15d5dff --- /dev/null +++ b/src/main/webapp/app/shared/language/translate.directive.ts @@ -0,0 +1,51 @@ +import { Input, Directive, ElementRef, OnChanges, OnInit, OnDestroy } from '@angular/core'; +import { TranslateService } from '@ngx-translate/core'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; + +import { translationNotFoundMessage } from 'app/config/translation.config'; + +/** + * A wrapper directive on top of the translate pipe as the inbuilt translate directive from ngx-translate is too verbose and buggy + */ +@Directive({ + selector: '[jhiTranslate]', +}) +export class TranslateDirective implements OnChanges, OnInit, OnDestroy { + @Input() jhiTranslate!: string; + @Input() translateValues?: { [key: string]: unknown }; + + private readonly directiveDestroyed = new Subject(); + + constructor(private el: ElementRef, private translateService: TranslateService) {} + + ngOnInit(): void { + this.translateService.onLangChange.pipe(takeUntil(this.directiveDestroyed)).subscribe(() => { + this.getTranslation(); + }); + this.translateService.onTranslationChange.pipe(takeUntil(this.directiveDestroyed)).subscribe(() => { + this.getTranslation(); + }); + } + + ngOnChanges(): void { + this.getTranslation(); + } + + ngOnDestroy(): void { + this.directiveDestroyed.next(); + this.directiveDestroyed.complete(); + } + + private getTranslation(): void { + this.translateService + .get(this.jhiTranslate, this.translateValues) + .pipe(takeUntil(this.directiveDestroyed)) + .subscribe( + value => { + this.el.nativeElement.innerHTML = value; + }, + () => `${translationNotFoundMessage}[${this.jhiTranslate}]` + ); + } +} diff --git a/src/main/webapp/app/shared/pagination/item-count.component.spec.ts b/src/main/webapp/app/shared/pagination/item-count.component.spec.ts new file mode 100644 index 0000000..c44ede1 --- /dev/null +++ b/src/main/webapp/app/shared/pagination/item-count.component.spec.ts @@ -0,0 +1,70 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { TranslateModule } from '@ngx-translate/core'; + +import { TranslateDirective } from 'app/shared/language/translate.directive'; + +import { ItemCountComponent } from './item-count.component'; + +describe('ItemCountComponent test', () => { + let comp: ItemCountComponent; + let fixture: ComponentFixture; + + beforeEach( + waitForAsync(() => { + TestBed.configureTestingModule({ + imports: [TranslateModule.forRoot()], + declarations: [ItemCountComponent, TranslateDirective], + }).compileComponents(); + }) + ); + + beforeEach(() => { + fixture = TestBed.createComponent(ItemCountComponent); + comp = fixture.componentInstance; + }); + + describe('UI logic tests', () => { + it('should initialize with undefined', () => { + expect(comp.first).toBeUndefined(); + expect(comp.second).toBeUndefined(); + expect(comp.total).toBeUndefined(); + }); + + it('should set calculated numbers to undefined if the page value is not yet defined', () => { + // GIVEN + comp.params = { page: undefined, totalItems: 0, itemsPerPage: 10 }; + + // THEN + expect(comp.first).toBeUndefined(); + expect(comp.second).toBeUndefined(); + }); + + it('should change the content on page change', () => { + // GIVEN + comp.params = { page: 1, totalItems: 100, itemsPerPage: 10 }; + + // THEN + expect(comp.first).toBe(1); + expect(comp.second).toBe(10); + expect(comp.total).toBe(100); + + // GIVEN + comp.params = { page: 2, totalItems: 100, itemsPerPage: 10 }; + + // THEN + expect(comp.first).toBe(11); + expect(comp.second).toBe(20); + expect(comp.total).toBe(100); + }); + + it('should set the second number to totalItems if this is the last page which contains less than itemsPerPage items', () => { + // GIVEN + comp.params = { page: 2, totalItems: 16, itemsPerPage: 10 }; + + // THEN + expect(comp.first).toBe(11); + expect(comp.second).toBe(16); + expect(comp.total).toBe(16); + }); + }); +}); diff --git a/src/main/webapp/app/shared/pagination/item-count.component.ts b/src/main/webapp/app/shared/pagination/item-count.component.ts new file mode 100644 index 0000000..ca05ebb --- /dev/null +++ b/src/main/webapp/app/shared/pagination/item-count.component.ts @@ -0,0 +1,31 @@ +import { Component, Input } from '@angular/core'; + +/** + * A component that will take care of item count statistics of a pagination. + */ +@Component({ + selector: 'jhi-item-count', + template: `
`, +}) +export class ItemCountComponent { + /** + * @param params Contains parameters for component: + * page Current page number + * totalItems Total number of items + * itemsPerPage Number of items per page + */ + @Input() set params(params: { page?: number; totalItems?: number; itemsPerPage?: number }) { + if (params.page && params.totalItems !== undefined && params.itemsPerPage) { + this.first = (params.page - 1) * params.itemsPerPage + 1; + this.second = params.page * params.itemsPerPage < params.totalItems ? params.page * params.itemsPerPage : params.totalItems; + } else { + this.first = undefined; + this.second = undefined; + } + this.total = params.totalItems; + } + + first?: number; + second?: number; + total?: number; +} diff --git a/src/main/webapp/app/shared/shared-libs.module.ts b/src/main/webapp/app/shared/shared-libs.module.ts new file mode 100644 index 0000000..368647c --- /dev/null +++ b/src/main/webapp/app/shared/shared-libs.module.ts @@ -0,0 +1,12 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; +import { InfiniteScrollModule } from 'ngx-infinite-scroll'; +import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; +import { TranslateModule } from '@ngx-translate/core'; + +@NgModule({ + exports: [FormsModule, CommonModule, NgbModule, InfiniteScrollModule, FontAwesomeModule, ReactiveFormsModule, TranslateModule], +}) +export class SharedLibsModule {} diff --git a/src/main/webapp/app/shared/shared.module.ts b/src/main/webapp/app/shared/shared.module.ts new file mode 100644 index 0000000..2262892 --- /dev/null +++ b/src/main/webapp/app/shared/shared.module.ts @@ -0,0 +1,46 @@ +import { NgModule } from '@angular/core'; + +import { SharedLibsModule } from './shared-libs.module'; +import { FindLanguageFromKeyPipe } from './language/find-language-from-key.pipe'; +import { TranslateDirective } from './language/translate.directive'; +import { AlertComponent } from './alert/alert.component'; +import { AlertErrorComponent } from './alert/alert-error.component'; +import { HasAnyAuthorityDirective } from './auth/has-any-authority.directive'; +import { DurationPipe } from './date/duration.pipe'; +import { FormatMediumDatetimePipe } from './date/format-medium-datetime.pipe'; +import { FormatMediumDatePipe } from './date/format-medium-date.pipe'; +import { SortByDirective } from './sort/sort-by.directive'; +import { SortDirective } from './sort/sort.directive'; +import { ItemCountComponent } from './pagination/item-count.component'; + +@NgModule({ + imports: [SharedLibsModule], + declarations: [ + FindLanguageFromKeyPipe, + TranslateDirective, + AlertComponent, + AlertErrorComponent, + HasAnyAuthorityDirective, + DurationPipe, + FormatMediumDatetimePipe, + FormatMediumDatePipe, + SortByDirective, + SortDirective, + ItemCountComponent, + ], + exports: [ + SharedLibsModule, + FindLanguageFromKeyPipe, + TranslateDirective, + AlertComponent, + AlertErrorComponent, + HasAnyAuthorityDirective, + DurationPipe, + FormatMediumDatetimePipe, + FormatMediumDatePipe, + SortByDirective, + SortDirective, + ItemCountComponent, + ], +}) +export class SharedModule {} diff --git a/src/main/webapp/app/shared/sort/sort-by.directive.spec.ts b/src/main/webapp/app/shared/sort/sort-by.directive.spec.ts new file mode 100644 index 0000000..153f913 --- /dev/null +++ b/src/main/webapp/app/shared/sort/sort-by.directive.spec.ts @@ -0,0 +1,152 @@ +import { Component, DebugElement } from '@angular/core'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { FaIconComponent, FaIconLibrary } from '@fortawesome/angular-fontawesome'; +import { fas, faSort, faSortDown, faSortUp } from '@fortawesome/free-solid-svg-icons'; + +import { SortByDirective } from './sort-by.directive'; +import { SortDirective } from './sort.directive'; + +@Component({ + template: ` + + + + + + +
ID
+ `, +}) +class TestSortByDirectiveComponent { + predicate?: string; + ascending?: boolean; + transition = jest.fn(); + + constructor(library: FaIconLibrary) { + library.addIconPacks(fas); + library.addIcons(faSort, faSortDown, faSortUp); + } +} + +describe('Directive: SortByDirective', () => { + let component: TestSortByDirectiveComponent; + let fixture: ComponentFixture; + let tableHead: DebugElement; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [TestSortByDirectiveComponent, SortDirective, SortByDirective, FaIconComponent], + }); + fixture = TestBed.createComponent(TestSortByDirectiveComponent); + component = fixture.componentInstance; + tableHead = fixture.debugElement.query(By.directive(SortByDirective)); + }); + + it('should initialize predicate, order, icon when initial component predicate is _score', () => { + // GIVEN + component.predicate = '_score'; + const sortByDirective = tableHead.injector.get(SortByDirective); + + // WHEN + fixture.detectChanges(); + + // THEN + expect(sortByDirective.jhiSortBy).toEqual('name'); + expect(component.predicate).toEqual('_score'); + expect(sortByDirective.iconComponent?.icon).toEqual('sort'); + expect(component.transition).toHaveBeenCalledTimes(0); + }); + + it('should initialize predicate, order, icon when initial component predicate differs from column predicate', () => { + // GIVEN + component.predicate = 'id'; + const sortByDirective = tableHead.injector.get(SortByDirective); + + // WHEN + fixture.detectChanges(); + + // THEN + expect(sortByDirective.jhiSortBy).toEqual('name'); + expect(component.predicate).toEqual('id'); + expect(sortByDirective.iconComponent?.icon).toEqual('sort'); + expect(component.transition).toHaveBeenCalledTimes(0); + }); + + it('should initialize predicate, order, icon when initial component predicate is same as column predicate', () => { + // GIVEN + component.predicate = 'name'; + component.ascending = true; + const sortByDirective = tableHead.injector.get(SortByDirective); + + // WHEN + fixture.detectChanges(); + + // THEN + expect(sortByDirective.jhiSortBy).toEqual('name'); + expect(component.predicate).toEqual('name'); + expect(component.ascending).toEqual(true); + expect(sortByDirective.iconComponent?.icon).toEqual(faSortUp.iconName); + expect(component.transition).toHaveBeenCalledTimes(0); + }); + + it('should initialize predicate, order, icon when initial component predicate is _score and user clicks on column header', () => { + // GIVEN + component.predicate = '_score'; + component.ascending = true; + const sortByDirective = tableHead.injector.get(SortByDirective); + + // WHEN + fixture.detectChanges(); + tableHead.triggerEventHandler('click', null); + fixture.detectChanges(); + + // THEN + expect(sortByDirective.jhiSortBy).toEqual('name'); + expect(component.predicate).toEqual('_score'); + expect(component.ascending).toEqual(true); + expect(sortByDirective.iconComponent?.icon).toEqual('sort'); + expect(component.transition).toHaveBeenCalledTimes(0); + }); + + it('should update component predicate, order, icon when user clicks on column header', () => { + // GIVEN + component.predicate = 'name'; + component.ascending = true; + const sortByDirective = tableHead.injector.get(SortByDirective); + + // WHEN + fixture.detectChanges(); + tableHead.triggerEventHandler('click', null); + fixture.detectChanges(); + + // THEN + expect(component.predicate).toEqual('name'); + expect(component.ascending).toEqual(false); + expect(sortByDirective.iconComponent?.icon).toEqual(faSortDown.iconName); + expect(component.transition).toHaveBeenCalledTimes(1); + }); + + it('should update component predicate, order, icon when user double clicks on column header', () => { + // GIVEN + component.predicate = 'name'; + component.ascending = true; + const sortByDirective = tableHead.injector.get(SortByDirective); + + // WHEN + fixture.detectChanges(); + + // WHEN + tableHead.triggerEventHandler('click', null); + fixture.detectChanges(); + + tableHead.triggerEventHandler('click', null); + fixture.detectChanges(); + + // THEN + expect(component.predicate).toEqual('name'); + expect(component.ascending).toEqual(true); + expect(sortByDirective.iconComponent?.icon).toEqual(faSortUp.iconName); + expect(component.transition).toHaveBeenCalledTimes(2); + }); +}); diff --git a/src/main/webapp/app/shared/sort/sort-by.directive.ts b/src/main/webapp/app/shared/sort/sort-by.directive.ts new file mode 100644 index 0000000..573875f --- /dev/null +++ b/src/main/webapp/app/shared/sort/sort-by.directive.ts @@ -0,0 +1,53 @@ +import { AfterContentInit, ContentChild, Directive, Host, HostListener, Input, OnDestroy } from '@angular/core'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { FaIconComponent } from '@fortawesome/angular-fontawesome'; +import { faSort, faSortDown, faSortUp, IconDefinition } from '@fortawesome/free-solid-svg-icons'; + +import { SortDirective } from './sort.directive'; + +@Directive({ + selector: '[jhiSortBy]', +}) +export class SortByDirective implements AfterContentInit, OnDestroy { + @Input() jhiSortBy?: T; + + @ContentChild(FaIconComponent, { static: true }) + iconComponent?: FaIconComponent; + + sortIcon = faSort; + sortAscIcon = faSortUp; + sortDescIcon = faSortDown; + + private readonly destroy$ = new Subject(); + + constructor(@Host() private sort: SortDirective) { + sort.predicateChange.pipe(takeUntil(this.destroy$)).subscribe(() => this.updateIconDefinition()); + sort.ascendingChange.pipe(takeUntil(this.destroy$)).subscribe(() => this.updateIconDefinition()); + } + + @HostListener('click') + onClick(): void { + this.sort.sort(this.jhiSortBy); + } + + ngAfterContentInit(): void { + this.updateIconDefinition(); + } + + ngOnDestroy(): void { + this.destroy$.next(); + this.destroy$.complete(); + } + + private updateIconDefinition(): void { + if (this.iconComponent) { + let icon: IconDefinition = this.sortIcon; + if (this.sort.predicate === this.jhiSortBy) { + icon = this.sort.ascending ? this.sortAscIcon : this.sortDescIcon; + } + this.iconComponent.icon = icon.iconName; + this.iconComponent.render(); + } + } +} diff --git a/src/main/webapp/app/shared/sort/sort.directive.spec.ts b/src/main/webapp/app/shared/sort/sort.directive.spec.ts new file mode 100644 index 0000000..28d65f7 --- /dev/null +++ b/src/main/webapp/app/shared/sort/sort.directive.spec.ts @@ -0,0 +1,84 @@ +import { Component, DebugElement } from '@angular/core'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; + +import { SortDirective } from './sort.directive'; + +@Component({ + template: ` + + + + +
+ `, +}) +class TestSortDirectiveComponent { + predicate?: string; + ascending?: boolean; + transition = jest.fn(); +} + +describe('Directive: SortDirective', () => { + let component: TestSortDirectiveComponent; + let fixture: ComponentFixture; + let tableRow: DebugElement; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [TestSortDirectiveComponent, SortDirective], + }); + fixture = TestBed.createComponent(TestSortDirectiveComponent); + component = fixture.componentInstance; + tableRow = fixture.debugElement.query(By.directive(SortDirective)); + }); + + it('should update predicate, order and invoke callback function', () => { + // GIVEN + const sortDirective = tableRow.injector.get(SortDirective); + + // WHEN + fixture.detectChanges(); + sortDirective.sort('ID'); + + // THEN + expect(component.predicate).toEqual('ID'); + expect(component.ascending).toEqual(true); + expect(component.transition).toHaveBeenCalled(); + expect(component.transition).toHaveBeenCalledTimes(1); + }); + + it('should change sort order to descending when same field is sorted again', () => { + // GIVEN + const sortDirective = tableRow.injector.get(SortDirective); + + // WHEN + fixture.detectChanges(); + sortDirective.sort('ID'); + // sort again + sortDirective.sort('ID'); + + // THEN + expect(component.predicate).toEqual('ID'); + expect(component.ascending).toEqual(false); + expect(component.transition).toHaveBeenCalled(); + expect(component.transition).toHaveBeenCalledTimes(2); + }); + + it('should change sort order to ascending when different field is sorted', () => { + // GIVEN + const sortDirective = tableRow.injector.get(SortDirective); + + // WHEN + fixture.detectChanges(); + sortDirective.sort('ID'); + // sort again + sortDirective.sort('NAME'); + + // THEN + expect(component.predicate).toEqual('NAME'); + expect(component.ascending).toEqual(true); + expect(component.transition).toHaveBeenCalled(); + expect(component.transition).toHaveBeenCalledTimes(2); + }); +}); diff --git a/src/main/webapp/app/shared/sort/sort.directive.ts b/src/main/webapp/app/shared/sort/sort.directive.ts new file mode 100644 index 0000000..21a5808 --- /dev/null +++ b/src/main/webapp/app/shared/sort/sort.directive.ts @@ -0,0 +1,42 @@ +import { Directive, EventEmitter, Input, Output } from '@angular/core'; + +@Directive({ + selector: '[jhiSort]', +}) +export class SortDirective { + @Input() + get predicate(): T | undefined { + return this._predicate; + } + set predicate(predicate: T | undefined) { + this._predicate = predicate; + this.predicateChange.emit(predicate); + } + + @Input() + get ascending(): boolean | undefined { + return this._ascending; + } + set ascending(ascending: boolean | undefined) { + this._ascending = ascending; + this.ascendingChange.emit(ascending); + } + + @Input() callback?: () => void; + + @Output() predicateChange = new EventEmitter(); + @Output() ascendingChange = new EventEmitter(); + + private _predicate?: T; + private _ascending?: boolean; + + sort(field?: T): void { + if (String(this.predicate) !== '_score') { + this.ascending = field !== this.predicate ? true : !this.ascending; + this.predicate = field; + this.predicateChange.emit(field); + this.ascendingChange.emit(this.ascending); + this.callback?.(); + } + } +} diff --git a/src/main/webapp/bootstrap.ts b/src/main/webapp/bootstrap.ts new file mode 100644 index 0000000..e5038d5 --- /dev/null +++ b/src/main/webapp/bootstrap.ts @@ -0,0 +1,16 @@ +import { enableProdMode } from '@angular/core'; +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; + +import { DEBUG_INFO_ENABLED } from './app/app.constants'; +import { AppModule } from './app/app.module'; + +// disable debug data on prod profile to improve performance +if (!DEBUG_INFO_ENABLED) { + enableProdMode(); +} + +platformBrowserDynamic() + .bootstrapModule(AppModule, { preserveWhitespaces: true }) + // eslint-disable-next-line no-console + .then(() => console.log('Application started')) + .catch(err => console.error(err)); diff --git a/src/main/webapp/content/css/loading.css b/src/main/webapp/content/css/loading.css new file mode 100644 index 0000000..b2c6626 --- /dev/null +++ b/src/main/webapp/content/css/loading.css @@ -0,0 +1,152 @@ +@keyframes lds-pacman-1 { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 50% { + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); + } + 100% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } +} +@-webkit-keyframes lds-pacman-1 { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 50% { + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); + } + 100% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } +} +@keyframes lds-pacman-2 { + 0% { + -webkit-transform: rotate(180deg); + transform: rotate(180deg); + } + 50% { + -webkit-transform: rotate(225deg); + transform: rotate(225deg); + } + 100% { + -webkit-transform: rotate(180deg); + transform: rotate(180deg); + } +} +@-webkit-keyframes lds-pacman-2 { + 0% { + -webkit-transform: rotate(180deg); + transform: rotate(180deg); + } + 50% { + -webkit-transform: rotate(225deg); + transform: rotate(225deg); + } + 100% { + -webkit-transform: rotate(180deg); + transform: rotate(180deg); + } +} +@keyframes lds-pacman-3 { + 0% { + -webkit-transform: translate(190px, 0); + transform: translate(190px, 0); + opacity: 0; + } + 20% { + opacity: 1; + } + 100% { + -webkit-transform: translate(70px, 0); + transform: translate(70px, 0); + opacity: 1; + } +} +@-webkit-keyframes lds-pacman-3 { + 0% { + -webkit-transform: translate(190px, 0); + transform: translate(190px, 0); + opacity: 0; + } + 20% { + opacity: 1; + } + 100% { + -webkit-transform: translate(70px, 0); + transform: translate(70px, 0); + opacity: 1; + } +} + +.app-loading { + font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; + position: relative; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + top: 10em; +} +.app-loading p { + display: block; + font-size: 1.17em; + margin-inline-start: 0px; + margin-inline-end: 0px; + font-weight: normal; +} + +.app-loading .lds-pacman { + position: relative; + margin: auto; + width: 200px !important; + height: 200px !important; + -webkit-transform: translate(-100px, -100px) scale(1) translate(100px, 100px); + transform: translate(-100px, -100px) scale(1) translate(100px, 100px); +} +.app-loading .lds-pacman > div:nth-child(2) div { + position: absolute; + top: 40px; + left: 40px; + width: 120px; + height: 60px; + border-radius: 120px 120px 0 0; + background: #bbcedd; + -webkit-animation: lds-pacman-1 1s linear infinite; + animation: lds-pacman-1 1s linear infinite; + -webkit-transform-origin: 60px 60px; + transform-origin: 60px 60px; +} +.app-loading .lds-pacman > div:nth-child(2) div:nth-child(2) { + -webkit-animation: lds-pacman-2 1s linear infinite; + animation: lds-pacman-2 1s linear infinite; +} +.app-loading .lds-pacman > div:nth-child(1) div { + position: absolute; + top: 97px; + left: -8px; + width: 24px; + height: 10px; + background-image: url('../images/logo-jhipster.png'); + background-size: contain; + -webkit-animation: lds-pacman-3 1s linear infinite; + animation: lds-pacman-3 1.5s linear infinite; +} +.app-loading .lds-pacman > div:nth-child(1) div:nth-child(1) { + -webkit-animation-delay: -0.67s; + animation-delay: -1s; +} +.app-loading .lds-pacman > div:nth-child(1) div:nth-child(2) { + -webkit-animation-delay: -0.33s; + animation-delay: -0.5s; +} +.app-loading .lds-pacman > div:nth-child(1) div:nth-child(3) { + -webkit-animation-delay: 0s; + animation-delay: 0s; +} diff --git a/src/main/webapp/content/images/jhipster_family_member_0.svg b/src/main/webapp/content/images/jhipster_family_member_0.svg new file mode 100644 index 0000000..d6df83c --- /dev/null +++ b/src/main/webapp/content/images/jhipster_family_member_0.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/main/webapp/content/images/jhipster_family_member_0_head-192.png b/src/main/webapp/content/images/jhipster_family_member_0_head-192.png new file mode 100644 index 0000000..6d90ab3 Binary files /dev/null and b/src/main/webapp/content/images/jhipster_family_member_0_head-192.png differ diff --git a/src/main/webapp/content/images/jhipster_family_member_0_head-256.png b/src/main/webapp/content/images/jhipster_family_member_0_head-256.png new file mode 100644 index 0000000..8e99bfe Binary files /dev/null and b/src/main/webapp/content/images/jhipster_family_member_0_head-256.png differ diff --git a/src/main/webapp/content/images/jhipster_family_member_0_head-384.png b/src/main/webapp/content/images/jhipster_family_member_0_head-384.png new file mode 100644 index 0000000..c7ca460 Binary files /dev/null and b/src/main/webapp/content/images/jhipster_family_member_0_head-384.png differ diff --git a/src/main/webapp/content/images/jhipster_family_member_0_head-512.png b/src/main/webapp/content/images/jhipster_family_member_0_head-512.png new file mode 100644 index 0000000..7e0b843 Binary files /dev/null and b/src/main/webapp/content/images/jhipster_family_member_0_head-512.png differ diff --git a/src/main/webapp/content/images/jhipster_family_member_1.svg b/src/main/webapp/content/images/jhipster_family_member_1.svg new file mode 100644 index 0000000..e3a0f3d --- /dev/null +++ b/src/main/webapp/content/images/jhipster_family_member_1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/main/webapp/content/images/jhipster_family_member_1_head-192.png b/src/main/webapp/content/images/jhipster_family_member_1_head-192.png new file mode 100644 index 0000000..ac5f2a0 Binary files /dev/null and b/src/main/webapp/content/images/jhipster_family_member_1_head-192.png differ diff --git a/src/main/webapp/content/images/jhipster_family_member_1_head-256.png b/src/main/webapp/content/images/jhipster_family_member_1_head-256.png new file mode 100644 index 0000000..443822e Binary files /dev/null and b/src/main/webapp/content/images/jhipster_family_member_1_head-256.png differ diff --git a/src/main/webapp/content/images/jhipster_family_member_1_head-384.png b/src/main/webapp/content/images/jhipster_family_member_1_head-384.png new file mode 100644 index 0000000..4a5e9fe Binary files /dev/null and b/src/main/webapp/content/images/jhipster_family_member_1_head-384.png differ diff --git a/src/main/webapp/content/images/jhipster_family_member_1_head-512.png b/src/main/webapp/content/images/jhipster_family_member_1_head-512.png new file mode 100644 index 0000000..66c625c Binary files /dev/null and b/src/main/webapp/content/images/jhipster_family_member_1_head-512.png differ diff --git a/src/main/webapp/content/images/jhipster_family_member_2.svg b/src/main/webapp/content/images/jhipster_family_member_2.svg new file mode 100644 index 0000000..51c6a5a --- /dev/null +++ b/src/main/webapp/content/images/jhipster_family_member_2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/main/webapp/content/images/jhipster_family_member_2_head-192.png b/src/main/webapp/content/images/jhipster_family_member_2_head-192.png new file mode 100644 index 0000000..24baf78 Binary files /dev/null and b/src/main/webapp/content/images/jhipster_family_member_2_head-192.png differ diff --git a/src/main/webapp/content/images/jhipster_family_member_2_head-256.png b/src/main/webapp/content/images/jhipster_family_member_2_head-256.png new file mode 100644 index 0000000..7b25f52 Binary files /dev/null and b/src/main/webapp/content/images/jhipster_family_member_2_head-256.png differ diff --git a/src/main/webapp/content/images/jhipster_family_member_2_head-384.png b/src/main/webapp/content/images/jhipster_family_member_2_head-384.png new file mode 100644 index 0000000..e89e120 Binary files /dev/null and b/src/main/webapp/content/images/jhipster_family_member_2_head-384.png differ diff --git a/src/main/webapp/content/images/jhipster_family_member_2_head-512.png b/src/main/webapp/content/images/jhipster_family_member_2_head-512.png new file mode 100644 index 0000000..3c0e6cb Binary files /dev/null and b/src/main/webapp/content/images/jhipster_family_member_2_head-512.png differ diff --git a/src/main/webapp/content/images/jhipster_family_member_3.svg b/src/main/webapp/content/images/jhipster_family_member_3.svg new file mode 100644 index 0000000..cc0d01f --- /dev/null +++ b/src/main/webapp/content/images/jhipster_family_member_3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/main/webapp/content/images/jhipster_family_member_3_head-192.png b/src/main/webapp/content/images/jhipster_family_member_3_head-192.png new file mode 100644 index 0000000..b1e4fb3 Binary files /dev/null and b/src/main/webapp/content/images/jhipster_family_member_3_head-192.png differ diff --git a/src/main/webapp/content/images/jhipster_family_member_3_head-256.png b/src/main/webapp/content/images/jhipster_family_member_3_head-256.png new file mode 100644 index 0000000..aa058c7 Binary files /dev/null and b/src/main/webapp/content/images/jhipster_family_member_3_head-256.png differ diff --git a/src/main/webapp/content/images/jhipster_family_member_3_head-384.png b/src/main/webapp/content/images/jhipster_family_member_3_head-384.png new file mode 100644 index 0000000..1d10bd5 Binary files /dev/null and b/src/main/webapp/content/images/jhipster_family_member_3_head-384.png differ diff --git a/src/main/webapp/content/images/jhipster_family_member_3_head-512.png b/src/main/webapp/content/images/jhipster_family_member_3_head-512.png new file mode 100644 index 0000000..e719f1d Binary files /dev/null and b/src/main/webapp/content/images/jhipster_family_member_3_head-512.png differ diff --git a/src/main/webapp/content/images/logo-jhipster.png b/src/main/webapp/content/images/logo-jhipster.png new file mode 100644 index 0000000..6a005bf Binary files /dev/null and b/src/main/webapp/content/images/logo-jhipster.png differ diff --git a/src/main/webapp/content/scss/_bootstrap-variables.scss b/src/main/webapp/content/scss/_bootstrap-variables.scss new file mode 100644 index 0000000..a64158a --- /dev/null +++ b/src/main/webapp/content/scss/_bootstrap-variables.scss @@ -0,0 +1,45 @@ +/* +* Bootstrap overrides https://getbootstrap.com/docs/4.0/getting-started/theming/ +* All values defined in bootstrap source +* https://github.com/twbs/bootstrap/blob/v4-dev/scss/_variables.scss can be overwritten here +* Make sure not to add !default to values here +*/ + +// Colors: +// Grayscale and brand colors for use across Bootstrap. + +$primary: #3e8acc; +$success: #28a745; +$info: #17a2b8; +$warning: #ffc107; +$danger: #dc3545; + +// Options: +// Quickly modify global styling by enabling or disabling optional features. +$enable-rounded: true; +$enable-shadows: false; +$enable-gradients: false; +$enable-transitions: true; +$enable-hover-media-query: false; +$enable-grid-classes: true; +$enable-print-styles: true; + +// Components: +// Define common padding and border radius sizes and more. + +$border-radius: 0.15rem; +$border-radius-lg: 0.125rem; +$border-radius-sm: 0.1rem; + +// Body: +// Settings for the `` element. + +$body-bg: #e4e5e6; + +// Typography: +// Font, line-height, and color for body text, headings, and more. + +$font-size-base: 1rem; + +$dropdown-link-hover-color: white; +$dropdown-link-hover-bg: #343a40; diff --git a/src/main/webapp/content/scss/global.scss b/src/main/webapp/content/scss/global.scss new file mode 100644 index 0000000..1ab90a0 --- /dev/null +++ b/src/main/webapp/content/scss/global.scss @@ -0,0 +1,202 @@ +@import 'bootstrap-variables'; +@import '~bootstrap/scss/functions'; +@import '~bootstrap/scss/variables'; + +/* ============================================================== +Bootstrap tweaks +===============================================================*/ + +body, +h1, +h2, +h3, +h4 { + font-weight: 300; +} + +/* Increase contrast of links to get 100% on Lighthouse Accessability Audit. Override this color if you want to change the link color, or use a Bootswatch theme */ +a { + color: #533f03; + font-weight: bold; +} + +a:hover { + color: #533f03; +} + +/* override hover color for dropdown-item forced by bootstrap to all a:not([href]):not([tabindex]) elements in _reboot.scss */ +a:not([href]):not([tabindex]):hover.dropdown-item { + color: $dropdown-link-hover-color; +} + +/* override .dropdown-item.active background-color on hover */ +.dropdown-item.active:hover { + background-color: mix($dropdown-link-hover-bg, $dropdown-link-active-bg, 50%); +} + +a:hover { + /* make sure browsers use the pointer cursor for anchors, even with no href */ + cursor: pointer; +} + +.dropdown-item:hover { + color: $dropdown-link-hover-color; +} + +/* ========================================================================== +Browser Upgrade Prompt +========================================================================== */ +.browserupgrade { + margin: 0.2em 0; + background: #ccc; + color: #000; + padding: 0.2em 0; +} + +/* ========================================================================== +Generic styles +========================================================================== */ + +/* Error highlight on input fields */ +.ng-valid[required], +.ng-valid.required { + border-left: 5px solid green; +} + +.ng-invalid:not(form) { + border-left: 5px solid red; +} + +/* other generic styles */ + +.jh-card { + padding: 1.5%; + margin-top: 20px; + border: none; +} + +.error { + color: white; + background-color: red; +} + +.pad { + padding: 10px; +} + +.w-40 { + width: 40% !important; +} + +.w-60 { + width: 60% !important; +} + +.break { + white-space: normal; + word-break: break-all; +} + +.readonly { + background-color: #eee; + opacity: 1; +} + +.footer { + border-top: 1px solid rgba(0, 0, 0, 0.125); +} + +.hand, +[jhisortby] { + cursor: pointer; +} + +/* ========================================================================== +Custom alerts for notification +========================================================================== */ +.alerts { + .alert { + text-overflow: ellipsis; + pre { + background: none; + border: none; + font: inherit; + color: inherit; + padding: 0; + margin: 0; + } + .popover pre { + font-size: 10px; + } + } + .jhi-toast { + position: fixed; + width: 100%; + &.left { + left: 5px; + } + &.right { + right: 5px; + } + &.top { + top: 55px; + } + &.bottom { + bottom: 55px; + } + } +} + +@media screen and (min-width: 480px) { + .alerts .jhi-toast { + width: 50%; + } +} + +/* ========================================================================== +entity detail page css +========================================================================== */ +.row-md.jh-entity-details { + display: grid; + grid-template-columns: auto 1fr; + column-gap: 10px; + line-height: 1.5; +} + +@media screen and (min-width: 768px) { + .row-md.jh-entity-details > { + dt { + float: left; + overflow: hidden; + clear: left; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; + padding: 0.5em 0; + } + dd { + border-bottom: 1px solid #eee; + padding: 0.5em 0; + margin-left: 0; + } + } +} + +/* ========================================================================== +ui bootstrap tweaks +========================================================================== */ +.nav, +.pagination, +.carousel, +.panel-title a { + cursor: pointer; +} + +.thread-dump-modal-lock { + max-width: 450px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +/* jhipster-needle-scss-add-main JHipster will add new css style */ diff --git a/src/main/webapp/content/scss/vendor.scss b/src/main/webapp/content/scss/vendor.scss new file mode 100644 index 0000000..ce1c774 --- /dev/null +++ b/src/main/webapp/content/scss/vendor.scss @@ -0,0 +1,12 @@ +/* after changing this file run 'npm run webapp:build' */ + +/*************************** +put Sass variables here: +eg $input-color: red; +****************************/ +// Override Bootstrap variables +@import 'bootstrap-variables'; +// Import Bootstrap source files from node_modules +@import '~bootstrap/scss/bootstrap'; + +/* jhipster-needle-scss-add-vendor JHipster will add new css style */ diff --git a/src/main/webapp/favicon.ico b/src/main/webapp/favicon.ico new file mode 100644 index 0000000..4179874 Binary files /dev/null and b/src/main/webapp/favicon.ico differ diff --git a/src/main/webapp/i18n/es/accesoEncuesta.json b/src/main/webapp/i18n/es/accesoEncuesta.json new file mode 100644 index 0000000..e2d1333 --- /dev/null +++ b/src/main/webapp/i18n/es/accesoEncuesta.json @@ -0,0 +1,9 @@ +{ + "dataSurveyApp": { + "AccesoEncuesta": { + "null": "", + "PUBLIC": "PUBLIC", + "PRIVATE": "PRIVATE" + } + } +} diff --git a/src/main/webapp/i18n/es/activate.json b/src/main/webapp/i18n/es/activate.json new file mode 100644 index 0000000..dc07860 --- /dev/null +++ b/src/main/webapp/i18n/es/activate.json @@ -0,0 +1,9 @@ +{ + "activate": { + "title": "ActivaciĆ³n", + "messages": { + "success": "Su cuenta ha sido activada. Por favor, ", + "error": "Su cuenta no pudo ser activada. Por favor, utilice el formulario de inscripciĆ³n para registrarse." + } + } +} diff --git a/src/main/webapp/i18n/es/categoria.json b/src/main/webapp/i18n/es/categoria.json new file mode 100644 index 0000000..c60118e --- /dev/null +++ b/src/main/webapp/i18n/es/categoria.json @@ -0,0 +1,27 @@ +{ + "dataSurveyApp": { + "categoria": { + "home": { + "title": "Categorias", + "refreshListLabel": "Refrescar lista", + "createLabel": "Crear nuevo Categoria", + "createOrEditLabel": "Crear o editar Categoria", + "notFound": "NingĆŗn Categorias encontrado" + }, + "created": "Un nuevo Categoria ha sido creado con el identificador {{ param }}", + "updated": "Un Categoria ha sido actualizado con el identificador {{ param }}", + "deleted": "Un Categoria ha sido eliminado con el identificador {{ param }}", + "delete": { + "question": "ĀæSeguro que quiere eliminar Categoria {{ id }}?" + }, + "detail": { + "title": "Categoria" + }, + "id": "ID", + "nombre": "Nombre", + "estado": "Estado", + "encuesta": "Encuesta", + "plantilla": "Plantilla" + } + } +} diff --git a/src/main/webapp/i18n/es/configuration.json b/src/main/webapp/i18n/es/configuration.json new file mode 100644 index 0000000..57d4aae --- /dev/null +++ b/src/main/webapp/i18n/es/configuration.json @@ -0,0 +1,10 @@ +{ + "configuration": { + "title": "ConfiguraciĆ³n", + "filter": "Filtro (por prefijo)", + "table": { + "prefix": "Prefijo", + "properties": "Propiedades" + } + } +} diff --git a/src/main/webapp/i18n/es/ePreguntaAbierta.json b/src/main/webapp/i18n/es/ePreguntaAbierta.json new file mode 100644 index 0000000..761bea6 --- /dev/null +++ b/src/main/webapp/i18n/es/ePreguntaAbierta.json @@ -0,0 +1,28 @@ +{ + "dataSurveyApp": { + "ePreguntaAbierta": { + "home": { + "title": "E Pregunta Abiertas", + "refreshListLabel": "Refrescar lista", + "createLabel": "Crear nuevo E Pregunta Abierta", + "createOrEditLabel": "Crear o editar E Pregunta Abierta", + "notFound": "NingĆŗn E Pregunta Abiertas encontrado" + }, + "created": "Un nuevo E Pregunta Abierta ha sido creado con el identificador {{ param }}", + "updated": "Un E Pregunta Abierta ha sido actualizado con el identificador {{ param }}", + "deleted": "Un E Pregunta Abierta ha sido eliminado con el identificador {{ param }}", + "delete": { + "question": "ĀæSeguro que quiere eliminar E Pregunta Abierta {{ id }}?" + }, + "detail": { + "title": "E Pregunta Abierta" + }, + "id": "ID", + "nombre": "Nombre", + "opcional": "Opcional", + "orden": "Orden", + "ePreguntaAbiertaRespuesta": "E Pregunta Abierta Respuesta", + "encuesta": "Encuesta" + } + } +} diff --git a/src/main/webapp/i18n/es/ePreguntaAbiertaRespuesta.json b/src/main/webapp/i18n/es/ePreguntaAbiertaRespuesta.json new file mode 100644 index 0000000..6e60365 --- /dev/null +++ b/src/main/webapp/i18n/es/ePreguntaAbiertaRespuesta.json @@ -0,0 +1,25 @@ +{ + "dataSurveyApp": { + "ePreguntaAbiertaRespuesta": { + "home": { + "title": "E Pregunta Abierta Respuestas", + "refreshListLabel": "Refrescar lista", + "createLabel": "Crear nuevo E Pregunta Abierta Respuesta", + "createOrEditLabel": "Crear o editar E Pregunta Abierta Respuesta", + "notFound": "NingĆŗn E Pregunta Abierta Respuestas encontrado" + }, + "created": "Un nuevo E Pregunta Abierta Respuesta ha sido creado con el identificador {{ param }}", + "updated": "Un E Pregunta Abierta Respuesta ha sido actualizado con el identificador {{ param }}", + "deleted": "Un E Pregunta Abierta Respuesta ha sido eliminado con el identificador {{ param }}", + "delete": { + "question": "ĀæSeguro que quiere eliminar E Pregunta Abierta Respuesta {{ id }}?" + }, + "detail": { + "title": "E Pregunta Abierta Respuesta" + }, + "id": "ID", + "respuesta": "Respuesta", + "ePreguntaAbierta": "E Pregunta Abierta" + } + } +} diff --git a/src/main/webapp/i18n/es/ePreguntaCerrada.json b/src/main/webapp/i18n/es/ePreguntaCerrada.json new file mode 100644 index 0000000..943a041 --- /dev/null +++ b/src/main/webapp/i18n/es/ePreguntaCerrada.json @@ -0,0 +1,29 @@ +{ + "dataSurveyApp": { + "ePreguntaCerrada": { + "home": { + "title": "E Pregunta Cerradas", + "refreshListLabel": "Refrescar lista", + "createLabel": "Crear nuevo E Pregunta Cerrada", + "createOrEditLabel": "Crear o editar E Pregunta Cerrada", + "notFound": "NingĆŗn E Pregunta Cerradas encontrado" + }, + "created": "Un nuevo E Pregunta Cerrada ha sido creado con el identificador {{ param }}", + "updated": "Un E Pregunta Cerrada ha sido actualizado con el identificador {{ param }}", + "deleted": "Un E Pregunta Cerrada ha sido eliminado con el identificador {{ param }}", + "delete": { + "question": "ĀæSeguro que quiere eliminar E Pregunta Cerrada {{ id }}?" + }, + "detail": { + "title": "E Pregunta Cerrada" + }, + "id": "ID", + "nombre": "Nombre", + "tipo": "Tipo", + "opcional": "Opcional", + "orden": "Orden", + "ePreguntaCerradaOpcion": "E Pregunta Cerrada Opcion", + "encuesta": "Encuesta" + } + } +} diff --git a/src/main/webapp/i18n/es/ePreguntaCerradaOpcion.json b/src/main/webapp/i18n/es/ePreguntaCerradaOpcion.json new file mode 100644 index 0000000..001feb5 --- /dev/null +++ b/src/main/webapp/i18n/es/ePreguntaCerradaOpcion.json @@ -0,0 +1,27 @@ +{ + "dataSurveyApp": { + "ePreguntaCerradaOpcion": { + "home": { + "title": "E Pregunta Cerrada Opcions", + "refreshListLabel": "Refrescar lista", + "createLabel": "Crear nuevo E Pregunta Cerrada Opcion", + "createOrEditLabel": "Crear o editar E Pregunta Cerrada Opcion", + "notFound": "NingĆŗn E Pregunta Cerrada Opcions encontrado" + }, + "created": "Un nuevo E Pregunta Cerrada Opcion ha sido creado con el identificador {{ param }}", + "updated": "Un E Pregunta Cerrada Opcion ha sido actualizado con el identificador {{ param }}", + "deleted": "Un E Pregunta Cerrada Opcion ha sido eliminado con el identificador {{ param }}", + "delete": { + "question": "ĀæSeguro que quiere eliminar E Pregunta Cerrada Opcion {{ id }}?" + }, + "detail": { + "title": "E Pregunta Cerrada Opcion" + }, + "id": "ID", + "nombre": "Nombre", + "orden": "Orden", + "cantidad": "Cantidad", + "ePreguntaCerrada": "E Pregunta Cerrada" + } + } +} diff --git a/src/main/webapp/i18n/es/encuesta.json b/src/main/webapp/i18n/es/encuesta.json new file mode 100644 index 0000000..7125183 --- /dev/null +++ b/src/main/webapp/i18n/es/encuesta.json @@ -0,0 +1,38 @@ +{ + "dataSurveyApp": { + "encuesta": { + "home": { + "title": "Encuestas", + "refreshListLabel": "Refrescar lista", + "createLabel": "Crear nuevo Encuesta", + "createOrEditLabel": "Crear o editar Encuesta", + "notFound": "NingĆŗn Encuestas encontrado" + }, + "created": "Un nuevo Encuesta ha sido creado con el identificador {{ param }}", + "updated": "Un Encuesta ha sido actualizado con el identificador {{ param }}", + "deleted": "Un Encuesta ha sido eliminado con el identificador {{ param }}", + "delete": { + "question": "ĀæSeguro que quiere eliminar Encuesta {{ id }}?" + }, + "detail": { + "title": "Encuesta" + }, + "id": "ID", + "nombre": "Nombre", + "descripcion": "Descripcion", + "fechaCreacion": "Fecha Creacion", + "fechaPublicacion": "Fecha Publicacion", + "fechaFinalizar": "Fecha Finalizar", + "fechaFinalizada": "Fecha Finalizada", + "calificacion": "Calificacion", + "acceso": "Acceso", + "contrasenna": "Contrasenna", + "estado": "Estado", + "usuarioEncuesta": "Usuario Encuesta", + "ePreguntaAbierta": "E Pregunta Abierta", + "ePreguntaCerrada": "E Pregunta Cerrada", + "categoria": "Categoria", + "usuarioExtra": "Usuario Extra" + } + } +} diff --git a/src/main/webapp/i18n/es/error.json b/src/main/webapp/i18n/es/error.json new file mode 100644 index 0000000..e5488c0 --- /dev/null +++ b/src/main/webapp/i18n/es/error.json @@ -0,0 +1,14 @@ +{ + "error": { + "title": "Ā”PĆ”gina de error!", + "http": { + "400": "Solicitud incorrecta.", + "403": "No tiene permisos para acceder a la pĆ”gina.", + "404": "La pĆ”gina no existe.", + "405": "El verbo HTTP utilizado no tiene soporte para este URL.", + "500": "Error interno del servidor." + }, + "concurrencyFailure": "Otro usuario ha modificado estos datos al mismo tiempo que tĆŗ. Tus cambios fueron rechazados.", + "validation": "Error de validaciĆ³n en el servidor." + } +} diff --git a/src/main/webapp/i18n/es/estadoCategoria.json b/src/main/webapp/i18n/es/estadoCategoria.json new file mode 100644 index 0000000..31a71c2 --- /dev/null +++ b/src/main/webapp/i18n/es/estadoCategoria.json @@ -0,0 +1,9 @@ +{ + "dataSurveyApp": { + "EstadoCategoria": { + "null": "", + "ACTIVE": "ACTIVE", + "INACTIVE": "INACTIVE" + } + } +} diff --git a/src/main/webapp/i18n/es/estadoColaborador.json b/src/main/webapp/i18n/es/estadoColaborador.json new file mode 100644 index 0000000..dd777fd --- /dev/null +++ b/src/main/webapp/i18n/es/estadoColaborador.json @@ -0,0 +1,9 @@ +{ + "dataSurveyApp": { + "EstadoColaborador": { + "null": "", + "PENDING": "PENDING", + "ACTIVE": "ACTIVE" + } + } +} diff --git a/src/main/webapp/i18n/es/estadoEncuesta.json b/src/main/webapp/i18n/es/estadoEncuesta.json new file mode 100644 index 0000000..3763c48 --- /dev/null +++ b/src/main/webapp/i18n/es/estadoEncuesta.json @@ -0,0 +1,11 @@ +{ + "dataSurveyApp": { + "EstadoEncuesta": { + "null": "", + "DRAFT": "DRAFT", + "ACTIVE": "ACTIVE", + "FINISHED": "FINISHED", + "DELETED": "DELETED" + } + } +} diff --git a/src/main/webapp/i18n/es/estadoPlantilla.json b/src/main/webapp/i18n/es/estadoPlantilla.json new file mode 100644 index 0000000..930f5dc --- /dev/null +++ b/src/main/webapp/i18n/es/estadoPlantilla.json @@ -0,0 +1,11 @@ +{ + "dataSurveyApp": { + "EstadoPlantilla": { + "null": "", + "DRAFT": "DRAFT", + "ACTIVE": "ACTIVE", + "DELETED": "DELETED", + "DISABLED": "DISABLED" + } + } +} diff --git a/src/main/webapp/i18n/es/estadoUsuario.json b/src/main/webapp/i18n/es/estadoUsuario.json new file mode 100644 index 0000000..3bfd9fb --- /dev/null +++ b/src/main/webapp/i18n/es/estadoUsuario.json @@ -0,0 +1,9 @@ +{ + "dataSurveyApp": { + "EstadoUsuario": { + "null": "", + "ACTIVE": "ACTIVE", + "SUSPENDED": "SUSPENDED" + } + } +} diff --git a/src/main/webapp/i18n/es/factura.json b/src/main/webapp/i18n/es/factura.json new file mode 100644 index 0000000..f6c9994 --- /dev/null +++ b/src/main/webapp/i18n/es/factura.json @@ -0,0 +1,27 @@ +{ + "dataSurveyApp": { + "factura": { + "home": { + "title": "Facturas", + "refreshListLabel": "Refrescar lista", + "createLabel": "Crear nuevo Factura", + "createOrEditLabel": "Crear o editar Factura", + "notFound": "NingĆŗn Facturas encontrado" + }, + "created": "Un nuevo Factura ha sido creado con el identificador {{ param }}", + "updated": "Un Factura ha sido actualizado con el identificador {{ param }}", + "deleted": "Un Factura ha sido eliminado con el identificador {{ param }}", + "delete": { + "question": "ĀæSeguro que quiere eliminar Factura {{ id }}?" + }, + "detail": { + "title": "Factura" + }, + "id": "ID", + "nombreUsuario": "Nombre Usuario", + "nombrePlantilla": "Nombre Plantilla", + "costo": "Costo", + "fecha": "Fecha" + } + } +} diff --git a/src/main/webapp/i18n/es/global.json b/src/main/webapp/i18n/es/global.json new file mode 100644 index 0000000..d4c4169 --- /dev/null +++ b/src/main/webapp/i18n/es/global.json @@ -0,0 +1,154 @@ +{ + "global": { + "title": "DataSurvey", + "browsehappy": "EstĆ” usando un navegador no actualizado. Por favor, actualice su navegador para mejorar su experiencia.", + "menu": { + "home": "Inicio", + "jhipster-needle-menu-add-element": "JHipster will add additional menu entries here (do not translate!)", + "entities": { + "main": "Entidades", + "parametroAplicacion": "Parametro Aplicacion", + "usuarioExtra": "Usuario Extra", + "encuesta": "Encuesta", + "ePreguntaAbierta": "E Pregunta Abierta", + "ePreguntaAbiertaRespuesta": "E Pregunta Abierta Respuesta", + "ePreguntaCerrada": "E Pregunta Cerrada", + "ePreguntaCerradaOpcion": "E Pregunta Cerrada Opcion", + "usuarioEncuesta": "Usuario Encuesta", + "categoria": "Categoria", + "factura": "Factura", + "plantilla": "Plantilla", + "pPreguntaAbierta": "P Pregunta Abierta", + "pPreguntaCerrada": "P Pregunta Cerrada", + "pPreguntaCerradaOpcion": "P Pregunta Cerrada Opcion", + "jhipster-needle-menu-add-entry": "JHipster will add additional entities here (do not translate!)" + }, + "account": { + "main": "Cuenta", + "settings": "Ajustes", + "password": "ContraseƱa", + "sessions": "Sesiones", + "login": "Iniciar sesiĆ³n", + "logout": "Cerrar la sesiĆ³n", + "register": "Crear una cuenta" + }, + "admin": { + "main": "AdministraciĆ³n", + "userManagement": "GestiĆ³n de usuarios", + "tracker": "Registro de usuarios", + "metrics": "MĆ©tricas", + "health": "Salud", + "configuration": "ConfiguraciĆ³n", + "logs": "Logs", + "apidocs": "API", + "database": "Base de datos", + "jhipster-needle-menu-add-admin-element": "JHipster will add additional menu entries here (do not translate!)" + }, + "language": "Idioma" + }, + "form": { + "username.label": "Usuario", + "username.placeholder": "Nombre de usuario", + "currentpassword.label": "ContraseƱa actual", + "currentpassword.placeholder": "ContraseƱa actual", + "newpassword.label": "Nueva contraseƱa", + "newpassword.placeholder": "Nueva contraseƱa", + "confirmpassword.label": "ConfirmaciĆ³n de la nueva contraseƱa", + "confirmpassword.placeholder": "ConfirmaciĆ³n de la nueva contraseƱa", + "email.label": "Correo electrĆ³nico", + "email.placeholder": "Su correo electrĆ³nico" + }, + "messages": { + "info": { + "authenticated": { + "prefix": "Si desea ", + "link": "iniciar sesiĆ³n", + "suffix": ", puede intentar con las cuentas predeterminadas:
- Administrador (usuario=\"admin\" y contraseƱa=\"admin\")
- Usuario (usuario=\"user\" y contraseƱa=\"user\")." + }, + "register": { + "noaccount": "ĀæAĆŗn no tienes una cuenta?", + "link": "Crea una cuenta" + } + }, + "error": { + "dontmatch": "Ā”La contraseƱa y la confirmaciĆ³n de contraseƱa no coinciden!" + }, + "validate": { + "newpassword": { + "required": "Se requiere que ingrese una contraseƱa.", + "minlength": "Se requiere que su contraseƱa tenga por lo menos 4 caracteres", + "maxlength": "Su contraseƱa no puede tener mĆ”s de 50 caracteres", + "strength": "Seguridad de la contraseƱa:" + }, + "confirmpassword": { + "required": "Se requiere que confirme la contraseƱa.", + "minlength": "Se requiere que su contraseƱa de confirmaciĆ³n tenga por lo menos 4 caracteres", + "maxlength": "Su contraseƱa de confirmaciĆ³n no puede tener mĆ”s de 50 caracteres" + }, + "email": { + "required": "Se requiere un correo electrĆ³nico.", + "invalid": "Su correo electrĆ³nico no es vĆ”lido.", + "minlength": "Se requiere que su correo electrĆ³nico tenga por lo menos 5 caracteres", + "maxlength": "Su correo electrĆ³nico no puede tener mĆ”s de 50 caracteres" + } + } + }, + "field": { + "id": "ID" + }, + "ribbon": { + "dev": "Development" + }, + "item-count": "Mostrando {{first}} - {{second}} de {{total}} elementos." + }, + "entity": { + "action": { + "addblob": "AƱadir fichero", + "addimage": "AƱadir imagen", + "back": "Volver", + "cancel": "Cancelar", + "delete": "Eliminar", + "edit": "Editar", + "open": "Abrir", + "save": "Guardar", + "view": "Vista" + }, + "detail": { + "field": "Campo", + "value": "Valor" + }, + "delete": { + "title": "Confirmar operaciĆ³n de borrado" + }, + "validation": { + "required": "Este campo es obligatorio.", + "minlength": "Este campo requiere al menos {{min}} caracteres.", + "maxlength": "Este campo no puede superar mĆ”s de {{max}} caracteres.", + "min": "Este campo debe ser mayor que {{min}}.", + "max": "Este campo no puede ser mayor que {{max}}.", + "minbytes": "Este campo debe tener como mĆ­nimo {{min}} bytes.", + "maxbytes": "Este campo no puede tener mĆ”s de {{max}} bytes.", + "pattern": "Este campo debe seguir el patrĆ³n {{pattern}}.", + "number": "Este campo debe ser un nĆŗmero.", + "datetimelocal": "Este campo debe ser una fecha y hora." + } + }, + "error": { + "internalServerError": "Error interno en el servidor", + "server.not.reachable": "Servidor no accesible", + "url.not.found": "No existe", + "NotNull": "Ā”El campo {{fieldName}} no puede estar vacĆ­o!", + "Size": "Ā”El campo {{fieldName}} no cumple con los requisitos de tamaƱo mĆ­nimo/mĆ”ximo!", + "userexists": "Ā”El nombre de usuario ya existe!", + "emailexists": "Ā”La cuenta de correo ya estĆ” en uso!", + "idexists": "Un/a nuevo/a {{entityName}} no puede tener ID", + "idnull": "ID invĆ”lido", + "idinvalid": "ID invĆ”lido", + "idnotfound": "ID no encontrado", + "file": { + "could.not.extract": "No se pudo extraer el fichero", + "not.image": "Se esperaba que el fichero fuera una imagen pero se encontro \"{{ fileType }}\"" + } + }, + "footer": "Pie de pĆ”gina" +} diff --git a/src/main/webapp/i18n/es/health.json b/src/main/webapp/i18n/es/health.json new file mode 100644 index 0000000..1231d93 --- /dev/null +++ b/src/main/webapp/i18n/es/health.json @@ -0,0 +1,31 @@ +{ + "health": { + "title": "Control de salud", + "refresh.button": "Refrescar", + "stacktrace": "Stacktrace", + "details": { + "details": "Detalles", + "properties": "Propiedades", + "name": "Nombre", + "value": "Valor", + "error": "Error" + }, + "indicator": { + "diskSpace": "Espacio en disco", + "mail": "Correo ElectrĆ³nico", + "livenessState": "Liveness state", + "readinessState": "Readiness state", + "ping": "AplicaciĆ³n", + "db": "Base de Datos" + }, + "table": { + "service": "Nombre del servicio", + "status": "Estado" + }, + "status": { + "UNKNOWN": "DESCONOCIDO", + "UP": "LEVANTADO", + "DOWN": "CAƍDO" + } + } +} diff --git a/src/main/webapp/i18n/es/home.json b/src/main/webapp/i18n/es/home.json new file mode 100644 index 0000000..29295b7 --- /dev/null +++ b/src/main/webapp/i18n/es/home.json @@ -0,0 +1,19 @@ +{ + "home": { + "title": "Ā”Bienvenido, Java Hipster!", + "subtitle": "Esta es su pĆ”gina de inicio", + "logged": { + "message": "EstĆ” conectado como \"{{username}}\"." + }, + "question": "Si tiene preguntas sobre JHipster:", + "link": { + "homepage": "PĆ”gina de inicio de JHipster", + "stackoverflow": "JHipster en Stack Overflow", + "bugtracker": "JHipster seguimiento de errores", + "chat": "Sala de chat pĆŗblica de JHipster", + "follow": "contacto @jhipster en Twitter" + }, + "like": "Si te gusta JHipster, danos una estrella en", + "github": "GitHub" + } +} diff --git a/src/main/webapp/i18n/es/login.json b/src/main/webapp/i18n/es/login.json new file mode 100644 index 0000000..ae28f44 --- /dev/null +++ b/src/main/webapp/i18n/es/login.json @@ -0,0 +1,19 @@ +{ + "login": { + "title": "Iniciar la sesiĆ³n", + "form": { + "password": "ContraseƱa", + "password.placeholder": "Su contraseƱa", + "rememberme": "Iniciar la sesiĆ³n automĆ”ticamente", + "button": "Iniciar sesiĆ³n" + }, + "messages": { + "error": { + "authentication": "Ā”El inicio de sesiĆ³n ha fallado! Por favor, revise las credenciales e intente de nuevo." + } + }, + "password": { + "forgot": "ĀæHa olvidado su contraseƱa?" + } + } +} diff --git a/src/main/webapp/i18n/es/logs.json b/src/main/webapp/i18n/es/logs.json new file mode 100644 index 0000000..dfa039d --- /dev/null +++ b/src/main/webapp/i18n/es/logs.json @@ -0,0 +1,11 @@ +{ + "logs": { + "title": "Logs", + "nbloggers": "Hay {{ total }} registros.", + "filter": "Filtro", + "table": { + "name": "Nombre", + "level": "Nivel" + } + } +} diff --git a/src/main/webapp/i18n/es/metrics.json b/src/main/webapp/i18n/es/metrics.json new file mode 100644 index 0000000..94694a2 --- /dev/null +++ b/src/main/webapp/i18n/es/metrics.json @@ -0,0 +1,94 @@ +{ + "metrics": { + "title": "MĆ©tricas de aplicaciĆ³n", + "refresh.button": "Refrescar", + "updating": "Actualizando...", + "jvm": { + "title": "MĆ©tricas de JVM", + "memory": { + "title": "Memoria", + "total": "Memoria total", + "heap": "Memoria del Heap", + "nonheap": "Memoria no Heap" + }, + "threads": { + "title": "Hilos", + "all": "Todo", + "runnable": "Ejecutables", + "timedwaiting": "Tiempo esperando", + "waiting": "Esperando", + "blocked": "Bloqueados", + "dump": { + "title": "Volcado de hilos", + "id": "Id: ", + "blockedtime": "Tiempo bloqueado", + "blockedcount": "Contador bloqueados", + "waitedtime": "Tiempo en espera", + "waitedcount": "Contador en espera", + "lockname": "Nombre del bloqueo", + "stacktrace": "Stacktrace", + "show": "Mostrar", + "hide": "Ocultar" + } + }, + "gc": { + "title": "Colecciones de basura", + "marksweepcount": "Mark Sweep count", + "marksweeptime": "Mark Sweep time", + "scavengecount": "Scavenge count", + "scavengetime": "Scavenge time" + }, + "http": { + "title": "Peticiones HTTP (eventos por segundo)", + "active": "Peticiones activas:", + "total": "Peticiones totales:", + "table": { + "code": "CĆ³digo", + "count": "Recuento", + "mean": "Media", + "average": "Promedio", + "max": "Max" + }, + "code": { + "ok": "Ok", + "notfound": "No encontrado", + "servererror": "Error de servidor" + } + } + }, + "servicesstats": { + "title": "EstadĆ­sticas de servicios (tiempo en milisegundos)", + "table": { + "name": "Nombre del servicio", + "count": "Contador", + "mean": "Media", + "min": "Min", + "max": "Max", + "p50": "p50", + "p75": "p75", + "p95": "p95", + "p99": "p99" + } + }, + "cache": { + "title": "EstadĆ­sticas de cache", + "cachename": "Nombre cache", + "hits": "Accesos", + "misses": "Fallos", + "evictions": "Contador desalojo" + }, + "datasource": { + "usage": "Uso", + "title": "EstadĆ­sticas de la fuente de datos (tiempo en milisegundos)", + "name": "Uso del pool", + "count": "Recuento", + "mean": "Media", + "min": "Min", + "max": "Max", + "p50": "p50", + "p75": "p75", + "p95": "p95", + "p99": "p99" + } + } +} diff --git a/src/main/webapp/i18n/es/pPreguntaAbierta.json b/src/main/webapp/i18n/es/pPreguntaAbierta.json new file mode 100644 index 0000000..f548a93 --- /dev/null +++ b/src/main/webapp/i18n/es/pPreguntaAbierta.json @@ -0,0 +1,27 @@ +{ + "dataSurveyApp": { + "pPreguntaAbierta": { + "home": { + "title": "P Pregunta Abiertas", + "refreshListLabel": "Refrescar lista", + "createLabel": "Crear nuevo P Pregunta Abierta", + "createOrEditLabel": "Crear o editar P Pregunta Abierta", + "notFound": "NingĆŗn P Pregunta Abiertas encontrado" + }, + "created": "Un nuevo P Pregunta Abierta ha sido creado con el identificador {{ param }}", + "updated": "Un P Pregunta Abierta ha sido actualizado con el identificador {{ param }}", + "deleted": "Un P Pregunta Abierta ha sido eliminado con el identificador {{ param }}", + "delete": { + "question": "ĀæSeguro que quiere eliminar P Pregunta Abierta {{ id }}?" + }, + "detail": { + "title": "P Pregunta Abierta" + }, + "id": "ID", + "nombre": "Nombre", + "opcional": "Opcional", + "orden": "Orden", + "plantilla": "Plantilla" + } + } +} diff --git a/src/main/webapp/i18n/es/pPreguntaCerrada.json b/src/main/webapp/i18n/es/pPreguntaCerrada.json new file mode 100644 index 0000000..0520b13 --- /dev/null +++ b/src/main/webapp/i18n/es/pPreguntaCerrada.json @@ -0,0 +1,29 @@ +{ + "dataSurveyApp": { + "pPreguntaCerrada": { + "home": { + "title": "P Pregunta Cerradas", + "refreshListLabel": "Refrescar lista", + "createLabel": "Crear nuevo P Pregunta Cerrada", + "createOrEditLabel": "Crear o editar P Pregunta Cerrada", + "notFound": "NingĆŗn P Pregunta Cerradas encontrado" + }, + "created": "Un nuevo P Pregunta Cerrada ha sido creado con el identificador {{ param }}", + "updated": "Un P Pregunta Cerrada ha sido actualizado con el identificador {{ param }}", + "deleted": "Un P Pregunta Cerrada ha sido eliminado con el identificador {{ param }}", + "delete": { + "question": "ĀæSeguro que quiere eliminar P Pregunta Cerrada {{ id }}?" + }, + "detail": { + "title": "P Pregunta Cerrada" + }, + "id": "ID", + "nombre": "Nombre", + "tipo": "Tipo", + "opcional": "Opcional", + "orden": "Orden", + "pPreguntaCerradaOpcion": "P Pregunta Cerrada Opcion", + "plantilla": "Plantilla" + } + } +} diff --git a/src/main/webapp/i18n/es/pPreguntaCerradaOpcion.json b/src/main/webapp/i18n/es/pPreguntaCerradaOpcion.json new file mode 100644 index 0000000..f409db5 --- /dev/null +++ b/src/main/webapp/i18n/es/pPreguntaCerradaOpcion.json @@ -0,0 +1,26 @@ +{ + "dataSurveyApp": { + "pPreguntaCerradaOpcion": { + "home": { + "title": "P Pregunta Cerrada Opcions", + "refreshListLabel": "Refrescar lista", + "createLabel": "Crear nuevo P Pregunta Cerrada Opcion", + "createOrEditLabel": "Crear o editar P Pregunta Cerrada Opcion", + "notFound": "NingĆŗn P Pregunta Cerrada Opcions encontrado" + }, + "created": "Un nuevo P Pregunta Cerrada Opcion ha sido creado con el identificador {{ param }}", + "updated": "Un P Pregunta Cerrada Opcion ha sido actualizado con el identificador {{ param }}", + "deleted": "Un P Pregunta Cerrada Opcion ha sido eliminado con el identificador {{ param }}", + "delete": { + "question": "ĀæSeguro que quiere eliminar P Pregunta Cerrada Opcion {{ id }}?" + }, + "detail": { + "title": "P Pregunta Cerrada Opcion" + }, + "id": "ID", + "nombre": "Nombre", + "orden": "Orden", + "pPreguntaCerrada": "P Pregunta Cerrada" + } + } +} diff --git a/src/main/webapp/i18n/es/parametroAplicacion.json b/src/main/webapp/i18n/es/parametroAplicacion.json new file mode 100644 index 0000000..0ddcef7 --- /dev/null +++ b/src/main/webapp/i18n/es/parametroAplicacion.json @@ -0,0 +1,27 @@ +{ + "dataSurveyApp": { + "parametroAplicacion": { + "home": { + "title": "Parametro Aplicacions", + "refreshListLabel": "Refrescar lista", + "createLabel": "Crear nuevo Parametro Aplicacion", + "createOrEditLabel": "Crear o editar Parametro Aplicacion", + "notFound": "NingĆŗn Parametro Aplicacions encontrado" + }, + "created": "Un nuevo Parametro Aplicacion ha sido creado con el identificador {{ param }}", + "updated": "Un Parametro Aplicacion ha sido actualizado con el identificador {{ param }}", + "deleted": "Un Parametro Aplicacion ha sido eliminado con el identificador {{ param }}", + "delete": { + "question": "ĀæSeguro que quiere eliminar Parametro Aplicacion {{ id }}?" + }, + "detail": { + "title": "Parametro Aplicacion" + }, + "id": "ID", + "maxDiasEncuesta": "Max Dias Encuesta", + "minDiasEncuesta": "Min Dias Encuesta", + "maxCantidadPreguntas": "Max Cantidad Preguntas", + "minCantidadPreguntas": "Min Cantidad Preguntas" + } + } +} diff --git a/src/main/webapp/i18n/es/password.json b/src/main/webapp/i18n/es/password.json new file mode 100644 index 0000000..52e6bf1 --- /dev/null +++ b/src/main/webapp/i18n/es/password.json @@ -0,0 +1,12 @@ +{ + "password": { + "title": "ContraseƱa de [{{username}}]", + "form": { + "button": "Guardar" + }, + "messages": { + "error": "Ā”Ha ocurrido un error! La contraseƱa no se ha podido cambiar.", + "success": "Ā”La contraseƱa ha sido cambiada!" + } + } +} diff --git a/src/main/webapp/i18n/es/plantilla.json b/src/main/webapp/i18n/es/plantilla.json new file mode 100644 index 0000000..40ad319 --- /dev/null +++ b/src/main/webapp/i18n/es/plantilla.json @@ -0,0 +1,33 @@ +{ + "dataSurveyApp": { + "plantilla": { + "home": { + "title": "Plantillas", + "refreshListLabel": "Refrescar lista", + "createLabel": "Crear nuevo Plantilla", + "createOrEditLabel": "Crear o editar Plantilla", + "notFound": "NingĆŗn Plantillas encontrado" + }, + "created": "Un nuevo Plantilla ha sido creado con el identificador {{ param }}", + "updated": "Un Plantilla ha sido actualizado con el identificador {{ param }}", + "deleted": "Un Plantilla ha sido eliminado con el identificador {{ param }}", + "delete": { + "question": "ĀæSeguro que quiere eliminar Plantilla {{ id }}?" + }, + "detail": { + "title": "Plantilla" + }, + "id": "ID", + "nombre": "Nombre", + "descripcion": "Descripcion", + "fechaCreacion": "Fecha Creacion", + "fechaPublicacionTienda": "Fecha Publicacion Tienda", + "estado": "Estado", + "precio": "Precio", + "pPreguntaCerrada": "P Pregunta Cerrada", + "pPreguntaAbierta": "P Pregunta Abierta", + "categoria": "Categoria", + "usuarioExtra": "Usuario Extra" + } + } +} diff --git a/src/main/webapp/i18n/es/preguntaCerradaTipo.json b/src/main/webapp/i18n/es/preguntaCerradaTipo.json new file mode 100644 index 0000000..0df7703 --- /dev/null +++ b/src/main/webapp/i18n/es/preguntaCerradaTipo.json @@ -0,0 +1,9 @@ +{ + "dataSurveyApp": { + "PreguntaCerradaTipo": { + "null": "", + "SINGLE": "SINGLE", + "MULTIPLE": "MULTIPLE" + } + } +} diff --git a/src/main/webapp/i18n/es/register.json b/src/main/webapp/i18n/es/register.json new file mode 100644 index 0000000..9a44d61 --- /dev/null +++ b/src/main/webapp/i18n/es/register.json @@ -0,0 +1,24 @@ +{ + "register": { + "title": "Registro", + "form": { + "button": "Crear la cuenta" + }, + "messages": { + "validate": { + "login": { + "required": "Su nombre de usuario es obligatorio.", + "minlength": "Su nombre de usuario debe tener al menos 1 caracter.", + "maxlength": "Su nombre de usuario no puede tener mĆ”s de 50 caracteres.", + "pattern": "Su nombre de usuario no es vĆ”lido." + } + }, + "success": "Ā”Registro guardado! Por favor, revise su correo electrĆ³nico para confirmar.", + "error": { + "fail": "Ā”El registro ha fallado! Por favor, intĆ©ntelo de nuevo mĆ”s tarde.", + "userexists": "Ā”El nombre de usuario ya estĆ” registrado! Por favor, escoja otro usuario.", + "emailexists": "Ā”El correo electrĆ³nico ya estĆ” en uso! Por favor, escoja otro email." + } + } + } +} diff --git a/src/main/webapp/i18n/es/reset.json b/src/main/webapp/i18n/es/reset.json new file mode 100644 index 0000000..5193481 --- /dev/null +++ b/src/main/webapp/i18n/es/reset.json @@ -0,0 +1,26 @@ +{ + "reset": { + "request": { + "title": "Restablecer su contraseƱa", + "form": { + "button": "Restablecer la contraseƱa" + }, + "messages": { + "info": "Introduzca la direcciĆ³n de correo electrĆ³nico que utilizĆ³ para registrarse", + "success": "Revise su correo electrĆ³nico para obtener mĆ”s informaciĆ³n sobre cĆ³mo restablecer su contraseƱa." + } + }, + "finish": { + "title": "Restablecer la contraseƱa", + "form": { + "button": "Validar la nueva contraseƱa" + }, + "messages": { + "info": "Elija una contraseƱa nueva", + "success": "Su contraseƱa ha sido restablecida. Por favor, ", + "keymissing": "Falta la clave de reinicio.", + "error": "Su contraseƱa no puede ser restablecida. Recuerde que una solicitud de reinicio de contraseƱa sĆ³lo es vĆ”lida durante 24 horas." + } + } + } +} diff --git a/src/main/webapp/i18n/es/rolColaborador.json b/src/main/webapp/i18n/es/rolColaborador.json new file mode 100644 index 0000000..1734678 --- /dev/null +++ b/src/main/webapp/i18n/es/rolColaborador.json @@ -0,0 +1,9 @@ +{ + "dataSurveyApp": { + "RolColaborador": { + "null": "", + "READ": "READ", + "WRITE": "WRITE" + } + } +} diff --git a/src/main/webapp/i18n/es/sessions.json b/src/main/webapp/i18n/es/sessions.json new file mode 100644 index 0000000..bcca35b --- /dev/null +++ b/src/main/webapp/i18n/es/sessions.json @@ -0,0 +1,15 @@ +{ + "sessions": { + "title": "Sesiones activas para [{{username}}]", + "table": { + "ipaddress": "DirecciĆ³n IP", + "useragent": "Agente de usuario", + "date": "Fecha", + "button": "Invalidar" + }, + "messages": { + "success": "Ā”SesiĆ³n invalidada!", + "error": "Ā”Ha ocurrido un error! La sesiĆ³n no puede ser invalidada." + } + } +} diff --git a/src/main/webapp/i18n/es/settings.json b/src/main/webapp/i18n/es/settings.json new file mode 100644 index 0000000..5a3048b --- /dev/null +++ b/src/main/webapp/i18n/es/settings.json @@ -0,0 +1,32 @@ +{ + "settings": { + "title": "Ajustes del usuario [{{username}}]", + "form": { + "firstname": "Nombre", + "firstname.placeholder": "Su nombre", + "lastname": "Apellidos", + "lastname.placeholder": "Sus apellidos", + "language": "Idioma", + "button": "Guardar" + }, + "messages": { + "error": { + "fail": "Ā”Ha ocurrido un error! Los ajustes no se han podido guardar.", + "emailexists": "Ā”La direcciĆ³n de correo ya existe! Por favor, escoja otra." + }, + "success": "Ā”Ajustes guardados!", + "validate": { + "firstname": { + "required": "Se requiere que ingrese su nombre.", + "minlength": "Se requiere que su nombre tenga por lo menos 1 caracter", + "maxlength": "Su nombre no puede tener mĆ”s de 50 caracteres" + }, + "lastname": { + "required": "Se requiere que ingrese sus apellidos.", + "minlength": "Se requiere que sus apellidos tengan por lo menos 1 caracter", + "maxlength": "Sus apellidos no pueden tener mĆ”s de 50 caracteres" + } + } + } + } +} diff --git a/src/main/webapp/i18n/es/tracker.json b/src/main/webapp/i18n/es/tracker.json new file mode 100644 index 0000000..a52c9fa --- /dev/null +++ b/src/main/webapp/i18n/es/tracker.json @@ -0,0 +1,12 @@ +{ + "tracker": { + "title": "Actividades del usuario en tiempo real", + "table": { + "userlogin": "Usuario", + "ipaddress": "DirecciĆ³n IP", + "userAgent": "Agente de usuario", + "page": "PĆ”gina actual", + "time": "Tiempo" + } + } +} diff --git a/src/main/webapp/i18n/es/user-management.json b/src/main/webapp/i18n/es/user-management.json new file mode 100644 index 0000000..287311f --- /dev/null +++ b/src/main/webapp/i18n/es/user-management.json @@ -0,0 +1,31 @@ +{ + "userManagement": { + "home": { + "title": "Usuarios", + "refreshListLabel": "Refrescar lista", + "createLabel": "Crear un nuevo usuario", + "createOrEditLabel": "Crear o editar un usuario" + }, + "created": "Se creĆ³ un nuevo usuario con identificador {{ param }}", + "updated": "Se actualizĆ³ el usuario con identificador {{ param }}", + "deleted": "Se borrĆ³ el usuario con identificador {{ param }}", + "delete": { + "question": "ĀæSeguro que quieres eliminar el usuario {{ login }}?" + }, + "detail": { + "title": "Usuario" + }, + "login": "Login", + "firstName": "Nombre", + "lastName": "Apellidos", + "email": "Email", + "activated": "Activado", + "deactivated": "Desactivado", + "profiles": "Perfiles", + "langKey": "Idioma", + "createdBy": "Creado por", + "createdDate": "Fecha de creaciĆ³n", + "lastModifiedBy": "Modificado por", + "lastModifiedDate": "Fecha de modificaciĆ³n" + } +} diff --git a/src/main/webapp/i18n/es/usuarioEncuesta.json b/src/main/webapp/i18n/es/usuarioEncuesta.json new file mode 100644 index 0000000..3350969 --- /dev/null +++ b/src/main/webapp/i18n/es/usuarioEncuesta.json @@ -0,0 +1,28 @@ +{ + "dataSurveyApp": { + "usuarioEncuesta": { + "home": { + "title": "Usuario Encuestas", + "refreshListLabel": "Refrescar lista", + "createLabel": "Crear nuevo Usuario Encuesta", + "createOrEditLabel": "Crear o editar Usuario Encuesta", + "notFound": "NingĆŗn Usuario Encuestas encontrado" + }, + "created": "Un nuevo Usuario Encuesta ha sido creado con el identificador {{ param }}", + "updated": "Un Usuario Encuesta ha sido actualizado con el identificador {{ param }}", + "deleted": "Un Usuario Encuesta ha sido eliminado con el identificador {{ param }}", + "delete": { + "question": "ĀæSeguro que quiere eliminar Usuario Encuesta {{ id }}?" + }, + "detail": { + "title": "Usuario Encuesta" + }, + "id": "ID", + "rol": "Rol", + "estado": "Estado", + "fechaAgregado": "Fecha Agregado", + "usuarioExtra": "Usuario Extra", + "encuesta": "Encuesta" + } + } +} diff --git a/src/main/webapp/i18n/es/usuarioExtra.json b/src/main/webapp/i18n/es/usuarioExtra.json new file mode 100644 index 0000000..8b97d1a --- /dev/null +++ b/src/main/webapp/i18n/es/usuarioExtra.json @@ -0,0 +1,31 @@ +{ + "dataSurveyApp": { + "usuarioExtra": { + "home": { + "title": "Usuario Extras", + "refreshListLabel": "Refrescar lista", + "createLabel": "Crear nuevo Usuario Extra", + "createOrEditLabel": "Crear o editar Usuario Extra", + "notFound": "NingĆŗn Usuario Extras encontrado" + }, + "created": "Un nuevo Usuario Extra ha sido creado con el identificador {{ param }}", + "updated": "Un Usuario Extra ha sido actualizado con el identificador {{ param }}", + "deleted": "Un Usuario Extra ha sido eliminado con el identificador {{ param }}", + "delete": { + "question": "ĀæSeguro que quiere eliminar Usuario Extra {{ id }}?" + }, + "detail": { + "title": "Usuario Extra" + }, + "id": "ID", + "nombre": "Nombre", + "iconoPerfil": "Icono Perfil", + "fechaNacimiento": "Fecha Nacimiento", + "estado": "Estado", + "user": "User", + "encuesta": "Encuesta", + "usuarioEncuesta": "Usuario Encuesta", + "plantilla": "Plantilla" + } + } +} diff --git a/src/main/webapp/index.html b/src/main/webapp/index.html new file mode 100644 index 0000000..1d945f6 --- /dev/null +++ b/src/main/webapp/index.html @@ -0,0 +1,128 @@ + + + + + + DataSurvey + + + + + + + + + + + + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+ + + + + diff --git a/src/main/webapp/main.ts b/src/main/webapp/main.ts new file mode 100644 index 0000000..73c3a0e --- /dev/null +++ b/src/main/webapp/main.ts @@ -0,0 +1 @@ +import('./bootstrap').catch(err => console.error(err)); diff --git a/src/main/webapp/manifest.webapp b/src/main/webapp/manifest.webapp new file mode 100644 index 0000000..878a8c5 --- /dev/null +++ b/src/main/webapp/manifest.webapp @@ -0,0 +1,31 @@ +{ + "name": "DataSurvey", + "short_name": "DataSurvey", + "icons": [ + { + "src": "./content/images/jhipster_family_member_0_head-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "./content/images/jhipster_family_member_0_head-256.png", + "sizes": "256x256", + "type": "image/png" + }, + { + "src": "./content/images/jhipster_family_member_0_head-384.png", + "sizes": "384x384", + "type": "image/png" + }, + { + "src": "./content/images/jhipster_family_member_0_head-512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#000000", + "background_color": "#e0e0e0", + "start_url": ".", + "display": "standalone", + "orientation": "portrait" +} diff --git a/src/main/webapp/polyfills.ts b/src/main/webapp/polyfills.ts new file mode 100644 index 0000000..a144f00 --- /dev/null +++ b/src/main/webapp/polyfills.ts @@ -0,0 +1,5 @@ +import 'zone.js'; +import '@angular/localize/init'; + +// Fix needed for SockJS, see https://github.com/sockjs/sockjs-client/issues/439 +(window as any).global = window; diff --git a/src/main/webapp/robots.txt b/src/main/webapp/robots.txt new file mode 100644 index 0000000..250b4ab --- /dev/null +++ b/src/main/webapp/robots.txt @@ -0,0 +1,11 @@ +# robotstxt.org/ + +User-agent: * +Disallow: /api/account +Disallow: /api/account/change-password +Disallow: /api/account/sessions +Disallow: /api/logs/ +Disallow: /api/users/ +Disallow: /management/ +Disallow: /v2/api-docs/ +Disallow: /v3/api-docs/ diff --git a/src/main/webapp/swagger-ui/dist/images/throbber.gif b/src/main/webapp/swagger-ui/dist/images/throbber.gif new file mode 100644 index 0000000..0639388 Binary files /dev/null and b/src/main/webapp/swagger-ui/dist/images/throbber.gif differ diff --git a/src/main/webapp/swagger-ui/index.html b/src/main/webapp/swagger-ui/index.html new file mode 100644 index 0000000..4867a67 --- /dev/null +++ b/src/main/webapp/swagger-ui/index.html @@ -0,0 +1,82 @@ + + + + + DataSurvey - Swagger UI + + + + + + +
+ + + + + + + + diff --git a/src/test/java/org/datasurvey/ArchTest.java b/src/test/java/org/datasurvey/ArchTest.java new file mode 100644 index 0000000..3cf1120 --- /dev/null +++ b/src/test/java/org/datasurvey/ArchTest.java @@ -0,0 +1,29 @@ +package org.datasurvey; + +import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.noClasses; + +import com.tngtech.archunit.core.domain.JavaClasses; +import com.tngtech.archunit.core.importer.ClassFileImporter; +import com.tngtech.archunit.core.importer.ImportOption; +import org.junit.jupiter.api.Test; + +class ArchTest { + + @Test + void servicesAndRepositoriesShouldNotDependOnWebLayer() { + JavaClasses importedClasses = new ClassFileImporter() + .withImportOption(ImportOption.Predefined.DO_NOT_INCLUDE_TESTS) + .importPackages("org.datasurvey"); + + noClasses() + .that() + .resideInAnyPackage("org.datasurvey.service..") + .or() + .resideInAnyPackage("org.datasurvey.repository..") + .should() + .dependOnClassesThat() + .resideInAnyPackage("..org.datasurvey.web..") + .because("Services and repositories should not depend on web layer") + .check(importedClasses); + } +} diff --git a/src/test/java/org/datasurvey/IntegrationTest.java b/src/test/java/org/datasurvey/IntegrationTest.java new file mode 100644 index 0000000..445d545 --- /dev/null +++ b/src/test/java/org/datasurvey/IntegrationTest.java @@ -0,0 +1,17 @@ +package org.datasurvey; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import org.datasurvey.DataSurveyApp; +import org.springframework.boot.test.context.SpringBootTest; + +/** + * Base composite annotation for integration tests. + */ +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +@SpringBootTest(classes = DataSurveyApp.class) +public @interface IntegrationTest { +} diff --git a/src/test/java/org/datasurvey/config/NoOpMailConfiguration.java b/src/test/java/org/datasurvey/config/NoOpMailConfiguration.java new file mode 100644 index 0000000..39fa8b1 --- /dev/null +++ b/src/test/java/org/datasurvey/config/NoOpMailConfiguration.java @@ -0,0 +1,25 @@ +package org.datasurvey.config; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.mock; + +import org.datasurvey.service.MailService; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class NoOpMailConfiguration { + + private final MailService mockMailService; + + public NoOpMailConfiguration() { + mockMailService = mock(MailService.class); + doNothing().when(mockMailService).sendActivationEmail(any()); + } + + @Bean + public MailService mailService() { + return mockMailService; + } +} diff --git a/src/test/java/org/datasurvey/config/StaticResourcesWebConfigurerTest.java b/src/test/java/org/datasurvey/config/StaticResourcesWebConfigurerTest.java new file mode 100644 index 0000000..1bbf695 --- /dev/null +++ b/src/test/java/org/datasurvey/config/StaticResourcesWebConfigurerTest.java @@ -0,0 +1,76 @@ +package org.datasurvey.config; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.datasurvey.config.StaticResourcesWebConfiguration.*; +import static org.mockito.Mockito.*; + +import java.util.concurrent.TimeUnit; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.http.CacheControl; +import org.springframework.mock.web.MockServletContext; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistration; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import tech.jhipster.config.JHipsterDefaults; +import tech.jhipster.config.JHipsterProperties; + +class StaticResourcesWebConfigurerTest { + + public static final int MAX_AGE_TEST = 5; + public StaticResourcesWebConfiguration staticResourcesWebConfiguration; + private ResourceHandlerRegistry resourceHandlerRegistry; + private MockServletContext servletContext; + private WebApplicationContext applicationContext; + private JHipsterProperties props; + + @BeforeEach + void setUp() { + servletContext = spy(new MockServletContext()); + applicationContext = mock(WebApplicationContext.class); + resourceHandlerRegistry = spy(new ResourceHandlerRegistry(applicationContext, servletContext)); + props = new JHipsterProperties(); + staticResourcesWebConfiguration = spy(new StaticResourcesWebConfiguration(props)); + } + + @Test + void shouldAppendResourceHandlerAndInitializeIt() { + staticResourcesWebConfiguration.addResourceHandlers(resourceHandlerRegistry); + + verify(resourceHandlerRegistry, times(1)).addResourceHandler(RESOURCE_PATHS); + verify(staticResourcesWebConfiguration, times(1)).initializeResourceHandler(any(ResourceHandlerRegistration.class)); + for (String testingPath : RESOURCE_PATHS) { + assertThat(resourceHandlerRegistry.hasMappingForPattern(testingPath)).isTrue(); + } + } + + @Test + void shouldInitializeResourceHandlerWithCacheControlAndLocations() { + CacheControl ccExpected = CacheControl.maxAge(5, TimeUnit.DAYS).cachePublic(); + when(staticResourcesWebConfiguration.getCacheControl()).thenReturn(ccExpected); + ResourceHandlerRegistration resourceHandlerRegistration = spy(new ResourceHandlerRegistration(RESOURCE_PATHS)); + + staticResourcesWebConfiguration.initializeResourceHandler(resourceHandlerRegistration); + + verify(staticResourcesWebConfiguration, times(1)).getCacheControl(); + verify(resourceHandlerRegistration, times(1)).setCacheControl(ccExpected); + verify(resourceHandlerRegistration, times(1)).addResourceLocations(RESOURCE_LOCATIONS); + } + + @Test + void shouldCreateCacheControlBasedOnJhipsterDefaultProperties() { + CacheControl cacheExpected = CacheControl.maxAge(JHipsterDefaults.Http.Cache.timeToLiveInDays, TimeUnit.DAYS).cachePublic(); + assertThat(staticResourcesWebConfiguration.getCacheControl()) + .extracting(CacheControl::getHeaderValue) + .isEqualTo(cacheExpected.getHeaderValue()); + } + + @Test + void shouldCreateCacheControlWithSpecificConfigurationInProperties() { + props.getHttp().getCache().setTimeToLiveInDays(MAX_AGE_TEST); + CacheControl cacheExpected = CacheControl.maxAge(MAX_AGE_TEST, TimeUnit.DAYS).cachePublic(); + assertThat(staticResourcesWebConfiguration.getCacheControl()) + .extracting(CacheControl::getHeaderValue) + .isEqualTo(cacheExpected.getHeaderValue()); + } +} diff --git a/src/test/java/org/datasurvey/config/WebConfigurerTest.java b/src/test/java/org/datasurvey/config/WebConfigurerTest.java new file mode 100644 index 0000000..2afbc2b --- /dev/null +++ b/src/test/java/org/datasurvey/config/WebConfigurerTest.java @@ -0,0 +1,147 @@ +package org.datasurvey.config; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatCode; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.*; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.options; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import java.io.File; +import java.util.*; +import javax.servlet.*; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory; +import org.springframework.http.HttpHeaders; +import org.springframework.mock.env.MockEnvironment; +import org.springframework.mock.web.MockServletContext; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import tech.jhipster.config.JHipsterConstants; +import tech.jhipster.config.JHipsterProperties; + +/** + * Unit tests for the {@link WebConfigurer} class. + */ +class WebConfigurerTest { + + private WebConfigurer webConfigurer; + + private MockServletContext servletContext; + + private MockEnvironment env; + + private JHipsterProperties props; + + @BeforeEach + public void setup() { + servletContext = spy(new MockServletContext()); + doReturn(mock(FilterRegistration.Dynamic.class)).when(servletContext).addFilter(anyString(), any(Filter.class)); + doReturn(mock(ServletRegistration.Dynamic.class)).when(servletContext).addServlet(anyString(), any(Servlet.class)); + + env = new MockEnvironment(); + props = new JHipsterProperties(); + + webConfigurer = new WebConfigurer(env, props); + } + + @Test + void shouldStartUpProdServletContext() throws ServletException { + env.setActiveProfiles(JHipsterConstants.SPRING_PROFILE_PRODUCTION); + + assertThatCode(() -> webConfigurer.onStartup(servletContext)).doesNotThrowAnyException(); + } + + @Test + void shouldStartUpDevServletContext() throws ServletException { + env.setActiveProfiles(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT); + + assertThatCode(() -> webConfigurer.onStartup(servletContext)).doesNotThrowAnyException(); + } + + @Test + void shouldCustomizeServletContainer() { + env.setActiveProfiles(JHipsterConstants.SPRING_PROFILE_PRODUCTION); + UndertowServletWebServerFactory container = new UndertowServletWebServerFactory(); + webConfigurer.customize(container); + assertThat(container.getMimeMappings().get("abs")).isEqualTo("audio/x-mpeg"); + assertThat(container.getMimeMappings().get("html")).isEqualTo("text/html"); + assertThat(container.getMimeMappings().get("json")).isEqualTo("application/json"); + if (container.getDocumentRoot() != null) { + assertThat(container.getDocumentRoot()).isEqualTo(new File("target/classes/static/")); + } + } + + @Test + void shouldCorsFilterOnApiPath() throws Exception { + props.getCors().setAllowedOrigins(Collections.singletonList("other.domain.com")); + props.getCors().setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE")); + props.getCors().setAllowedHeaders(Collections.singletonList("*")); + props.getCors().setMaxAge(1800L); + props.getCors().setAllowCredentials(true); + + MockMvc mockMvc = MockMvcBuilders.standaloneSetup(new WebConfigurerTestController()).addFilters(webConfigurer.corsFilter()).build(); + + mockMvc + .perform( + options("/api/test-cors") + .header(HttpHeaders.ORIGIN, "other.domain.com") + .header(HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD, "POST") + ) + .andExpect(status().isOk()) + .andExpect(header().string(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, "other.domain.com")) + .andExpect(header().string(HttpHeaders.VARY, "Origin")) + .andExpect(header().string(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, "GET,POST,PUT,DELETE")) + .andExpect(header().string(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, "true")) + .andExpect(header().string(HttpHeaders.ACCESS_CONTROL_MAX_AGE, "1800")); + + mockMvc + .perform(get("/api/test-cors").header(HttpHeaders.ORIGIN, "other.domain.com")) + .andExpect(status().isOk()) + .andExpect(header().string(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, "other.domain.com")); + } + + @Test + void shouldCorsFilterOnOtherPath() throws Exception { + props.getCors().setAllowedOrigins(Collections.singletonList("*")); + props.getCors().setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE")); + props.getCors().setAllowedHeaders(Collections.singletonList("*")); + props.getCors().setMaxAge(1800L); + props.getCors().setAllowCredentials(true); + + MockMvc mockMvc = MockMvcBuilders.standaloneSetup(new WebConfigurerTestController()).addFilters(webConfigurer.corsFilter()).build(); + + mockMvc + .perform(get("/test/test-cors").header(HttpHeaders.ORIGIN, "other.domain.com")) + .andExpect(status().isOk()) + .andExpect(header().doesNotExist(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN)); + } + + @Test + void shouldCorsFilterDeactivatedForNullAllowedOrigins() throws Exception { + props.getCors().setAllowedOrigins(null); + + MockMvc mockMvc = MockMvcBuilders.standaloneSetup(new WebConfigurerTestController()).addFilters(webConfigurer.corsFilter()).build(); + + mockMvc + .perform(get("/api/test-cors").header(HttpHeaders.ORIGIN, "other.domain.com")) + .andExpect(status().isOk()) + .andExpect(header().doesNotExist(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN)); + } + + @Test + void shouldCorsFilterDeactivatedForEmptyAllowedOrigins() throws Exception { + props.getCors().setAllowedOrigins(new ArrayList<>()); + + MockMvc mockMvc = MockMvcBuilders.standaloneSetup(new WebConfigurerTestController()).addFilters(webConfigurer.corsFilter()).build(); + + mockMvc + .perform(get("/api/test-cors").header(HttpHeaders.ORIGIN, "other.domain.com")) + .andExpect(status().isOk()) + .andExpect(header().doesNotExist(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN)); + } +} diff --git a/src/test/java/org/datasurvey/config/WebConfigurerTestController.java b/src/test/java/org/datasurvey/config/WebConfigurerTestController.java new file mode 100644 index 0000000..c8caea2 --- /dev/null +++ b/src/test/java/org/datasurvey/config/WebConfigurerTestController.java @@ -0,0 +1,14 @@ +package org.datasurvey.config; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class WebConfigurerTestController { + + @GetMapping("/api/test-cors") + public void testCorsOnApiPath() {} + + @GetMapping("/test/test-cors") + public void testCorsOnOtherPath() {} +} diff --git a/src/test/java/org/datasurvey/config/timezone/HibernateTimeZoneIT.java b/src/test/java/org/datasurvey/config/timezone/HibernateTimeZoneIT.java new file mode 100644 index 0000000..c85c421 --- /dev/null +++ b/src/test/java/org/datasurvey/config/timezone/HibernateTimeZoneIT.java @@ -0,0 +1,162 @@ +package org.datasurvey.config.timezone; + +import static java.lang.String.format; +import static org.assertj.core.api.Assertions.assertThat; + +import java.time.*; +import java.time.format.DateTimeFormatter; +import org.datasurvey.IntegrationTest; +import org.datasurvey.repository.timezone.DateTimeWrapper; +import org.datasurvey.repository.timezone.DateTimeWrapperRepository; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.support.rowset.SqlRowSet; +import org.springframework.transaction.annotation.Transactional; + +/** + * Integration tests for the ZoneId Hibernate configuration. + */ +@IntegrationTest +class HibernateTimeZoneIT { + + @Autowired + private DateTimeWrapperRepository dateTimeWrapperRepository; + + @Autowired + private JdbcTemplate jdbcTemplate; + + @Value("${spring.jpa.properties.hibernate.jdbc.time_zone:UTC}") + private String zoneId; + + private DateTimeWrapper dateTimeWrapper; + private DateTimeFormatter dateTimeFormatter; + private DateTimeFormatter timeFormatter; + private DateTimeFormatter dateFormatter; + + @BeforeEach + public void setup() { + dateTimeWrapper = new DateTimeWrapper(); + dateTimeWrapper.setInstant(Instant.parse("2014-11-12T05:50:00.0Z")); + dateTimeWrapper.setLocalDateTime(LocalDateTime.parse("2014-11-12T07:50:00.0")); + dateTimeWrapper.setOffsetDateTime(OffsetDateTime.parse("2011-12-14T08:30:00.0Z")); + dateTimeWrapper.setZonedDateTime(ZonedDateTime.parse("2011-12-14T08:30:00.0Z")); + dateTimeWrapper.setLocalTime(LocalTime.parse("14:30:00")); + dateTimeWrapper.setOffsetTime(OffsetTime.parse("14:30:00+02:00")); + dateTimeWrapper.setLocalDate(LocalDate.parse("2016-09-10")); + + dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S").withZone(ZoneId.of(zoneId)); + + timeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss").withZone(ZoneId.of(zoneId)); + + dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + } + + @Test + @Transactional + void storeInstantWithZoneIdConfigShouldBeStoredOnGMTTimeZone() { + dateTimeWrapperRepository.saveAndFlush(dateTimeWrapper); + + String request = generateSqlRequest("instant", dateTimeWrapper.getId()); + SqlRowSet resultSet = jdbcTemplate.queryForRowSet(request); + String expectedValue = dateTimeFormatter.format(dateTimeWrapper.getInstant()); + + assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(resultSet, expectedValue); + } + + @Test + @Transactional + void storeLocalDateTimeWithZoneIdConfigShouldBeStoredOnGMTTimeZone() { + dateTimeWrapperRepository.saveAndFlush(dateTimeWrapper); + + String request = generateSqlRequest("local_date_time", dateTimeWrapper.getId()); + SqlRowSet resultSet = jdbcTemplate.queryForRowSet(request); + String expectedValue = dateTimeWrapper.getLocalDateTime().atZone(ZoneId.systemDefault()).format(dateTimeFormatter); + + assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(resultSet, expectedValue); + } + + @Test + @Transactional + void storeOffsetDateTimeWithZoneIdConfigShouldBeStoredOnGMTTimeZone() { + dateTimeWrapperRepository.saveAndFlush(dateTimeWrapper); + + String request = generateSqlRequest("offset_date_time", dateTimeWrapper.getId()); + SqlRowSet resultSet = jdbcTemplate.queryForRowSet(request); + String expectedValue = dateTimeWrapper.getOffsetDateTime().format(dateTimeFormatter); + + assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(resultSet, expectedValue); + } + + @Test + @Transactional + void storeZoneDateTimeWithZoneIdConfigShouldBeStoredOnGMTTimeZone() { + dateTimeWrapperRepository.saveAndFlush(dateTimeWrapper); + + String request = generateSqlRequest("zoned_date_time", dateTimeWrapper.getId()); + SqlRowSet resultSet = jdbcTemplate.queryForRowSet(request); + String expectedValue = dateTimeWrapper.getZonedDateTime().format(dateTimeFormatter); + + assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(resultSet, expectedValue); + } + + @Test + @Transactional + void storeLocalTimeWithZoneIdConfigShouldBeStoredOnGMTTimeZoneAccordingToHis1stJan1970Value() { + dateTimeWrapperRepository.saveAndFlush(dateTimeWrapper); + + String request = generateSqlRequest("local_time", dateTimeWrapper.getId()); + SqlRowSet resultSet = jdbcTemplate.queryForRowSet(request); + String expectedValue = dateTimeWrapper + .getLocalTime() + .atDate(LocalDate.of(1970, Month.JANUARY, 1)) + .atZone(ZoneId.systemDefault()) + .format(timeFormatter); + + assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(resultSet, expectedValue); + } + + @Test + @Transactional + void storeOffsetTimeWithZoneIdConfigShouldBeStoredOnGMTTimeZoneAccordingToHis1stJan1970Value() { + dateTimeWrapperRepository.saveAndFlush(dateTimeWrapper); + + String request = generateSqlRequest("offset_time", dateTimeWrapper.getId()); + SqlRowSet resultSet = jdbcTemplate.queryForRowSet(request); + String expectedValue = dateTimeWrapper + .getOffsetTime() + .toLocalTime() + .atDate(LocalDate.of(1970, Month.JANUARY, 1)) + .atZone(ZoneId.systemDefault()) + .format(timeFormatter); + + assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(resultSet, expectedValue); + } + + @Test + @Transactional + void storeLocalDateWithZoneIdConfigShouldBeStoredWithoutTransformation() { + dateTimeWrapperRepository.saveAndFlush(dateTimeWrapper); + + String request = generateSqlRequest("local_date", dateTimeWrapper.getId()); + SqlRowSet resultSet = jdbcTemplate.queryForRowSet(request); + String expectedValue = dateTimeWrapper.getLocalDate().format(dateFormatter); + + assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(resultSet, expectedValue); + } + + private String generateSqlRequest(String fieldName, long id) { + return format("SELECT %s FROM jhi_date_time_wrapper where id=%d", fieldName, id); + } + + private void assertThatDateStoredValueIsEqualToInsertDateValueOnGMTTimeZone(SqlRowSet sqlRowSet, String expectedValue) { + while (sqlRowSet.next()) { + String dbValue = sqlRowSet.getString(1); + + assertThat(dbValue).isNotNull(); + assertThat(dbValue).isEqualTo(expectedValue); + } + } +} diff --git a/src/test/java/org/datasurvey/domain/CategoriaTest.java b/src/test/java/org/datasurvey/domain/CategoriaTest.java new file mode 100644 index 0000000..051e03d --- /dev/null +++ b/src/test/java/org/datasurvey/domain/CategoriaTest.java @@ -0,0 +1,23 @@ +package org.datasurvey.domain; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.datasurvey.web.rest.TestUtil; +import org.junit.jupiter.api.Test; + +class CategoriaTest { + + @Test + void equalsVerifier() throws Exception { + TestUtil.equalsVerifier(Categoria.class); + Categoria categoria1 = new Categoria(); + categoria1.setId(1L); + Categoria categoria2 = new Categoria(); + categoria2.setId(categoria1.getId()); + assertThat(categoria1).isEqualTo(categoria2); + categoria2.setId(2L); + assertThat(categoria1).isNotEqualTo(categoria2); + categoria1.setId(null); + assertThat(categoria1).isNotEqualTo(categoria2); + } +} diff --git a/src/test/java/org/datasurvey/domain/EPreguntaAbiertaRespuestaTest.java b/src/test/java/org/datasurvey/domain/EPreguntaAbiertaRespuestaTest.java new file mode 100644 index 0000000..3948b60 --- /dev/null +++ b/src/test/java/org/datasurvey/domain/EPreguntaAbiertaRespuestaTest.java @@ -0,0 +1,23 @@ +package org.datasurvey.domain; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.datasurvey.web.rest.TestUtil; +import org.junit.jupiter.api.Test; + +class EPreguntaAbiertaRespuestaTest { + + @Test + void equalsVerifier() throws Exception { + TestUtil.equalsVerifier(EPreguntaAbiertaRespuesta.class); + EPreguntaAbiertaRespuesta ePreguntaAbiertaRespuesta1 = new EPreguntaAbiertaRespuesta(); + ePreguntaAbiertaRespuesta1.setId(1L); + EPreguntaAbiertaRespuesta ePreguntaAbiertaRespuesta2 = new EPreguntaAbiertaRespuesta(); + ePreguntaAbiertaRespuesta2.setId(ePreguntaAbiertaRespuesta1.getId()); + assertThat(ePreguntaAbiertaRespuesta1).isEqualTo(ePreguntaAbiertaRespuesta2); + ePreguntaAbiertaRespuesta2.setId(2L); + assertThat(ePreguntaAbiertaRespuesta1).isNotEqualTo(ePreguntaAbiertaRespuesta2); + ePreguntaAbiertaRespuesta1.setId(null); + assertThat(ePreguntaAbiertaRespuesta1).isNotEqualTo(ePreguntaAbiertaRespuesta2); + } +} diff --git a/src/test/java/org/datasurvey/domain/EPreguntaAbiertaTest.java b/src/test/java/org/datasurvey/domain/EPreguntaAbiertaTest.java new file mode 100644 index 0000000..7ed94c3 --- /dev/null +++ b/src/test/java/org/datasurvey/domain/EPreguntaAbiertaTest.java @@ -0,0 +1,23 @@ +package org.datasurvey.domain; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.datasurvey.web.rest.TestUtil; +import org.junit.jupiter.api.Test; + +class EPreguntaAbiertaTest { + + @Test + void equalsVerifier() throws Exception { + TestUtil.equalsVerifier(EPreguntaAbierta.class); + EPreguntaAbierta ePreguntaAbierta1 = new EPreguntaAbierta(); + ePreguntaAbierta1.setId(1L); + EPreguntaAbierta ePreguntaAbierta2 = new EPreguntaAbierta(); + ePreguntaAbierta2.setId(ePreguntaAbierta1.getId()); + assertThat(ePreguntaAbierta1).isEqualTo(ePreguntaAbierta2); + ePreguntaAbierta2.setId(2L); + assertThat(ePreguntaAbierta1).isNotEqualTo(ePreguntaAbierta2); + ePreguntaAbierta1.setId(null); + assertThat(ePreguntaAbierta1).isNotEqualTo(ePreguntaAbierta2); + } +} diff --git a/src/test/java/org/datasurvey/domain/EPreguntaCerradaOpcionTest.java b/src/test/java/org/datasurvey/domain/EPreguntaCerradaOpcionTest.java new file mode 100644 index 0000000..16f9095 --- /dev/null +++ b/src/test/java/org/datasurvey/domain/EPreguntaCerradaOpcionTest.java @@ -0,0 +1,23 @@ +package org.datasurvey.domain; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.datasurvey.web.rest.TestUtil; +import org.junit.jupiter.api.Test; + +class EPreguntaCerradaOpcionTest { + + @Test + void equalsVerifier() throws Exception { + TestUtil.equalsVerifier(EPreguntaCerradaOpcion.class); + EPreguntaCerradaOpcion ePreguntaCerradaOpcion1 = new EPreguntaCerradaOpcion(); + ePreguntaCerradaOpcion1.setId(1L); + EPreguntaCerradaOpcion ePreguntaCerradaOpcion2 = new EPreguntaCerradaOpcion(); + ePreguntaCerradaOpcion2.setId(ePreguntaCerradaOpcion1.getId()); + assertThat(ePreguntaCerradaOpcion1).isEqualTo(ePreguntaCerradaOpcion2); + ePreguntaCerradaOpcion2.setId(2L); + assertThat(ePreguntaCerradaOpcion1).isNotEqualTo(ePreguntaCerradaOpcion2); + ePreguntaCerradaOpcion1.setId(null); + assertThat(ePreguntaCerradaOpcion1).isNotEqualTo(ePreguntaCerradaOpcion2); + } +} diff --git a/src/test/java/org/datasurvey/domain/EPreguntaCerradaTest.java b/src/test/java/org/datasurvey/domain/EPreguntaCerradaTest.java new file mode 100644 index 0000000..3f1c3f6 --- /dev/null +++ b/src/test/java/org/datasurvey/domain/EPreguntaCerradaTest.java @@ -0,0 +1,23 @@ +package org.datasurvey.domain; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.datasurvey.web.rest.TestUtil; +import org.junit.jupiter.api.Test; + +class EPreguntaCerradaTest { + + @Test + void equalsVerifier() throws Exception { + TestUtil.equalsVerifier(EPreguntaCerrada.class); + EPreguntaCerrada ePreguntaCerrada1 = new EPreguntaCerrada(); + ePreguntaCerrada1.setId(1L); + EPreguntaCerrada ePreguntaCerrada2 = new EPreguntaCerrada(); + ePreguntaCerrada2.setId(ePreguntaCerrada1.getId()); + assertThat(ePreguntaCerrada1).isEqualTo(ePreguntaCerrada2); + ePreguntaCerrada2.setId(2L); + assertThat(ePreguntaCerrada1).isNotEqualTo(ePreguntaCerrada2); + ePreguntaCerrada1.setId(null); + assertThat(ePreguntaCerrada1).isNotEqualTo(ePreguntaCerrada2); + } +} diff --git a/src/test/java/org/datasurvey/domain/EncuestaTest.java b/src/test/java/org/datasurvey/domain/EncuestaTest.java new file mode 100644 index 0000000..8ab7eab --- /dev/null +++ b/src/test/java/org/datasurvey/domain/EncuestaTest.java @@ -0,0 +1,23 @@ +package org.datasurvey.domain; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.datasurvey.web.rest.TestUtil; +import org.junit.jupiter.api.Test; + +class EncuestaTest { + + @Test + void equalsVerifier() throws Exception { + TestUtil.equalsVerifier(Encuesta.class); + Encuesta encuesta1 = new Encuesta(); + encuesta1.setId(1L); + Encuesta encuesta2 = new Encuesta(); + encuesta2.setId(encuesta1.getId()); + assertThat(encuesta1).isEqualTo(encuesta2); + encuesta2.setId(2L); + assertThat(encuesta1).isNotEqualTo(encuesta2); + encuesta1.setId(null); + assertThat(encuesta1).isNotEqualTo(encuesta2); + } +} diff --git a/src/test/java/org/datasurvey/domain/FacturaTest.java b/src/test/java/org/datasurvey/domain/FacturaTest.java new file mode 100644 index 0000000..0b6039f --- /dev/null +++ b/src/test/java/org/datasurvey/domain/FacturaTest.java @@ -0,0 +1,23 @@ +package org.datasurvey.domain; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.datasurvey.web.rest.TestUtil; +import org.junit.jupiter.api.Test; + +class FacturaTest { + + @Test + void equalsVerifier() throws Exception { + TestUtil.equalsVerifier(Factura.class); + Factura factura1 = new Factura(); + factura1.setId(1L); + Factura factura2 = new Factura(); + factura2.setId(factura1.getId()); + assertThat(factura1).isEqualTo(factura2); + factura2.setId(2L); + assertThat(factura1).isNotEqualTo(factura2); + factura1.setId(null); + assertThat(factura1).isNotEqualTo(factura2); + } +} diff --git a/src/test/java/org/datasurvey/domain/PPreguntaAbiertaTest.java b/src/test/java/org/datasurvey/domain/PPreguntaAbiertaTest.java new file mode 100644 index 0000000..eff8922 --- /dev/null +++ b/src/test/java/org/datasurvey/domain/PPreguntaAbiertaTest.java @@ -0,0 +1,23 @@ +package org.datasurvey.domain; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.datasurvey.web.rest.TestUtil; +import org.junit.jupiter.api.Test; + +class PPreguntaAbiertaTest { + + @Test + void equalsVerifier() throws Exception { + TestUtil.equalsVerifier(PPreguntaAbierta.class); + PPreguntaAbierta pPreguntaAbierta1 = new PPreguntaAbierta(); + pPreguntaAbierta1.setId(1L); + PPreguntaAbierta pPreguntaAbierta2 = new PPreguntaAbierta(); + pPreguntaAbierta2.setId(pPreguntaAbierta1.getId()); + assertThat(pPreguntaAbierta1).isEqualTo(pPreguntaAbierta2); + pPreguntaAbierta2.setId(2L); + assertThat(pPreguntaAbierta1).isNotEqualTo(pPreguntaAbierta2); + pPreguntaAbierta1.setId(null); + assertThat(pPreguntaAbierta1).isNotEqualTo(pPreguntaAbierta2); + } +} diff --git a/src/test/java/org/datasurvey/domain/PPreguntaCerradaOpcionTest.java b/src/test/java/org/datasurvey/domain/PPreguntaCerradaOpcionTest.java new file mode 100644 index 0000000..e3b1afc --- /dev/null +++ b/src/test/java/org/datasurvey/domain/PPreguntaCerradaOpcionTest.java @@ -0,0 +1,23 @@ +package org.datasurvey.domain; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.datasurvey.web.rest.TestUtil; +import org.junit.jupiter.api.Test; + +class PPreguntaCerradaOpcionTest { + + @Test + void equalsVerifier() throws Exception { + TestUtil.equalsVerifier(PPreguntaCerradaOpcion.class); + PPreguntaCerradaOpcion pPreguntaCerradaOpcion1 = new PPreguntaCerradaOpcion(); + pPreguntaCerradaOpcion1.setId(1L); + PPreguntaCerradaOpcion pPreguntaCerradaOpcion2 = new PPreguntaCerradaOpcion(); + pPreguntaCerradaOpcion2.setId(pPreguntaCerradaOpcion1.getId()); + assertThat(pPreguntaCerradaOpcion1).isEqualTo(pPreguntaCerradaOpcion2); + pPreguntaCerradaOpcion2.setId(2L); + assertThat(pPreguntaCerradaOpcion1).isNotEqualTo(pPreguntaCerradaOpcion2); + pPreguntaCerradaOpcion1.setId(null); + assertThat(pPreguntaCerradaOpcion1).isNotEqualTo(pPreguntaCerradaOpcion2); + } +} diff --git a/src/test/java/org/datasurvey/domain/PPreguntaCerradaTest.java b/src/test/java/org/datasurvey/domain/PPreguntaCerradaTest.java new file mode 100644 index 0000000..bdce7a4 --- /dev/null +++ b/src/test/java/org/datasurvey/domain/PPreguntaCerradaTest.java @@ -0,0 +1,23 @@ +package org.datasurvey.domain; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.datasurvey.web.rest.TestUtil; +import org.junit.jupiter.api.Test; + +class PPreguntaCerradaTest { + + @Test + void equalsVerifier() throws Exception { + TestUtil.equalsVerifier(PPreguntaCerrada.class); + PPreguntaCerrada pPreguntaCerrada1 = new PPreguntaCerrada(); + pPreguntaCerrada1.setId(1L); + PPreguntaCerrada pPreguntaCerrada2 = new PPreguntaCerrada(); + pPreguntaCerrada2.setId(pPreguntaCerrada1.getId()); + assertThat(pPreguntaCerrada1).isEqualTo(pPreguntaCerrada2); + pPreguntaCerrada2.setId(2L); + assertThat(pPreguntaCerrada1).isNotEqualTo(pPreguntaCerrada2); + pPreguntaCerrada1.setId(null); + assertThat(pPreguntaCerrada1).isNotEqualTo(pPreguntaCerrada2); + } +} diff --git a/src/test/java/org/datasurvey/domain/ParametroAplicacionTest.java b/src/test/java/org/datasurvey/domain/ParametroAplicacionTest.java new file mode 100644 index 0000000..c3f744d --- /dev/null +++ b/src/test/java/org/datasurvey/domain/ParametroAplicacionTest.java @@ -0,0 +1,23 @@ +package org.datasurvey.domain; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.datasurvey.web.rest.TestUtil; +import org.junit.jupiter.api.Test; + +class ParametroAplicacionTest { + + @Test + void equalsVerifier() throws Exception { + TestUtil.equalsVerifier(ParametroAplicacion.class); + ParametroAplicacion parametroAplicacion1 = new ParametroAplicacion(); + parametroAplicacion1.setId(1L); + ParametroAplicacion parametroAplicacion2 = new ParametroAplicacion(); + parametroAplicacion2.setId(parametroAplicacion1.getId()); + assertThat(parametroAplicacion1).isEqualTo(parametroAplicacion2); + parametroAplicacion2.setId(2L); + assertThat(parametroAplicacion1).isNotEqualTo(parametroAplicacion2); + parametroAplicacion1.setId(null); + assertThat(parametroAplicacion1).isNotEqualTo(parametroAplicacion2); + } +} diff --git a/src/test/java/org/datasurvey/domain/PlantillaTest.java b/src/test/java/org/datasurvey/domain/PlantillaTest.java new file mode 100644 index 0000000..cdc0df4 --- /dev/null +++ b/src/test/java/org/datasurvey/domain/PlantillaTest.java @@ -0,0 +1,23 @@ +package org.datasurvey.domain; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.datasurvey.web.rest.TestUtil; +import org.junit.jupiter.api.Test; + +class PlantillaTest { + + @Test + void equalsVerifier() throws Exception { + TestUtil.equalsVerifier(Plantilla.class); + Plantilla plantilla1 = new Plantilla(); + plantilla1.setId(1L); + Plantilla plantilla2 = new Plantilla(); + plantilla2.setId(plantilla1.getId()); + assertThat(plantilla1).isEqualTo(plantilla2); + plantilla2.setId(2L); + assertThat(plantilla1).isNotEqualTo(plantilla2); + plantilla1.setId(null); + assertThat(plantilla1).isNotEqualTo(plantilla2); + } +} diff --git a/src/test/java/org/datasurvey/domain/UsuarioEncuestaTest.java b/src/test/java/org/datasurvey/domain/UsuarioEncuestaTest.java new file mode 100644 index 0000000..5058cfa --- /dev/null +++ b/src/test/java/org/datasurvey/domain/UsuarioEncuestaTest.java @@ -0,0 +1,23 @@ +package org.datasurvey.domain; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.datasurvey.web.rest.TestUtil; +import org.junit.jupiter.api.Test; + +class UsuarioEncuestaTest { + + @Test + void equalsVerifier() throws Exception { + TestUtil.equalsVerifier(UsuarioEncuesta.class); + UsuarioEncuesta usuarioEncuesta1 = new UsuarioEncuesta(); + usuarioEncuesta1.setId(1L); + UsuarioEncuesta usuarioEncuesta2 = new UsuarioEncuesta(); + usuarioEncuesta2.setId(usuarioEncuesta1.getId()); + assertThat(usuarioEncuesta1).isEqualTo(usuarioEncuesta2); + usuarioEncuesta2.setId(2L); + assertThat(usuarioEncuesta1).isNotEqualTo(usuarioEncuesta2); + usuarioEncuesta1.setId(null); + assertThat(usuarioEncuesta1).isNotEqualTo(usuarioEncuesta2); + } +} diff --git a/src/test/java/org/datasurvey/domain/UsuarioExtraTest.java b/src/test/java/org/datasurvey/domain/UsuarioExtraTest.java new file mode 100644 index 0000000..5c55a8f --- /dev/null +++ b/src/test/java/org/datasurvey/domain/UsuarioExtraTest.java @@ -0,0 +1,23 @@ +package org.datasurvey.domain; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.datasurvey.web.rest.TestUtil; +import org.junit.jupiter.api.Test; + +class UsuarioExtraTest { + + @Test + void equalsVerifier() throws Exception { + TestUtil.equalsVerifier(UsuarioExtra.class); + UsuarioExtra usuarioExtra1 = new UsuarioExtra(); + usuarioExtra1.setId(1L); + UsuarioExtra usuarioExtra2 = new UsuarioExtra(); + usuarioExtra2.setId(usuarioExtra1.getId()); + assertThat(usuarioExtra1).isEqualTo(usuarioExtra2); + usuarioExtra2.setId(2L); + assertThat(usuarioExtra1).isNotEqualTo(usuarioExtra2); + usuarioExtra1.setId(null); + assertThat(usuarioExtra1).isNotEqualTo(usuarioExtra2); + } +} diff --git a/src/test/java/org/datasurvey/repository/timezone/DateTimeWrapper.java b/src/test/java/org/datasurvey/repository/timezone/DateTimeWrapper.java new file mode 100644 index 0000000..0f42b60 --- /dev/null +++ b/src/test/java/org/datasurvey/repository/timezone/DateTimeWrapper.java @@ -0,0 +1,132 @@ +package org.datasurvey.repository.timezone; + +import java.io.Serializable; +import java.time.*; +import java.util.Objects; +import javax.persistence.*; + +@Entity +@Table(name = "jhi_date_time_wrapper") +public class DateTimeWrapper implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "instant") + private Instant instant; + + @Column(name = "local_date_time") + private LocalDateTime localDateTime; + + @Column(name = "offset_date_time") + private OffsetDateTime offsetDateTime; + + @Column(name = "zoned_date_time") + private ZonedDateTime zonedDateTime; + + @Column(name = "local_time") + private LocalTime localTime; + + @Column(name = "offset_time") + private OffsetTime offsetTime; + + @Column(name = "local_date") + private LocalDate localDate; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Instant getInstant() { + return instant; + } + + public void setInstant(Instant instant) { + this.instant = instant; + } + + public LocalDateTime getLocalDateTime() { + return localDateTime; + } + + public void setLocalDateTime(LocalDateTime localDateTime) { + this.localDateTime = localDateTime; + } + + public OffsetDateTime getOffsetDateTime() { + return offsetDateTime; + } + + public void setOffsetDateTime(OffsetDateTime offsetDateTime) { + this.offsetDateTime = offsetDateTime; + } + + public ZonedDateTime getZonedDateTime() { + return zonedDateTime; + } + + public void setZonedDateTime(ZonedDateTime zonedDateTime) { + this.zonedDateTime = zonedDateTime; + } + + public LocalTime getLocalTime() { + return localTime; + } + + public void setLocalTime(LocalTime localTime) { + this.localTime = localTime; + } + + public OffsetTime getOffsetTime() { + return offsetTime; + } + + public void setOffsetTime(OffsetTime offsetTime) { + this.offsetTime = offsetTime; + } + + public LocalDate getLocalDate() { + return localDate; + } + + public void setLocalDate(LocalDate localDate) { + this.localDate = localDate; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + DateTimeWrapper dateTimeWrapper = (DateTimeWrapper) o; + return !(dateTimeWrapper.getId() == null || getId() == null) && Objects.equals(getId(), dateTimeWrapper.getId()); + } + + @Override + public int hashCode() { + return Objects.hashCode(getId()); + } + + // prettier-ignore + @Override + public String toString() { + return "TimeZoneTest{" + + "id=" + id + + ", instant=" + instant + + ", localDateTime=" + localDateTime + + ", offsetDateTime=" + offsetDateTime + + ", zonedDateTime=" + zonedDateTime + + '}'; + } +} diff --git a/src/test/java/org/datasurvey/repository/timezone/DateTimeWrapperRepository.java b/src/test/java/org/datasurvey/repository/timezone/DateTimeWrapperRepository.java new file mode 100644 index 0000000..1459302 --- /dev/null +++ b/src/test/java/org/datasurvey/repository/timezone/DateTimeWrapperRepository.java @@ -0,0 +1,10 @@ +package org.datasurvey.repository.timezone; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +/** + * Spring Data JPA repository for the {@link DateTimeWrapper} entity. + */ +@Repository +public interface DateTimeWrapperRepository extends JpaRepository {} diff --git a/src/test/java/org/datasurvey/security/DomainUserDetailsServiceIT.java b/src/test/java/org/datasurvey/security/DomainUserDetailsServiceIT.java new file mode 100644 index 0000000..0c16f8b --- /dev/null +++ b/src/test/java/org/datasurvey/security/DomainUserDetailsServiceIT.java @@ -0,0 +1,111 @@ +package org.datasurvey.security; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; + +import java.util.Locale; +import org.apache.commons.lang3.RandomStringUtils; +import org.datasurvey.IntegrationTest; +import org.datasurvey.domain.User; +import org.datasurvey.repository.UserRepository; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.transaction.annotation.Transactional; + +/** + * Integrations tests for {@link DomainUserDetailsService}. + */ +@Transactional +@IntegrationTest +class DomainUserDetailsServiceIT { + + private static final String USER_ONE_LOGIN = "test-user-one"; + private static final String USER_ONE_EMAIL = "test-user-one@localhost"; + private static final String USER_TWO_LOGIN = "test-user-two"; + private static final String USER_TWO_EMAIL = "test-user-two@localhost"; + private static final String USER_THREE_LOGIN = "test-user-three"; + private static final String USER_THREE_EMAIL = "test-user-three@localhost"; + + @Autowired + private UserRepository userRepository; + + @Autowired + private UserDetailsService domainUserDetailsService; + + @BeforeEach + public void init() { + User userOne = new User(); + userOne.setLogin(USER_ONE_LOGIN); + userOne.setPassword(RandomStringUtils.random(60)); + userOne.setActivated(true); + userOne.setEmail(USER_ONE_EMAIL); + userOne.setFirstName("userOne"); + userOne.setLastName("doe"); + userOne.setLangKey("en"); + userRepository.save(userOne); + + User userTwo = new User(); + userTwo.setLogin(USER_TWO_LOGIN); + userTwo.setPassword(RandomStringUtils.random(60)); + userTwo.setActivated(true); + userTwo.setEmail(USER_TWO_EMAIL); + userTwo.setFirstName("userTwo"); + userTwo.setLastName("doe"); + userTwo.setLangKey("en"); + userRepository.save(userTwo); + + User userThree = new User(); + userThree.setLogin(USER_THREE_LOGIN); + userThree.setPassword(RandomStringUtils.random(60)); + userThree.setActivated(false); + userThree.setEmail(USER_THREE_EMAIL); + userThree.setFirstName("userThree"); + userThree.setLastName("doe"); + userThree.setLangKey("en"); + userRepository.save(userThree); + } + + @Test + void assertThatUserCanBeFoundByLogin() { + UserDetails userDetails = domainUserDetailsService.loadUserByUsername(USER_ONE_LOGIN); + assertThat(userDetails).isNotNull(); + assertThat(userDetails.getUsername()).isEqualTo(USER_ONE_LOGIN); + } + + @Test + void assertThatUserCanBeFoundByLoginIgnoreCase() { + UserDetails userDetails = domainUserDetailsService.loadUserByUsername(USER_ONE_LOGIN.toUpperCase(Locale.ENGLISH)); + assertThat(userDetails).isNotNull(); + assertThat(userDetails.getUsername()).isEqualTo(USER_ONE_LOGIN); + } + + @Test + void assertThatUserCanBeFoundByEmail() { + UserDetails userDetails = domainUserDetailsService.loadUserByUsername(USER_TWO_EMAIL); + assertThat(userDetails).isNotNull(); + assertThat(userDetails.getUsername()).isEqualTo(USER_TWO_LOGIN); + } + + @Test + void assertThatUserCanBeFoundByEmailIgnoreCase() { + UserDetails userDetails = domainUserDetailsService.loadUserByUsername(USER_TWO_EMAIL.toUpperCase(Locale.ENGLISH)); + assertThat(userDetails).isNotNull(); + assertThat(userDetails.getUsername()).isEqualTo(USER_TWO_LOGIN); + } + + @Test + void assertThatEmailIsPrioritizedOverLogin() { + UserDetails userDetails = domainUserDetailsService.loadUserByUsername(USER_ONE_EMAIL); + assertThat(userDetails).isNotNull(); + assertThat(userDetails.getUsername()).isEqualTo(USER_ONE_LOGIN); + } + + @Test + void assertThatUserNotActivatedExceptionIsThrownForNotActivatedUsers() { + assertThatExceptionOfType(UserNotActivatedException.class) + .isThrownBy(() -> domainUserDetailsService.loadUserByUsername(USER_THREE_LOGIN)); + } +} diff --git a/src/test/java/org/datasurvey/security/SecurityUtilsUnitTest.java b/src/test/java/org/datasurvey/security/SecurityUtilsUnitTest.java new file mode 100644 index 0000000..3144aaf --- /dev/null +++ b/src/test/java/org/datasurvey/security/SecurityUtilsUnitTest.java @@ -0,0 +1,77 @@ +package org.datasurvey.security; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Optional; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; + +/** + * Test class for the {@link SecurityUtils} utility class. + */ +class SecurityUtilsUnitTest { + + @BeforeEach + @AfterEach + void cleanup() { + SecurityContextHolder.clearContext(); + } + + @Test + void testGetCurrentUserLogin() { + SecurityContext securityContext = SecurityContextHolder.createEmptyContext(); + securityContext.setAuthentication(new UsernamePasswordAuthenticationToken("admin", "admin")); + SecurityContextHolder.setContext(securityContext); + Optional login = SecurityUtils.getCurrentUserLogin(); + assertThat(login).contains("admin"); + } + + @Test + void testGetCurrentUserJWT() { + SecurityContext securityContext = SecurityContextHolder.createEmptyContext(); + securityContext.setAuthentication(new UsernamePasswordAuthenticationToken("admin", "token")); + SecurityContextHolder.setContext(securityContext); + Optional jwt = SecurityUtils.getCurrentUserJWT(); + assertThat(jwt).contains("token"); + } + + @Test + void testIsAuthenticated() { + SecurityContext securityContext = SecurityContextHolder.createEmptyContext(); + securityContext.setAuthentication(new UsernamePasswordAuthenticationToken("admin", "admin")); + SecurityContextHolder.setContext(securityContext); + boolean isAuthenticated = SecurityUtils.isAuthenticated(); + assertThat(isAuthenticated).isTrue(); + } + + @Test + void testAnonymousIsNotAuthenticated() { + SecurityContext securityContext = SecurityContextHolder.createEmptyContext(); + Collection authorities = new ArrayList<>(); + authorities.add(new SimpleGrantedAuthority(AuthoritiesConstants.ANONYMOUS)); + securityContext.setAuthentication(new UsernamePasswordAuthenticationToken("anonymous", "anonymous", authorities)); + SecurityContextHolder.setContext(securityContext); + boolean isAuthenticated = SecurityUtils.isAuthenticated(); + assertThat(isAuthenticated).isFalse(); + } + + @Test + void testHasCurrentUserThisAuthority() { + SecurityContext securityContext = SecurityContextHolder.createEmptyContext(); + Collection authorities = new ArrayList<>(); + authorities.add(new SimpleGrantedAuthority(AuthoritiesConstants.USER)); + securityContext.setAuthentication(new UsernamePasswordAuthenticationToken("user", "user", authorities)); + SecurityContextHolder.setContext(securityContext); + + assertThat(SecurityUtils.hasCurrentUserThisAuthority(AuthoritiesConstants.USER)).isTrue(); + assertThat(SecurityUtils.hasCurrentUserThisAuthority(AuthoritiesConstants.ADMIN)).isFalse(); + } +} diff --git a/src/test/java/org/datasurvey/security/jwt/JWTFilterTest.java b/src/test/java/org/datasurvey/security/jwt/JWTFilterTest.java new file mode 100644 index 0000000..9e89463 --- /dev/null +++ b/src/test/java/org/datasurvey/security/jwt/JWTFilterTest.java @@ -0,0 +1,112 @@ +package org.datasurvey.security.jwt; + +import static org.assertj.core.api.Assertions.assertThat; + +import io.jsonwebtoken.io.Decoders; +import io.jsonwebtoken.security.Keys; +import java.util.Collections; +import org.datasurvey.security.AuthoritiesConstants; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.http.HttpStatus; +import org.springframework.mock.web.MockFilterChain; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.mock.web.MockHttpServletResponse; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.test.util.ReflectionTestUtils; +import tech.jhipster.config.JHipsterProperties; + +class JWTFilterTest { + + private TokenProvider tokenProvider; + + private JWTFilter jwtFilter; + + @BeforeEach + public void setup() { + JHipsterProperties jHipsterProperties = new JHipsterProperties(); + String base64Secret = "fd54a45s65fds737b9aafcb3412e07ed99b267f33413274720ddbb7f6c5e64e9f14075f2d7ed041592f0b7657baf8"; + jHipsterProperties.getSecurity().getAuthentication().getJwt().setBase64Secret(base64Secret); + tokenProvider = new TokenProvider(jHipsterProperties); + ReflectionTestUtils.setField(tokenProvider, "key", Keys.hmacShaKeyFor(Decoders.BASE64.decode(base64Secret))); + + ReflectionTestUtils.setField(tokenProvider, "tokenValidityInMilliseconds", 60000); + jwtFilter = new JWTFilter(tokenProvider); + SecurityContextHolder.getContext().setAuthentication(null); + } + + @Test + void testJWTFilter() throws Exception { + UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken( + "test-user", + "test-password", + Collections.singletonList(new SimpleGrantedAuthority(AuthoritiesConstants.USER)) + ); + String jwt = tokenProvider.createToken(authentication, false); + MockHttpServletRequest request = new MockHttpServletRequest(); + request.addHeader(JWTFilter.AUTHORIZATION_HEADER, "Bearer " + jwt); + request.setRequestURI("/api/test"); + MockHttpServletResponse response = new MockHttpServletResponse(); + MockFilterChain filterChain = new MockFilterChain(); + jwtFilter.doFilter(request, response, filterChain); + assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value()); + assertThat(SecurityContextHolder.getContext().getAuthentication().getName()).isEqualTo("test-user"); + assertThat(SecurityContextHolder.getContext().getAuthentication().getCredentials()).hasToString(jwt); + } + + @Test + void testJWTFilterInvalidToken() throws Exception { + String jwt = "wrong_jwt"; + MockHttpServletRequest request = new MockHttpServletRequest(); + request.addHeader(JWTFilter.AUTHORIZATION_HEADER, "Bearer " + jwt); + request.setRequestURI("/api/test"); + MockHttpServletResponse response = new MockHttpServletResponse(); + MockFilterChain filterChain = new MockFilterChain(); + jwtFilter.doFilter(request, response, filterChain); + assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value()); + assertThat(SecurityContextHolder.getContext().getAuthentication()).isNull(); + } + + @Test + void testJWTFilterMissingAuthorization() throws Exception { + MockHttpServletRequest request = new MockHttpServletRequest(); + request.setRequestURI("/api/test"); + MockHttpServletResponse response = new MockHttpServletResponse(); + MockFilterChain filterChain = new MockFilterChain(); + jwtFilter.doFilter(request, response, filterChain); + assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value()); + assertThat(SecurityContextHolder.getContext().getAuthentication()).isNull(); + } + + @Test + void testJWTFilterMissingToken() throws Exception { + MockHttpServletRequest request = new MockHttpServletRequest(); + request.addHeader(JWTFilter.AUTHORIZATION_HEADER, "Bearer "); + request.setRequestURI("/api/test"); + MockHttpServletResponse response = new MockHttpServletResponse(); + MockFilterChain filterChain = new MockFilterChain(); + jwtFilter.doFilter(request, response, filterChain); + assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value()); + assertThat(SecurityContextHolder.getContext().getAuthentication()).isNull(); + } + + @Test + void testJWTFilterWrongScheme() throws Exception { + UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken( + "test-user", + "test-password", + Collections.singletonList(new SimpleGrantedAuthority(AuthoritiesConstants.USER)) + ); + String jwt = tokenProvider.createToken(authentication, false); + MockHttpServletRequest request = new MockHttpServletRequest(); + request.addHeader(JWTFilter.AUTHORIZATION_HEADER, "Basic " + jwt); + request.setRequestURI("/api/test"); + MockHttpServletResponse response = new MockHttpServletResponse(); + MockFilterChain filterChain = new MockFilterChain(); + jwtFilter.doFilter(request, response, filterChain); + assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value()); + assertThat(SecurityContextHolder.getContext().getAuthentication()).isNull(); + } +} diff --git a/src/test/java/org/datasurvey/security/jwt/TokenProviderTest.java b/src/test/java/org/datasurvey/security/jwt/TokenProviderTest.java new file mode 100644 index 0000000..ebb6a20 --- /dev/null +++ b/src/test/java/org/datasurvey/security/jwt/TokenProviderTest.java @@ -0,0 +1,132 @@ +package org.datasurvey.security.jwt; + +import static org.assertj.core.api.Assertions.assertThat; + +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; +import io.jsonwebtoken.io.Decoders; +import io.jsonwebtoken.security.Keys; +import java.nio.charset.StandardCharsets; +import java.security.Key; +import java.util.*; +import org.datasurvey.security.AuthoritiesConstants; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.test.util.ReflectionTestUtils; +import tech.jhipster.config.JHipsterProperties; + +class TokenProviderTest { + + private static final long ONE_MINUTE = 60000; + + private Key key; + private TokenProvider tokenProvider; + + @BeforeEach + public void setup() { + JHipsterProperties jHipsterProperties = new JHipsterProperties(); + String base64Secret = "fd54a45s65fds737b9aafcb3412e07ed99b267f33413274720ddbb7f6c5e64e9f14075f2d7ed041592f0b7657baf8"; + jHipsterProperties.getSecurity().getAuthentication().getJwt().setBase64Secret(base64Secret); + tokenProvider = new TokenProvider(jHipsterProperties); + key = Keys.hmacShaKeyFor(Decoders.BASE64.decode(base64Secret)); + + ReflectionTestUtils.setField(tokenProvider, "key", key); + ReflectionTestUtils.setField(tokenProvider, "tokenValidityInMilliseconds", ONE_MINUTE); + } + + @Test + void testReturnFalseWhenJWThasInvalidSignature() { + boolean isTokenValid = tokenProvider.validateToken(createTokenWithDifferentSignature()); + + assertThat(isTokenValid).isFalse(); + } + + @Test + void testReturnFalseWhenJWTisMalformed() { + Authentication authentication = createAuthentication(); + String token = tokenProvider.createToken(authentication, false); + String invalidToken = token.substring(1); + boolean isTokenValid = tokenProvider.validateToken(invalidToken); + + assertThat(isTokenValid).isFalse(); + } + + @Test + void testReturnFalseWhenJWTisExpired() { + ReflectionTestUtils.setField(tokenProvider, "tokenValidityInMilliseconds", -ONE_MINUTE); + + Authentication authentication = createAuthentication(); + String token = tokenProvider.createToken(authentication, false); + + boolean isTokenValid = tokenProvider.validateToken(token); + + assertThat(isTokenValid).isFalse(); + } + + @Test + void testReturnFalseWhenJWTisUnsupported() { + String unsupportedToken = createUnsupportedToken(); + + boolean isTokenValid = tokenProvider.validateToken(unsupportedToken); + + assertThat(isTokenValid).isFalse(); + } + + @Test + void testReturnFalseWhenJWTisInvalid() { + boolean isTokenValid = tokenProvider.validateToken(""); + + assertThat(isTokenValid).isFalse(); + } + + @Test + void testKeyIsSetFromSecretWhenSecretIsNotEmpty() { + final String secret = "NwskoUmKHZtzGRKJKVjsJF7BtQMMxNWi"; + JHipsterProperties jHipsterProperties = new JHipsterProperties(); + jHipsterProperties.getSecurity().getAuthentication().getJwt().setSecret(secret); + + TokenProvider tokenProvider = new TokenProvider(jHipsterProperties); + + Key key = (Key) ReflectionTestUtils.getField(tokenProvider, "key"); + assertThat(key).isNotNull().isEqualTo(Keys.hmacShaKeyFor(secret.getBytes(StandardCharsets.UTF_8))); + } + + @Test + void testKeyIsSetFromBase64SecretWhenSecretIsEmpty() { + final String base64Secret = "fd54a45s65fds737b9aafcb3412e07ed99b267f33413274720ddbb7f6c5e64e9f14075f2d7ed041592f0b7657baf8"; + JHipsterProperties jHipsterProperties = new JHipsterProperties(); + jHipsterProperties.getSecurity().getAuthentication().getJwt().setBase64Secret(base64Secret); + + TokenProvider tokenProvider = new TokenProvider(jHipsterProperties); + + Key key = (Key) ReflectionTestUtils.getField(tokenProvider, "key"); + assertThat(key).isNotNull().isEqualTo(Keys.hmacShaKeyFor(Decoders.BASE64.decode(base64Secret))); + } + + private Authentication createAuthentication() { + Collection authorities = new ArrayList<>(); + authorities.add(new SimpleGrantedAuthority(AuthoritiesConstants.ANONYMOUS)); + return new UsernamePasswordAuthenticationToken("anonymous", "anonymous", authorities); + } + + private String createUnsupportedToken() { + return Jwts.builder().setPayload("payload").signWith(key, SignatureAlgorithm.HS512).compact(); + } + + private String createTokenWithDifferentSignature() { + Key otherKey = Keys.hmacShaKeyFor( + Decoders.BASE64.decode("Xfd54a45s65fds737b9aafcb3412e07ed99b267f33413274720ddbb7f6c5e64e9f14075f2d7ed041592f0b7657baf8") + ); + + return Jwts + .builder() + .setSubject("anonymous") + .signWith(otherKey, SignatureAlgorithm.HS512) + .setExpiration(new Date(new Date().getTime() + ONE_MINUTE)) + .compact(); + } +} diff --git a/src/test/java/org/datasurvey/service/MailServiceIT.java b/src/test/java/org/datasurvey/service/MailServiceIT.java new file mode 100644 index 0000000..04ee867 --- /dev/null +++ b/src/test/java/org/datasurvey/service/MailServiceIT.java @@ -0,0 +1,244 @@ +package org.datasurvey.service; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.*; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStreamReader; +import java.net.URI; +import java.net.URL; +import java.nio.charset.Charset; +import java.util.Properties; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import javax.mail.Multipart; +import javax.mail.internet.MimeBodyPart; +import javax.mail.internet.MimeMessage; +import javax.mail.internet.MimeMultipart; +import org.datasurvey.IntegrationTest; +import org.datasurvey.config.Constants; +import org.datasurvey.domain.User; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; +import org.mockito.MockitoAnnotations; +import org.mockito.Spy; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.MessageSource; +import org.springframework.mail.MailSendException; +import org.springframework.mail.javamail.JavaMailSenderImpl; +import org.thymeleaf.spring5.SpringTemplateEngine; +import tech.jhipster.config.JHipsterProperties; + +/** + * Integration tests for {@link MailService}. + */ +@IntegrationTest +class MailServiceIT { + + private static final String[] languages = { + "es", + // jhipster-needle-i18n-language-constant - JHipster will add/remove languages in this array + }; + private static final Pattern PATTERN_LOCALE_3 = Pattern.compile("([a-z]{2})-([a-zA-Z]{4})-([a-z]{2})"); + private static final Pattern PATTERN_LOCALE_2 = Pattern.compile("([a-z]{2})-([a-z]{2})"); + + @Autowired + private JHipsterProperties jHipsterProperties; + + @Autowired + private MessageSource messageSource; + + @Autowired + private SpringTemplateEngine templateEngine; + + @Spy + private JavaMailSenderImpl javaMailSender; + + @Captor + private ArgumentCaptor messageCaptor; + + private MailService mailService; + + @BeforeEach + public void setup() { + MockitoAnnotations.initMocks(this); + doNothing().when(javaMailSender).send(any(MimeMessage.class)); + mailService = new MailService(jHipsterProperties, javaMailSender, messageSource, templateEngine); + } + + @Test + void testSendEmail() throws Exception { + mailService.sendEmail("john.doe@example.com", "testSubject", "testContent", false, false); + verify(javaMailSender).send(messageCaptor.capture()); + MimeMessage message = messageCaptor.getValue(); + assertThat(message.getSubject()).isEqualTo("testSubject"); + assertThat(message.getAllRecipients()[0]).hasToString("john.doe@example.com"); + assertThat(message.getFrom()[0]).hasToString(jHipsterProperties.getMail().getFrom()); + assertThat(message.getContent()).isInstanceOf(String.class); + assertThat(message.getContent()).hasToString("testContent"); + assertThat(message.getDataHandler().getContentType()).isEqualTo("text/plain; charset=UTF-8"); + } + + @Test + void testSendHtmlEmail() throws Exception { + mailService.sendEmail("john.doe@example.com", "testSubject", "testContent", false, true); + verify(javaMailSender).send(messageCaptor.capture()); + MimeMessage message = messageCaptor.getValue(); + assertThat(message.getSubject()).isEqualTo("testSubject"); + assertThat(message.getAllRecipients()[0]).hasToString("john.doe@example.com"); + assertThat(message.getFrom()[0]).hasToString(jHipsterProperties.getMail().getFrom()); + assertThat(message.getContent()).isInstanceOf(String.class); + assertThat(message.getContent()).hasToString("testContent"); + assertThat(message.getDataHandler().getContentType()).isEqualTo("text/html;charset=UTF-8"); + } + + @Test + void testSendMultipartEmail() throws Exception { + mailService.sendEmail("john.doe@example.com", "testSubject", "testContent", true, false); + verify(javaMailSender).send(messageCaptor.capture()); + MimeMessage message = messageCaptor.getValue(); + MimeMultipart mp = (MimeMultipart) message.getContent(); + MimeBodyPart part = (MimeBodyPart) ((MimeMultipart) mp.getBodyPart(0).getContent()).getBodyPart(0); + ByteArrayOutputStream aos = new ByteArrayOutputStream(); + part.writeTo(aos); + assertThat(message.getSubject()).isEqualTo("testSubject"); + assertThat(message.getAllRecipients()[0]).hasToString("john.doe@example.com"); + assertThat(message.getFrom()[0]).hasToString(jHipsterProperties.getMail().getFrom()); + assertThat(message.getContent()).isInstanceOf(Multipart.class); + assertThat(aos).hasToString("\r\ntestContent"); + assertThat(part.getDataHandler().getContentType()).isEqualTo("text/plain; charset=UTF-8"); + } + + @Test + void testSendMultipartHtmlEmail() throws Exception { + mailService.sendEmail("john.doe@example.com", "testSubject", "testContent", true, true); + verify(javaMailSender).send(messageCaptor.capture()); + MimeMessage message = messageCaptor.getValue(); + MimeMultipart mp = (MimeMultipart) message.getContent(); + MimeBodyPart part = (MimeBodyPart) ((MimeMultipart) mp.getBodyPart(0).getContent()).getBodyPart(0); + ByteArrayOutputStream aos = new ByteArrayOutputStream(); + part.writeTo(aos); + assertThat(message.getSubject()).isEqualTo("testSubject"); + assertThat(message.getAllRecipients()[0]).hasToString("john.doe@example.com"); + assertThat(message.getFrom()[0]).hasToString(jHipsterProperties.getMail().getFrom()); + assertThat(message.getContent()).isInstanceOf(Multipart.class); + assertThat(aos).hasToString("\r\ntestContent"); + assertThat(part.getDataHandler().getContentType()).isEqualTo("text/html;charset=UTF-8"); + } + + @Test + void testSendEmailFromTemplate() throws Exception { + User user = new User(); + user.setLogin("john"); + user.setEmail("john.doe@example.com"); + user.setLangKey("en"); + mailService.sendEmailFromTemplate(user, "mail/testEmail", "email.test.title"); + verify(javaMailSender).send(messageCaptor.capture()); + MimeMessage message = messageCaptor.getValue(); + assertThat(message.getSubject()).isEqualTo("test title"); + assertThat(message.getAllRecipients()[0]).hasToString(user.getEmail()); + assertThat(message.getFrom()[0]).hasToString(jHipsterProperties.getMail().getFrom()); + assertThat(message.getContent().toString()).isEqualToNormalizingNewlines("test title, http://127.0.0.1:8080, john\n"); + assertThat(message.getDataHandler().getContentType()).isEqualTo("text/html;charset=UTF-8"); + } + + @Test + void testSendActivationEmail() throws Exception { + User user = new User(); + user.setLangKey(Constants.DEFAULT_LANGUAGE); + user.setLogin("john"); + user.setEmail("john.doe@example.com"); + mailService.sendActivationEmail(user); + verify(javaMailSender).send(messageCaptor.capture()); + MimeMessage message = messageCaptor.getValue(); + assertThat(message.getAllRecipients()[0]).hasToString(user.getEmail()); + assertThat(message.getFrom()[0]).hasToString(jHipsterProperties.getMail().getFrom()); + assertThat(message.getContent().toString()).isNotEmpty(); + assertThat(message.getDataHandler().getContentType()).isEqualTo("text/html;charset=UTF-8"); + } + + @Test + void testCreationEmail() throws Exception { + User user = new User(); + user.setLangKey(Constants.DEFAULT_LANGUAGE); + user.setLogin("john"); + user.setEmail("john.doe@example.com"); + mailService.sendCreationEmail(user); + verify(javaMailSender).send(messageCaptor.capture()); + MimeMessage message = messageCaptor.getValue(); + assertThat(message.getAllRecipients()[0]).hasToString(user.getEmail()); + assertThat(message.getFrom()[0]).hasToString(jHipsterProperties.getMail().getFrom()); + assertThat(message.getContent().toString()).isNotEmpty(); + assertThat(message.getDataHandler().getContentType()).isEqualTo("text/html;charset=UTF-8"); + } + + @Test + void testSendPasswordResetMail() throws Exception { + User user = new User(); + user.setLangKey(Constants.DEFAULT_LANGUAGE); + user.setLogin("john"); + user.setEmail("john.doe@example.com"); + mailService.sendPasswordResetMail(user); + verify(javaMailSender).send(messageCaptor.capture()); + MimeMessage message = messageCaptor.getValue(); + assertThat(message.getAllRecipients()[0]).hasToString(user.getEmail()); + assertThat(message.getFrom()[0]).hasToString(jHipsterProperties.getMail().getFrom()); + assertThat(message.getContent().toString()).isNotEmpty(); + assertThat(message.getDataHandler().getContentType()).isEqualTo("text/html;charset=UTF-8"); + } + + @Test + void testSendEmailWithException() { + doThrow(MailSendException.class).when(javaMailSender).send(any(MimeMessage.class)); + try { + mailService.sendEmail("john.doe@example.com", "testSubject", "testContent", false, false); + } catch (Exception e) { + fail("Exception shouldn't have been thrown"); + } + } + + @Test + void testSendLocalizedEmailForAllSupportedLanguages() throws Exception { + User user = new User(); + user.setLogin("john"); + user.setEmail("john.doe@example.com"); + for (String langKey : languages) { + user.setLangKey(langKey); + mailService.sendEmailFromTemplate(user, "mail/testEmail", "email.test.title"); + verify(javaMailSender, atLeastOnce()).send(messageCaptor.capture()); + MimeMessage message = messageCaptor.getValue(); + + String propertyFilePath = "i18n/messages_" + getJavaLocale(langKey) + ".properties"; + URL resource = this.getClass().getClassLoader().getResource(propertyFilePath); + File file = new File(new URI(resource.getFile()).getPath()); + Properties properties = new Properties(); + properties.load(new InputStreamReader(new FileInputStream(file), Charset.forName("UTF-8"))); + + String emailTitle = (String) properties.get("email.test.title"); + assertThat(message.getSubject()).isEqualTo(emailTitle); + assertThat(message.getContent().toString()) + .isEqualToNormalizingNewlines("" + emailTitle + ", http://127.0.0.1:8080, john\n"); + } + } + + /** + * Convert a lang key to the Java locale. + */ + private String getJavaLocale(String langKey) { + String javaLangKey = langKey; + Matcher matcher2 = PATTERN_LOCALE_2.matcher(langKey); + if (matcher2.matches()) { + javaLangKey = matcher2.group(1) + "_" + matcher2.group(2).toUpperCase(); + } + Matcher matcher3 = PATTERN_LOCALE_3.matcher(langKey); + if (matcher3.matches()) { + javaLangKey = matcher3.group(1) + "_" + matcher3.group(2) + "_" + matcher3.group(3).toUpperCase(); + } + return javaLangKey; + } +} diff --git a/src/test/java/org/datasurvey/service/UserServiceIT.java b/src/test/java/org/datasurvey/service/UserServiceIT.java new file mode 100644 index 0000000..56d850f --- /dev/null +++ b/src/test/java/org/datasurvey/service/UserServiceIT.java @@ -0,0 +1,185 @@ +package org.datasurvey.service; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.when; + +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; +import java.util.List; +import java.util.Optional; +import org.apache.commons.lang3.RandomStringUtils; +import org.datasurvey.IntegrationTest; +import org.datasurvey.config.Constants; +import org.datasurvey.domain.User; +import org.datasurvey.repository.UserRepository; +import org.datasurvey.service.dto.AdminUserDTO; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.data.auditing.AuditingHandler; +import org.springframework.data.auditing.DateTimeProvider; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.transaction.annotation.Transactional; +import tech.jhipster.security.RandomUtil; + +/** + * Integration tests for {@link UserService}. + */ +@IntegrationTest +@Transactional +class UserServiceIT { + + private static final String DEFAULT_LOGIN = "johndoe"; + + private static final String DEFAULT_EMAIL = "johndoe@localhost"; + + private static final String DEFAULT_FIRSTNAME = "john"; + + private static final String DEFAULT_LASTNAME = "doe"; + + private static final String DEFAULT_IMAGEURL = "http://placehold.it/50x50"; + + private static final String DEFAULT_LANGKEY = "dummy"; + + @Autowired + private UserRepository userRepository; + + @Autowired + private UserService userService; + + @Autowired + private AuditingHandler auditingHandler; + + @MockBean + private DateTimeProvider dateTimeProvider; + + private User user; + + @BeforeEach + public void init() { + user = new User(); + user.setLogin(DEFAULT_LOGIN); + user.setPassword(RandomStringUtils.random(60)); + user.setActivated(true); + user.setEmail(DEFAULT_EMAIL); + user.setFirstName(DEFAULT_FIRSTNAME); + user.setLastName(DEFAULT_LASTNAME); + user.setImageUrl(DEFAULT_IMAGEURL); + user.setLangKey(DEFAULT_LANGKEY); + + when(dateTimeProvider.getNow()).thenReturn(Optional.of(LocalDateTime.now())); + auditingHandler.setDateTimeProvider(dateTimeProvider); + } + + @Test + @Transactional + void assertThatUserMustExistToResetPassword() { + userRepository.saveAndFlush(user); + Optional maybeUser = userService.requestPasswordReset("invalid.login@localhost"); + assertThat(maybeUser).isNotPresent(); + + maybeUser = userService.requestPasswordReset(user.getEmail()); + assertThat(maybeUser).isPresent(); + assertThat(maybeUser.orElse(null).getEmail()).isEqualTo(user.getEmail()); + assertThat(maybeUser.orElse(null).getResetDate()).isNotNull(); + assertThat(maybeUser.orElse(null).getResetKey()).isNotNull(); + } + + @Test + @Transactional + void assertThatOnlyActivatedUserCanRequestPasswordReset() { + user.setActivated(false); + userRepository.saveAndFlush(user); + + Optional maybeUser = userService.requestPasswordReset(user.getLogin()); + assertThat(maybeUser).isNotPresent(); + userRepository.delete(user); + } + + @Test + @Transactional + void assertThatResetKeyMustNotBeOlderThan24Hours() { + Instant daysAgo = Instant.now().minus(25, ChronoUnit.HOURS); + String resetKey = RandomUtil.generateResetKey(); + user.setActivated(true); + user.setResetDate(daysAgo); + user.setResetKey(resetKey); + userRepository.saveAndFlush(user); + + Optional maybeUser = userService.completePasswordReset("johndoe2", user.getResetKey()); + assertThat(maybeUser).isNotPresent(); + userRepository.delete(user); + } + + @Test + @Transactional + void assertThatResetKeyMustBeValid() { + Instant daysAgo = Instant.now().minus(25, ChronoUnit.HOURS); + user.setActivated(true); + user.setResetDate(daysAgo); + user.setResetKey("1234"); + userRepository.saveAndFlush(user); + + Optional maybeUser = userService.completePasswordReset("johndoe2", user.getResetKey()); + assertThat(maybeUser).isNotPresent(); + userRepository.delete(user); + } + + @Test + @Transactional + void assertThatUserCanResetPassword() { + String oldPassword = user.getPassword(); + Instant daysAgo = Instant.now().minus(2, ChronoUnit.HOURS); + String resetKey = RandomUtil.generateResetKey(); + user.setActivated(true); + user.setResetDate(daysAgo); + user.setResetKey(resetKey); + userRepository.saveAndFlush(user); + + Optional maybeUser = userService.completePasswordReset("johndoe2", user.getResetKey()); + assertThat(maybeUser).isPresent(); + assertThat(maybeUser.orElse(null).getResetDate()).isNull(); + assertThat(maybeUser.orElse(null).getResetKey()).isNull(); + assertThat(maybeUser.orElse(null).getPassword()).isNotEqualTo(oldPassword); + + userRepository.delete(user); + } + + @Test + @Transactional + void assertThatNotActivatedUsersWithNotNullActivationKeyCreatedBefore3DaysAreDeleted() { + Instant now = Instant.now(); + when(dateTimeProvider.getNow()).thenReturn(Optional.of(now.minus(4, ChronoUnit.DAYS))); + user.setActivated(false); + user.setActivationKey(RandomStringUtils.random(20)); + User dbUser = userRepository.saveAndFlush(user); + dbUser.setCreatedDate(now.minus(4, ChronoUnit.DAYS)); + userRepository.saveAndFlush(user); + Instant threeDaysAgo = now.minus(3, ChronoUnit.DAYS); + List users = userRepository.findAllByActivatedIsFalseAndActivationKeyIsNotNullAndCreatedDateBefore(threeDaysAgo); + assertThat(users).isNotEmpty(); + userService.removeNotActivatedUsers(); + users = userRepository.findAllByActivatedIsFalseAndActivationKeyIsNotNullAndCreatedDateBefore(threeDaysAgo); + assertThat(users).isEmpty(); + } + + @Test + @Transactional + void assertThatNotActivatedUsersWithNullActivationKeyCreatedBefore3DaysAreNotDeleted() { + Instant now = Instant.now(); + when(dateTimeProvider.getNow()).thenReturn(Optional.of(now.minus(4, ChronoUnit.DAYS))); + user.setActivated(false); + User dbUser = userRepository.saveAndFlush(user); + dbUser.setCreatedDate(now.minus(4, ChronoUnit.DAYS)); + userRepository.saveAndFlush(user); + Instant threeDaysAgo = now.minus(3, ChronoUnit.DAYS); + List users = userRepository.findAllByActivatedIsFalseAndActivationKeyIsNotNullAndCreatedDateBefore(threeDaysAgo); + assertThat(users).isEmpty(); + userService.removeNotActivatedUsers(); + Optional maybeDbUser = userRepository.findById(dbUser.getId()); + assertThat(maybeDbUser).contains(dbUser); + } +} diff --git a/src/test/java/org/datasurvey/service/mapper/UserMapperTest.java b/src/test/java/org/datasurvey/service/mapper/UserMapperTest.java new file mode 100644 index 0000000..f135bdc --- /dev/null +++ b/src/test/java/org/datasurvey/service/mapper/UserMapperTest.java @@ -0,0 +1,132 @@ +package org.datasurvey.service.mapper; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import org.apache.commons.lang3.RandomStringUtils; +import org.datasurvey.domain.User; +import org.datasurvey.service.dto.AdminUserDTO; +import org.datasurvey.service.dto.UserDTO; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +/** + * Unit tests for {@link UserMapper}. + */ +class UserMapperTest { + + private static final String DEFAULT_LOGIN = "johndoe"; + private static final Long DEFAULT_ID = 1L; + + private UserMapper userMapper; + private User user; + private AdminUserDTO userDto; + + @BeforeEach + public void init() { + userMapper = new UserMapper(); + user = new User(); + user.setLogin(DEFAULT_LOGIN); + user.setPassword(RandomStringUtils.random(60)); + user.setActivated(true); + user.setEmail("johndoe@localhost"); + user.setFirstName("john"); + user.setLastName("doe"); + user.setImageUrl("image_url"); + user.setLangKey("en"); + + userDto = new AdminUserDTO(user); + } + + @Test + void usersToUserDTOsShouldMapOnlyNonNullUsers() { + List users = new ArrayList<>(); + users.add(user); + users.add(null); + + List userDTOS = userMapper.usersToUserDTOs(users); + + assertThat(userDTOS).isNotEmpty().size().isEqualTo(1); + } + + @Test + void userDTOsToUsersShouldMapOnlyNonNullUsers() { + List usersDto = new ArrayList<>(); + usersDto.add(userDto); + usersDto.add(null); + + List users = userMapper.userDTOsToUsers(usersDto); + + assertThat(users).isNotEmpty().size().isEqualTo(1); + } + + @Test + void userDTOsToUsersWithAuthoritiesStringShouldMapToUsersWithAuthoritiesDomain() { + Set authoritiesAsString = new HashSet<>(); + authoritiesAsString.add("ADMIN"); + userDto.setAuthorities(authoritiesAsString); + + List usersDto = new ArrayList<>(); + usersDto.add(userDto); + + List users = userMapper.userDTOsToUsers(usersDto); + + assertThat(users).isNotEmpty().size().isEqualTo(1); + assertThat(users.get(0).getAuthorities()).isNotNull(); + assertThat(users.get(0).getAuthorities()).isNotEmpty(); + assertThat(users.get(0).getAuthorities().iterator().next().getName()).isEqualTo("ADMIN"); + } + + @Test + void userDTOsToUsersMapWithNullAuthoritiesStringShouldReturnUserWithEmptyAuthorities() { + userDto.setAuthorities(null); + + List usersDto = new ArrayList<>(); + usersDto.add(userDto); + + List users = userMapper.userDTOsToUsers(usersDto); + + assertThat(users).isNotEmpty().size().isEqualTo(1); + assertThat(users.get(0).getAuthorities()).isNotNull(); + assertThat(users.get(0).getAuthorities()).isEmpty(); + } + + @Test + void userDTOToUserMapWithAuthoritiesStringShouldReturnUserWithAuthorities() { + Set authoritiesAsString = new HashSet<>(); + authoritiesAsString.add("ADMIN"); + userDto.setAuthorities(authoritiesAsString); + + User user = userMapper.userDTOToUser(userDto); + + assertThat(user).isNotNull(); + assertThat(user.getAuthorities()).isNotNull(); + assertThat(user.getAuthorities()).isNotEmpty(); + assertThat(user.getAuthorities().iterator().next().getName()).isEqualTo("ADMIN"); + } + + @Test + void userDTOToUserMapWithNullAuthoritiesStringShouldReturnUserWithEmptyAuthorities() { + userDto.setAuthorities(null); + + User user = userMapper.userDTOToUser(userDto); + + assertThat(user).isNotNull(); + assertThat(user.getAuthorities()).isNotNull(); + assertThat(user.getAuthorities()).isEmpty(); + } + + @Test + void userDTOToUserMapWithNullUserShouldReturnNull() { + assertThat(userMapper.userDTOToUser(null)).isNull(); + } + + @Test + void testUserFromId() { + assertThat(userMapper.userFromId(DEFAULT_ID).getId()).isEqualTo(DEFAULT_ID); + assertThat(userMapper.userFromId(null)).isNull(); + } +} diff --git a/src/test/java/org/datasurvey/web/rest/AccountResourceIT.java b/src/test/java/org/datasurvey/web/rest/AccountResourceIT.java new file mode 100644 index 0000000..c1644f5 --- /dev/null +++ b/src/test/java/org/datasurvey/web/rest/AccountResourceIT.java @@ -0,0 +1,762 @@ +package org.datasurvey.web.rest; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.datasurvey.web.rest.AccountResourceIT.TEST_USER_LOGIN; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +import java.time.Instant; +import java.util.*; +import org.apache.commons.lang3.RandomStringUtils; +import org.datasurvey.IntegrationTest; +import org.datasurvey.config.Constants; +import org.datasurvey.domain.User; +import org.datasurvey.repository.AuthorityRepository; +import org.datasurvey.repository.UserRepository; +import org.datasurvey.security.AuthoritiesConstants; +import org.datasurvey.service.UserService; +import org.datasurvey.service.dto.AdminUserDTO; +import org.datasurvey.service.dto.PasswordChangeDTO; +import org.datasurvey.service.dto.UserDTO; +import org.datasurvey.web.rest.vm.KeyAndPasswordVM; +import org.datasurvey.web.rest.vm.ManagedUserVM; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.http.MediaType; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.transaction.annotation.Transactional; + +/** + * Integration tests for the {@link AccountResource} REST controller. + */ +@AutoConfigureMockMvc +@WithMockUser(value = TEST_USER_LOGIN) +@IntegrationTest +class AccountResourceIT { + + static final String TEST_USER_LOGIN = "test"; + + @Autowired + private UserRepository userRepository; + + @Autowired + private AuthorityRepository authorityRepository; + + @Autowired + private UserService userService; + + @Autowired + private PasswordEncoder passwordEncoder; + + @Autowired + private MockMvc restAccountMockMvc; + + @Test + @WithUnauthenticatedMockUser + void testNonAuthenticatedUser() throws Exception { + restAccountMockMvc + .perform(get("/api/authenticate").accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().string("")); + } + + @Test + void testAuthenticatedUser() throws Exception { + restAccountMockMvc + .perform( + get("/api/authenticate") + .with( + request -> { + request.setRemoteUser(TEST_USER_LOGIN); + return request; + } + ) + .accept(MediaType.APPLICATION_JSON) + ) + .andExpect(status().isOk()) + .andExpect(content().string(TEST_USER_LOGIN)); + } + + @Test + void testGetExistingAccount() throws Exception { + Set authorities = new HashSet<>(); + authorities.add(AuthoritiesConstants.ADMIN); + + AdminUserDTO user = new AdminUserDTO(); + user.setLogin(TEST_USER_LOGIN); + user.setFirstName("john"); + user.setLastName("doe"); + user.setEmail("john.doe@jhipster.com"); + user.setImageUrl("http://placehold.it/50x50"); + user.setLangKey("en"); + user.setAuthorities(authorities); + userService.createUser(user); + + restAccountMockMvc + .perform(get("/api/account").accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.login").value(TEST_USER_LOGIN)) + .andExpect(jsonPath("$.firstName").value("john")) + .andExpect(jsonPath("$.lastName").value("doe")) + .andExpect(jsonPath("$.email").value("john.doe@jhipster.com")) + .andExpect(jsonPath("$.imageUrl").value("http://placehold.it/50x50")) + .andExpect(jsonPath("$.langKey").value("en")) + .andExpect(jsonPath("$.authorities").value(AuthoritiesConstants.ADMIN)); + } + + @Test + void testGetUnknownAccount() throws Exception { + restAccountMockMvc + .perform(get("/api/account").accept(MediaType.APPLICATION_PROBLEM_JSON)) + .andExpect(status().isInternalServerError()); + } + + @Test + @Transactional + void testRegisterValid() throws Exception { + ManagedUserVM validUser = new ManagedUserVM(); + validUser.setLogin("test-register-valid"); + validUser.setPassword("password"); + validUser.setFirstName("Alice"); + validUser.setLastName("Test"); + validUser.setEmail("test-register-valid@example.com"); + validUser.setImageUrl("http://placehold.it/50x50"); + validUser.setLangKey(Constants.DEFAULT_LANGUAGE); + validUser.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + assertThat(userRepository.findOneByLogin("test-register-valid")).isEmpty(); + + restAccountMockMvc + .perform(post("/api/register").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(validUser))) + .andExpect(status().isCreated()); + + assertThat(userRepository.findOneByLogin("test-register-valid")).isPresent(); + } + + @Test + @Transactional + void testRegisterInvalidLogin() throws Exception { + ManagedUserVM invalidUser = new ManagedUserVM(); + invalidUser.setLogin("funky-log(n"); // <-- invalid + invalidUser.setPassword("password"); + invalidUser.setFirstName("Funky"); + invalidUser.setLastName("One"); + invalidUser.setEmail("funky@example.com"); + invalidUser.setActivated(true); + invalidUser.setImageUrl("http://placehold.it/50x50"); + invalidUser.setLangKey(Constants.DEFAULT_LANGUAGE); + invalidUser.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + restAccountMockMvc + .perform(post("/api/register").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(invalidUser))) + .andExpect(status().isBadRequest()); + + Optional user = userRepository.findOneByEmailIgnoreCase("funky@example.com"); + assertThat(user).isEmpty(); + } + + @Test + @Transactional + void testRegisterInvalidEmail() throws Exception { + ManagedUserVM invalidUser = new ManagedUserVM(); + invalidUser.setLogin("bob"); + invalidUser.setPassword("password"); + invalidUser.setFirstName("Bob"); + invalidUser.setLastName("Green"); + invalidUser.setEmail("invalid"); // <-- invalid + invalidUser.setActivated(true); + invalidUser.setImageUrl("http://placehold.it/50x50"); + invalidUser.setLangKey(Constants.DEFAULT_LANGUAGE); + invalidUser.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + restAccountMockMvc + .perform(post("/api/register").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(invalidUser))) + .andExpect(status().isBadRequest()); + + Optional user = userRepository.findOneByLogin("bob"); + assertThat(user).isEmpty(); + } + + @Test + @Transactional + void testRegisterInvalidPassword() throws Exception { + ManagedUserVM invalidUser = new ManagedUserVM(); + invalidUser.setLogin("bob"); + invalidUser.setPassword("123"); // password with only 3 digits + invalidUser.setFirstName("Bob"); + invalidUser.setLastName("Green"); + invalidUser.setEmail("bob@example.com"); + invalidUser.setActivated(true); + invalidUser.setImageUrl("http://placehold.it/50x50"); + invalidUser.setLangKey(Constants.DEFAULT_LANGUAGE); + invalidUser.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + restAccountMockMvc + .perform(post("/api/register").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(invalidUser))) + .andExpect(status().isBadRequest()); + + Optional user = userRepository.findOneByLogin("bob"); + assertThat(user).isEmpty(); + } + + @Test + @Transactional + void testRegisterNullPassword() throws Exception { + ManagedUserVM invalidUser = new ManagedUserVM(); + invalidUser.setLogin("bob"); + invalidUser.setPassword(null); // invalid null password + invalidUser.setFirstName("Bob"); + invalidUser.setLastName("Green"); + invalidUser.setEmail("bob@example.com"); + invalidUser.setActivated(true); + invalidUser.setImageUrl("http://placehold.it/50x50"); + invalidUser.setLangKey(Constants.DEFAULT_LANGUAGE); + invalidUser.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + restAccountMockMvc + .perform(post("/api/register").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(invalidUser))) + .andExpect(status().isBadRequest()); + + Optional user = userRepository.findOneByLogin("bob"); + assertThat(user).isEmpty(); + } + + @Test + @Transactional + void testRegisterDuplicateLogin() throws Exception { + // First registration + ManagedUserVM firstUser = new ManagedUserVM(); + firstUser.setLogin("alice"); + firstUser.setPassword("password"); + firstUser.setFirstName("Alice"); + firstUser.setLastName("Something"); + firstUser.setEmail("alice@example.com"); + firstUser.setImageUrl("http://placehold.it/50x50"); + firstUser.setLangKey(Constants.DEFAULT_LANGUAGE); + firstUser.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + // Duplicate login, different email + ManagedUserVM secondUser = new ManagedUserVM(); + secondUser.setLogin(firstUser.getLogin()); + secondUser.setPassword(firstUser.getPassword()); + secondUser.setFirstName(firstUser.getFirstName()); + secondUser.setLastName(firstUser.getLastName()); + secondUser.setEmail("alice2@example.com"); + secondUser.setImageUrl(firstUser.getImageUrl()); + secondUser.setLangKey(firstUser.getLangKey()); + secondUser.setCreatedBy(firstUser.getCreatedBy()); + secondUser.setCreatedDate(firstUser.getCreatedDate()); + secondUser.setLastModifiedBy(firstUser.getLastModifiedBy()); + secondUser.setLastModifiedDate(firstUser.getLastModifiedDate()); + secondUser.setAuthorities(new HashSet<>(firstUser.getAuthorities())); + + // First user + restAccountMockMvc + .perform(post("/api/register").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(firstUser))) + .andExpect(status().isCreated()); + + // Second (non activated) user + restAccountMockMvc + .perform(post("/api/register").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(secondUser))) + .andExpect(status().isCreated()); + + Optional testUser = userRepository.findOneByEmailIgnoreCase("alice2@example.com"); + assertThat(testUser).isPresent(); + testUser.get().setActivated(true); + userRepository.save(testUser.get()); + + // Second (already activated) user + restAccountMockMvc + .perform(post("/api/register").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(secondUser))) + .andExpect(status().is4xxClientError()); + } + + @Test + @Transactional + void testRegisterDuplicateEmail() throws Exception { + // First user + ManagedUserVM firstUser = new ManagedUserVM(); + firstUser.setLogin("test-register-duplicate-email"); + firstUser.setPassword("password"); + firstUser.setFirstName("Alice"); + firstUser.setLastName("Test"); + firstUser.setEmail("test-register-duplicate-email@example.com"); + firstUser.setImageUrl("http://placehold.it/50x50"); + firstUser.setLangKey(Constants.DEFAULT_LANGUAGE); + firstUser.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + // Register first user + restAccountMockMvc + .perform(post("/api/register").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(firstUser))) + .andExpect(status().isCreated()); + + Optional testUser1 = userRepository.findOneByLogin("test-register-duplicate-email"); + assertThat(testUser1).isPresent(); + + // Duplicate email, different login + ManagedUserVM secondUser = new ManagedUserVM(); + secondUser.setLogin("test-register-duplicate-email-2"); + secondUser.setPassword(firstUser.getPassword()); + secondUser.setFirstName(firstUser.getFirstName()); + secondUser.setLastName(firstUser.getLastName()); + secondUser.setEmail(firstUser.getEmail()); + secondUser.setImageUrl(firstUser.getImageUrl()); + secondUser.setLangKey(firstUser.getLangKey()); + secondUser.setAuthorities(new HashSet<>(firstUser.getAuthorities())); + + // Register second (non activated) user + restAccountMockMvc + .perform(post("/api/register").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(secondUser))) + .andExpect(status().isCreated()); + + Optional testUser2 = userRepository.findOneByLogin("test-register-duplicate-email"); + assertThat(testUser2).isEmpty(); + + Optional testUser3 = userRepository.findOneByLogin("test-register-duplicate-email-2"); + assertThat(testUser3).isPresent(); + + // Duplicate email - with uppercase email address + ManagedUserVM userWithUpperCaseEmail = new ManagedUserVM(); + userWithUpperCaseEmail.setId(firstUser.getId()); + userWithUpperCaseEmail.setLogin("test-register-duplicate-email-3"); + userWithUpperCaseEmail.setPassword(firstUser.getPassword()); + userWithUpperCaseEmail.setFirstName(firstUser.getFirstName()); + userWithUpperCaseEmail.setLastName(firstUser.getLastName()); + userWithUpperCaseEmail.setEmail("TEST-register-duplicate-email@example.com"); + userWithUpperCaseEmail.setImageUrl(firstUser.getImageUrl()); + userWithUpperCaseEmail.setLangKey(firstUser.getLangKey()); + userWithUpperCaseEmail.setAuthorities(new HashSet<>(firstUser.getAuthorities())); + + // Register third (not activated) user + restAccountMockMvc + .perform( + post("/api/register") + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(userWithUpperCaseEmail)) + ) + .andExpect(status().isCreated()); + + Optional testUser4 = userRepository.findOneByLogin("test-register-duplicate-email-3"); + assertThat(testUser4).isPresent(); + assertThat(testUser4.get().getEmail()).isEqualTo("test-register-duplicate-email@example.com"); + + testUser4.get().setActivated(true); + userService.updateUser((new AdminUserDTO(testUser4.get()))); + + // Register 4th (already activated) user + restAccountMockMvc + .perform(post("/api/register").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(secondUser))) + .andExpect(status().is4xxClientError()); + } + + @Test + @Transactional + void testRegisterAdminIsIgnored() throws Exception { + ManagedUserVM validUser = new ManagedUserVM(); + validUser.setLogin("badguy"); + validUser.setPassword("password"); + validUser.setFirstName("Bad"); + validUser.setLastName("Guy"); + validUser.setEmail("badguy@example.com"); + validUser.setActivated(true); + validUser.setImageUrl("http://placehold.it/50x50"); + validUser.setLangKey(Constants.DEFAULT_LANGUAGE); + validUser.setAuthorities(Collections.singleton(AuthoritiesConstants.ADMIN)); + + restAccountMockMvc + .perform(post("/api/register").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(validUser))) + .andExpect(status().isCreated()); + + Optional userDup = userRepository.findOneWithAuthoritiesByLogin("badguy"); + assertThat(userDup).isPresent(); + assertThat(userDup.get().getAuthorities()) + .hasSize(1) + .containsExactly(authorityRepository.findById(AuthoritiesConstants.USER).get()); + } + + @Test + @Transactional + void testActivateAccount() throws Exception { + final String activationKey = "some activation key"; + User user = new User(); + user.setLogin("activate-account"); + user.setEmail("activate-account@example.com"); + user.setPassword(RandomStringUtils.random(60)); + user.setActivated(false); + user.setActivationKey(activationKey); + + userRepository.saveAndFlush(user); + + restAccountMockMvc.perform(get("/api/activate?key={activationKey}", activationKey)).andExpect(status().isOk()); + + user = userRepository.findOneByLogin(user.getLogin()).orElse(null); + assertThat(user.isActivated()).isTrue(); + } + + @Test + @Transactional + void testActivateAccountWithWrongKey() throws Exception { + restAccountMockMvc.perform(get("/api/activate?key=wrongActivationKey")).andExpect(status().isInternalServerError()); + } + + @Test + @Transactional + @WithMockUser("save-account") + void testSaveAccount() throws Exception { + User user = new User(); + user.setLogin("save-account"); + user.setEmail("save-account@example.com"); + user.setPassword(RandomStringUtils.random(60)); + user.setActivated(true); + userRepository.saveAndFlush(user); + + AdminUserDTO userDTO = new AdminUserDTO(); + userDTO.setLogin("not-used"); + userDTO.setFirstName("firstname"); + userDTO.setLastName("lastname"); + userDTO.setEmail("save-account@example.com"); + userDTO.setActivated(false); + userDTO.setImageUrl("http://placehold.it/50x50"); + userDTO.setLangKey(Constants.DEFAULT_LANGUAGE); + userDTO.setAuthorities(Collections.singleton(AuthoritiesConstants.ADMIN)); + + restAccountMockMvc + .perform(post("/api/account").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(userDTO))) + .andExpect(status().isOk()); + + User updatedUser = userRepository.findOneWithAuthoritiesByLogin(user.getLogin()).orElse(null); + assertThat(updatedUser.getFirstName()).isEqualTo(userDTO.getFirstName()); + assertThat(updatedUser.getLastName()).isEqualTo(userDTO.getLastName()); + assertThat(updatedUser.getEmail()).isEqualTo(userDTO.getEmail()); + assertThat(updatedUser.getLangKey()).isEqualTo(userDTO.getLangKey()); + assertThat(updatedUser.getPassword()).isEqualTo(user.getPassword()); + assertThat(updatedUser.getImageUrl()).isEqualTo(userDTO.getImageUrl()); + assertThat(updatedUser.isActivated()).isTrue(); + assertThat(updatedUser.getAuthorities()).isEmpty(); + } + + @Test + @Transactional + @WithMockUser("save-invalid-email") + void testSaveInvalidEmail() throws Exception { + User user = new User(); + user.setLogin("save-invalid-email"); + user.setEmail("save-invalid-email@example.com"); + user.setPassword(RandomStringUtils.random(60)); + user.setActivated(true); + + userRepository.saveAndFlush(user); + + AdminUserDTO userDTO = new AdminUserDTO(); + userDTO.setLogin("not-used"); + userDTO.setFirstName("firstname"); + userDTO.setLastName("lastname"); + userDTO.setEmail("invalid email"); + userDTO.setActivated(false); + userDTO.setImageUrl("http://placehold.it/50x50"); + userDTO.setLangKey(Constants.DEFAULT_LANGUAGE); + userDTO.setAuthorities(Collections.singleton(AuthoritiesConstants.ADMIN)); + + restAccountMockMvc + .perform(post("/api/account").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(userDTO))) + .andExpect(status().isBadRequest()); + + assertThat(userRepository.findOneByEmailIgnoreCase("invalid email")).isNotPresent(); + } + + @Test + @Transactional + @WithMockUser("save-existing-email") + void testSaveExistingEmail() throws Exception { + User user = new User(); + user.setLogin("save-existing-email"); + user.setEmail("save-existing-email@example.com"); + user.setPassword(RandomStringUtils.random(60)); + user.setActivated(true); + userRepository.saveAndFlush(user); + + User anotherUser = new User(); + anotherUser.setLogin("save-existing-email2"); + anotherUser.setEmail("save-existing-email2@example.com"); + anotherUser.setPassword(RandomStringUtils.random(60)); + anotherUser.setActivated(true); + + userRepository.saveAndFlush(anotherUser); + + AdminUserDTO userDTO = new AdminUserDTO(); + userDTO.setLogin("not-used"); + userDTO.setFirstName("firstname"); + userDTO.setLastName("lastname"); + userDTO.setEmail("save-existing-email2@example.com"); + userDTO.setActivated(false); + userDTO.setImageUrl("http://placehold.it/50x50"); + userDTO.setLangKey(Constants.DEFAULT_LANGUAGE); + userDTO.setAuthorities(Collections.singleton(AuthoritiesConstants.ADMIN)); + + restAccountMockMvc + .perform(post("/api/account").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(userDTO))) + .andExpect(status().isBadRequest()); + + User updatedUser = userRepository.findOneByLogin("save-existing-email").orElse(null); + assertThat(updatedUser.getEmail()).isEqualTo("save-existing-email@example.com"); + } + + @Test + @Transactional + @WithMockUser("save-existing-email-and-login") + void testSaveExistingEmailAndLogin() throws Exception { + User user = new User(); + user.setLogin("save-existing-email-and-login"); + user.setEmail("save-existing-email-and-login@example.com"); + user.setPassword(RandomStringUtils.random(60)); + user.setActivated(true); + userRepository.saveAndFlush(user); + + AdminUserDTO userDTO = new AdminUserDTO(); + userDTO.setLogin("not-used"); + userDTO.setFirstName("firstname"); + userDTO.setLastName("lastname"); + userDTO.setEmail("save-existing-email-and-login@example.com"); + userDTO.setActivated(false); + userDTO.setImageUrl("http://placehold.it/50x50"); + userDTO.setLangKey(Constants.DEFAULT_LANGUAGE); + userDTO.setAuthorities(Collections.singleton(AuthoritiesConstants.ADMIN)); + + restAccountMockMvc + .perform(post("/api/account").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(userDTO))) + .andExpect(status().isOk()); + + User updatedUser = userRepository.findOneByLogin("save-existing-email-and-login").orElse(null); + assertThat(updatedUser.getEmail()).isEqualTo("save-existing-email-and-login@example.com"); + } + + @Test + @Transactional + @WithMockUser("change-password-wrong-existing-password") + void testChangePasswordWrongExistingPassword() throws Exception { + User user = new User(); + String currentPassword = RandomStringUtils.random(60); + user.setPassword(passwordEncoder.encode(currentPassword)); + user.setLogin("change-password-wrong-existing-password"); + user.setEmail("change-password-wrong-existing-password@example.com"); + userRepository.saveAndFlush(user); + + restAccountMockMvc + .perform( + post("/api/account/change-password") + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(new PasswordChangeDTO("1" + currentPassword, "new password"))) + ) + .andExpect(status().isBadRequest()); + + User updatedUser = userRepository.findOneByLogin("change-password-wrong-existing-password").orElse(null); + assertThat(passwordEncoder.matches("new password", updatedUser.getPassword())).isFalse(); + assertThat(passwordEncoder.matches(currentPassword, updatedUser.getPassword())).isTrue(); + } + + @Test + @Transactional + @WithMockUser("change-password") + void testChangePassword() throws Exception { + User user = new User(); + String currentPassword = RandomStringUtils.random(60); + user.setPassword(passwordEncoder.encode(currentPassword)); + user.setLogin("change-password"); + user.setEmail("change-password@example.com"); + userRepository.saveAndFlush(user); + + restAccountMockMvc + .perform( + post("/api/account/change-password") + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(new PasswordChangeDTO(currentPassword, "new password"))) + ) + .andExpect(status().isOk()); + + User updatedUser = userRepository.findOneByLogin("change-password").orElse(null); + assertThat(passwordEncoder.matches("new password", updatedUser.getPassword())).isTrue(); + } + + @Test + @Transactional + @WithMockUser("change-password-too-small") + void testChangePasswordTooSmall() throws Exception { + User user = new User(); + String currentPassword = RandomStringUtils.random(60); + user.setPassword(passwordEncoder.encode(currentPassword)); + user.setLogin("change-password-too-small"); + user.setEmail("change-password-too-small@example.com"); + userRepository.saveAndFlush(user); + + String newPassword = RandomStringUtils.random(ManagedUserVM.PASSWORD_MIN_LENGTH - 1); + + restAccountMockMvc + .perform( + post("/api/account/change-password") + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(new PasswordChangeDTO(currentPassword, newPassword))) + ) + .andExpect(status().isBadRequest()); + + User updatedUser = userRepository.findOneByLogin("change-password-too-small").orElse(null); + assertThat(updatedUser.getPassword()).isEqualTo(user.getPassword()); + } + + @Test + @Transactional + @WithMockUser("change-password-too-long") + void testChangePasswordTooLong() throws Exception { + User user = new User(); + String currentPassword = RandomStringUtils.random(60); + user.setPassword(passwordEncoder.encode(currentPassword)); + user.setLogin("change-password-too-long"); + user.setEmail("change-password-too-long@example.com"); + userRepository.saveAndFlush(user); + + String newPassword = RandomStringUtils.random(ManagedUserVM.PASSWORD_MAX_LENGTH + 1); + + restAccountMockMvc + .perform( + post("/api/account/change-password") + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(new PasswordChangeDTO(currentPassword, newPassword))) + ) + .andExpect(status().isBadRequest()); + + User updatedUser = userRepository.findOneByLogin("change-password-too-long").orElse(null); + assertThat(updatedUser.getPassword()).isEqualTo(user.getPassword()); + } + + @Test + @Transactional + @WithMockUser("change-password-empty") + void testChangePasswordEmpty() throws Exception { + User user = new User(); + String currentPassword = RandomStringUtils.random(60); + user.setPassword(passwordEncoder.encode(currentPassword)); + user.setLogin("change-password-empty"); + user.setEmail("change-password-empty@example.com"); + userRepository.saveAndFlush(user); + + restAccountMockMvc + .perform( + post("/api/account/change-password") + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(new PasswordChangeDTO(currentPassword, ""))) + ) + .andExpect(status().isBadRequest()); + + User updatedUser = userRepository.findOneByLogin("change-password-empty").orElse(null); + assertThat(updatedUser.getPassword()).isEqualTo(user.getPassword()); + } + + @Test + @Transactional + void testRequestPasswordReset() throws Exception { + User user = new User(); + user.setPassword(RandomStringUtils.random(60)); + user.setActivated(true); + user.setLogin("password-reset"); + user.setEmail("password-reset@example.com"); + userRepository.saveAndFlush(user); + + restAccountMockMvc + .perform(post("/api/account/reset-password/init").content("password-reset@example.com")) + .andExpect(status().isOk()); + } + + @Test + @Transactional + void testRequestPasswordResetUpperCaseEmail() throws Exception { + User user = new User(); + user.setPassword(RandomStringUtils.random(60)); + user.setActivated(true); + user.setLogin("password-reset-upper-case"); + user.setEmail("password-reset-upper-case@example.com"); + userRepository.saveAndFlush(user); + + restAccountMockMvc + .perform(post("/api/account/reset-password/init").content("password-reset-upper-case@EXAMPLE.COM")) + .andExpect(status().isOk()); + } + + @Test + void testRequestPasswordResetWrongEmail() throws Exception { + restAccountMockMvc + .perform(post("/api/account/reset-password/init").content("password-reset-wrong-email@example.com")) + .andExpect(status().isOk()); + } + + @Test + @Transactional + void testFinishPasswordReset() throws Exception { + User user = new User(); + user.setPassword(RandomStringUtils.random(60)); + user.setLogin("finish-password-reset"); + user.setEmail("finish-password-reset@example.com"); + user.setResetDate(Instant.now().plusSeconds(60)); + user.setResetKey("reset key"); + userRepository.saveAndFlush(user); + + KeyAndPasswordVM keyAndPassword = new KeyAndPasswordVM(); + keyAndPassword.setKey(user.getResetKey()); + keyAndPassword.setNewPassword("new password"); + + restAccountMockMvc + .perform( + post("/api/account/reset-password/finish") + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(keyAndPassword)) + ) + .andExpect(status().isOk()); + + User updatedUser = userRepository.findOneByLogin(user.getLogin()).orElse(null); + assertThat(passwordEncoder.matches(keyAndPassword.getNewPassword(), updatedUser.getPassword())).isTrue(); + } + + @Test + @Transactional + void testFinishPasswordResetTooSmall() throws Exception { + User user = new User(); + user.setPassword(RandomStringUtils.random(60)); + user.setLogin("finish-password-reset-too-small"); + user.setEmail("finish-password-reset-too-small@example.com"); + user.setResetDate(Instant.now().plusSeconds(60)); + user.setResetKey("reset key too small"); + userRepository.saveAndFlush(user); + + KeyAndPasswordVM keyAndPassword = new KeyAndPasswordVM(); + keyAndPassword.setKey(user.getResetKey()); + keyAndPassword.setNewPassword("foo"); + + restAccountMockMvc + .perform( + post("/api/account/reset-password/finish") + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(keyAndPassword)) + ) + .andExpect(status().isBadRequest()); + + User updatedUser = userRepository.findOneByLogin(user.getLogin()).orElse(null); + assertThat(passwordEncoder.matches(keyAndPassword.getNewPassword(), updatedUser.getPassword())).isFalse(); + } + + @Test + @Transactional + void testFinishPasswordResetWrongKey() throws Exception { + KeyAndPasswordVM keyAndPassword = new KeyAndPasswordVM(); + keyAndPassword.setKey("wrong reset key"); + keyAndPassword.setNewPassword("new password"); + + restAccountMockMvc + .perform( + post("/api/account/reset-password/finish") + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(keyAndPassword)) + ) + .andExpect(status().isInternalServerError()); + } +} diff --git a/src/test/java/org/datasurvey/web/rest/CategoriaResourceIT.java b/src/test/java/org/datasurvey/web/rest/CategoriaResourceIT.java new file mode 100644 index 0000000..3f3b10f --- /dev/null +++ b/src/test/java/org/datasurvey/web/rest/CategoriaResourceIT.java @@ -0,0 +1,640 @@ +package org.datasurvey.web.rest; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.hamcrest.Matchers.hasItem; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +import java.util.List; +import java.util.Random; +import java.util.concurrent.atomic.AtomicLong; +import javax.persistence.EntityManager; +import org.datasurvey.IntegrationTest; +import org.datasurvey.domain.Categoria; +import org.datasurvey.domain.Encuesta; +import org.datasurvey.domain.Plantilla; +import org.datasurvey.domain.enumeration.EstadoCategoria; +import org.datasurvey.repository.CategoriaRepository; +import org.datasurvey.service.criteria.CategoriaCriteria; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.http.MediaType; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.transaction.annotation.Transactional; + +/** + * Integration tests for the {@link CategoriaResource} REST controller. + */ +@IntegrationTest +@AutoConfigureMockMvc +@WithMockUser +class CategoriaResourceIT { + + private static final String DEFAULT_NOMBRE = "AAAAAAAAAA"; + private static final String UPDATED_NOMBRE = "BBBBBBBBBB"; + + private static final EstadoCategoria DEFAULT_ESTADO = EstadoCategoria.ACTIVE; + private static final EstadoCategoria UPDATED_ESTADO = EstadoCategoria.INACTIVE; + + private static final String ENTITY_API_URL = "/api/categorias"; + private static final String ENTITY_API_URL_ID = ENTITY_API_URL + "/{id}"; + + private static Random random = new Random(); + private static AtomicLong count = new AtomicLong(random.nextInt() + (2 * Integer.MAX_VALUE)); + + @Autowired + private CategoriaRepository categoriaRepository; + + @Autowired + private EntityManager em; + + @Autowired + private MockMvc restCategoriaMockMvc; + + private Categoria categoria; + + /** + * Create an entity for this test. + * + * This is a static method, as tests for other entities might also need it, + * if they test an entity which requires the current entity. + */ + public static Categoria createEntity(EntityManager em) { + Categoria categoria = new Categoria().nombre(DEFAULT_NOMBRE).estado(DEFAULT_ESTADO); + return categoria; + } + + /** + * Create an updated entity for this test. + * + * This is a static method, as tests for other entities might also need it, + * if they test an entity which requires the current entity. + */ + public static Categoria createUpdatedEntity(EntityManager em) { + Categoria categoria = new Categoria().nombre(UPDATED_NOMBRE).estado(UPDATED_ESTADO); + return categoria; + } + + @BeforeEach + public void initTest() { + categoria = createEntity(em); + } + + @Test + @Transactional + void createCategoria() throws Exception { + int databaseSizeBeforeCreate = categoriaRepository.findAll().size(); + // Create the Categoria + restCategoriaMockMvc + .perform(post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(categoria))) + .andExpect(status().isCreated()); + + // Validate the Categoria in the database + List categoriaList = categoriaRepository.findAll(); + assertThat(categoriaList).hasSize(databaseSizeBeforeCreate + 1); + Categoria testCategoria = categoriaList.get(categoriaList.size() - 1); + assertThat(testCategoria.getNombre()).isEqualTo(DEFAULT_NOMBRE); + assertThat(testCategoria.getEstado()).isEqualTo(DEFAULT_ESTADO); + } + + @Test + @Transactional + void createCategoriaWithExistingId() throws Exception { + // Create the Categoria with an existing ID + categoria.setId(1L); + + int databaseSizeBeforeCreate = categoriaRepository.findAll().size(); + + // An entity with an existing ID cannot be created, so this API call must fail + restCategoriaMockMvc + .perform(post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(categoria))) + .andExpect(status().isBadRequest()); + + // Validate the Categoria in the database + List categoriaList = categoriaRepository.findAll(); + assertThat(categoriaList).hasSize(databaseSizeBeforeCreate); + } + + @Test + @Transactional + void checkNombreIsRequired() throws Exception { + int databaseSizeBeforeTest = categoriaRepository.findAll().size(); + // set the field null + categoria.setNombre(null); + + // Create the Categoria, which fails. + + restCategoriaMockMvc + .perform(post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(categoria))) + .andExpect(status().isBadRequest()); + + List categoriaList = categoriaRepository.findAll(); + assertThat(categoriaList).hasSize(databaseSizeBeforeTest); + } + + @Test + @Transactional + void checkEstadoIsRequired() throws Exception { + int databaseSizeBeforeTest = categoriaRepository.findAll().size(); + // set the field null + categoria.setEstado(null); + + // Create the Categoria, which fails. + + restCategoriaMockMvc + .perform(post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(categoria))) + .andExpect(status().isBadRequest()); + + List categoriaList = categoriaRepository.findAll(); + assertThat(categoriaList).hasSize(databaseSizeBeforeTest); + } + + @Test + @Transactional + void getAllCategorias() throws Exception { + // Initialize the database + categoriaRepository.saveAndFlush(categoria); + + // Get all the categoriaList + restCategoriaMockMvc + .perform(get(ENTITY_API_URL + "?sort=id,desc")) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.[*].id").value(hasItem(categoria.getId().intValue()))) + .andExpect(jsonPath("$.[*].nombre").value(hasItem(DEFAULT_NOMBRE))) + .andExpect(jsonPath("$.[*].estado").value(hasItem(DEFAULT_ESTADO.toString()))); + } + + @Test + @Transactional + void getCategoria() throws Exception { + // Initialize the database + categoriaRepository.saveAndFlush(categoria); + + // Get the categoria + restCategoriaMockMvc + .perform(get(ENTITY_API_URL_ID, categoria.getId())) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.id").value(categoria.getId().intValue())) + .andExpect(jsonPath("$.nombre").value(DEFAULT_NOMBRE)) + .andExpect(jsonPath("$.estado").value(DEFAULT_ESTADO.toString())); + } + + @Test + @Transactional + void getCategoriasByIdFiltering() throws Exception { + // Initialize the database + categoriaRepository.saveAndFlush(categoria); + + Long id = categoria.getId(); + + defaultCategoriaShouldBeFound("id.equals=" + id); + defaultCategoriaShouldNotBeFound("id.notEquals=" + id); + + defaultCategoriaShouldBeFound("id.greaterThanOrEqual=" + id); + defaultCategoriaShouldNotBeFound("id.greaterThan=" + id); + + defaultCategoriaShouldBeFound("id.lessThanOrEqual=" + id); + defaultCategoriaShouldNotBeFound("id.lessThan=" + id); + } + + @Test + @Transactional + void getAllCategoriasByNombreIsEqualToSomething() throws Exception { + // Initialize the database + categoriaRepository.saveAndFlush(categoria); + + // Get all the categoriaList where nombre equals to DEFAULT_NOMBRE + defaultCategoriaShouldBeFound("nombre.equals=" + DEFAULT_NOMBRE); + + // Get all the categoriaList where nombre equals to UPDATED_NOMBRE + defaultCategoriaShouldNotBeFound("nombre.equals=" + UPDATED_NOMBRE); + } + + @Test + @Transactional + void getAllCategoriasByNombreIsNotEqualToSomething() throws Exception { + // Initialize the database + categoriaRepository.saveAndFlush(categoria); + + // Get all the categoriaList where nombre not equals to DEFAULT_NOMBRE + defaultCategoriaShouldNotBeFound("nombre.notEquals=" + DEFAULT_NOMBRE); + + // Get all the categoriaList where nombre not equals to UPDATED_NOMBRE + defaultCategoriaShouldBeFound("nombre.notEquals=" + UPDATED_NOMBRE); + } + + @Test + @Transactional + void getAllCategoriasByNombreIsInShouldWork() throws Exception { + // Initialize the database + categoriaRepository.saveAndFlush(categoria); + + // Get all the categoriaList where nombre in DEFAULT_NOMBRE or UPDATED_NOMBRE + defaultCategoriaShouldBeFound("nombre.in=" + DEFAULT_NOMBRE + "," + UPDATED_NOMBRE); + + // Get all the categoriaList where nombre equals to UPDATED_NOMBRE + defaultCategoriaShouldNotBeFound("nombre.in=" + UPDATED_NOMBRE); + } + + @Test + @Transactional + void getAllCategoriasByNombreIsNullOrNotNull() throws Exception { + // Initialize the database + categoriaRepository.saveAndFlush(categoria); + + // Get all the categoriaList where nombre is not null + defaultCategoriaShouldBeFound("nombre.specified=true"); + + // Get all the categoriaList where nombre is null + defaultCategoriaShouldNotBeFound("nombre.specified=false"); + } + + @Test + @Transactional + void getAllCategoriasByNombreContainsSomething() throws Exception { + // Initialize the database + categoriaRepository.saveAndFlush(categoria); + + // Get all the categoriaList where nombre contains DEFAULT_NOMBRE + defaultCategoriaShouldBeFound("nombre.contains=" + DEFAULT_NOMBRE); + + // Get all the categoriaList where nombre contains UPDATED_NOMBRE + defaultCategoriaShouldNotBeFound("nombre.contains=" + UPDATED_NOMBRE); + } + + @Test + @Transactional + void getAllCategoriasByNombreNotContainsSomething() throws Exception { + // Initialize the database + categoriaRepository.saveAndFlush(categoria); + + // Get all the categoriaList where nombre does not contain DEFAULT_NOMBRE + defaultCategoriaShouldNotBeFound("nombre.doesNotContain=" + DEFAULT_NOMBRE); + + // Get all the categoriaList where nombre does not contain UPDATED_NOMBRE + defaultCategoriaShouldBeFound("nombre.doesNotContain=" + UPDATED_NOMBRE); + } + + @Test + @Transactional + void getAllCategoriasByEstadoIsEqualToSomething() throws Exception { + // Initialize the database + categoriaRepository.saveAndFlush(categoria); + + // Get all the categoriaList where estado equals to DEFAULT_ESTADO + defaultCategoriaShouldBeFound("estado.equals=" + DEFAULT_ESTADO); + + // Get all the categoriaList where estado equals to UPDATED_ESTADO + defaultCategoriaShouldNotBeFound("estado.equals=" + UPDATED_ESTADO); + } + + @Test + @Transactional + void getAllCategoriasByEstadoIsNotEqualToSomething() throws Exception { + // Initialize the database + categoriaRepository.saveAndFlush(categoria); + + // Get all the categoriaList where estado not equals to DEFAULT_ESTADO + defaultCategoriaShouldNotBeFound("estado.notEquals=" + DEFAULT_ESTADO); + + // Get all the categoriaList where estado not equals to UPDATED_ESTADO + defaultCategoriaShouldBeFound("estado.notEquals=" + UPDATED_ESTADO); + } + + @Test + @Transactional + void getAllCategoriasByEstadoIsInShouldWork() throws Exception { + // Initialize the database + categoriaRepository.saveAndFlush(categoria); + + // Get all the categoriaList where estado in DEFAULT_ESTADO or UPDATED_ESTADO + defaultCategoriaShouldBeFound("estado.in=" + DEFAULT_ESTADO + "," + UPDATED_ESTADO); + + // Get all the categoriaList where estado equals to UPDATED_ESTADO + defaultCategoriaShouldNotBeFound("estado.in=" + UPDATED_ESTADO); + } + + @Test + @Transactional + void getAllCategoriasByEstadoIsNullOrNotNull() throws Exception { + // Initialize the database + categoriaRepository.saveAndFlush(categoria); + + // Get all the categoriaList where estado is not null + defaultCategoriaShouldBeFound("estado.specified=true"); + + // Get all the categoriaList where estado is null + defaultCategoriaShouldNotBeFound("estado.specified=false"); + } + + @Test + @Transactional + void getAllCategoriasByEncuestaIsEqualToSomething() throws Exception { + // Initialize the database + categoriaRepository.saveAndFlush(categoria); + Encuesta encuesta = EncuestaResourceIT.createEntity(em); + em.persist(encuesta); + em.flush(); + categoria.addEncuesta(encuesta); + categoriaRepository.saveAndFlush(categoria); + Long encuestaId = encuesta.getId(); + + // Get all the categoriaList where encuesta equals to encuestaId + defaultCategoriaShouldBeFound("encuestaId.equals=" + encuestaId); + + // Get all the categoriaList where encuesta equals to (encuestaId + 1) + defaultCategoriaShouldNotBeFound("encuestaId.equals=" + (encuestaId + 1)); + } + + @Test + @Transactional + void getAllCategoriasByPlantillaIsEqualToSomething() throws Exception { + // Initialize the database + categoriaRepository.saveAndFlush(categoria); + Plantilla plantilla = PlantillaResourceIT.createEntity(em); + em.persist(plantilla); + em.flush(); + categoria.addPlantilla(plantilla); + categoriaRepository.saveAndFlush(categoria); + Long plantillaId = plantilla.getId(); + + // Get all the categoriaList where plantilla equals to plantillaId + defaultCategoriaShouldBeFound("plantillaId.equals=" + plantillaId); + + // Get all the categoriaList where plantilla equals to (plantillaId + 1) + defaultCategoriaShouldNotBeFound("plantillaId.equals=" + (plantillaId + 1)); + } + + /** + * Executes the search, and checks that the default entity is returned. + */ + private void defaultCategoriaShouldBeFound(String filter) throws Exception { + restCategoriaMockMvc + .perform(get(ENTITY_API_URL + "?sort=id,desc&" + filter)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.[*].id").value(hasItem(categoria.getId().intValue()))) + .andExpect(jsonPath("$.[*].nombre").value(hasItem(DEFAULT_NOMBRE))) + .andExpect(jsonPath("$.[*].estado").value(hasItem(DEFAULT_ESTADO.toString()))); + + // Check, that the count call also returns 1 + restCategoriaMockMvc + .perform(get(ENTITY_API_URL + "/count?sort=id,desc&" + filter)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(content().string("1")); + } + + /** + * Executes the search, and checks that the default entity is not returned. + */ + private void defaultCategoriaShouldNotBeFound(String filter) throws Exception { + restCategoriaMockMvc + .perform(get(ENTITY_API_URL + "?sort=id,desc&" + filter)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$").isArray()) + .andExpect(jsonPath("$").isEmpty()); + + // Check, that the count call also returns 0 + restCategoriaMockMvc + .perform(get(ENTITY_API_URL + "/count?sort=id,desc&" + filter)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(content().string("0")); + } + + @Test + @Transactional + void getNonExistingCategoria() throws Exception { + // Get the categoria + restCategoriaMockMvc.perform(get(ENTITY_API_URL_ID, Long.MAX_VALUE)).andExpect(status().isNotFound()); + } + + @Test + @Transactional + void putNewCategoria() throws Exception { + // Initialize the database + categoriaRepository.saveAndFlush(categoria); + + int databaseSizeBeforeUpdate = categoriaRepository.findAll().size(); + + // Update the categoria + Categoria updatedCategoria = categoriaRepository.findById(categoria.getId()).get(); + // Disconnect from session so that the updates on updatedCategoria are not directly saved in db + em.detach(updatedCategoria); + updatedCategoria.nombre(UPDATED_NOMBRE).estado(UPDATED_ESTADO); + + restCategoriaMockMvc + .perform( + put(ENTITY_API_URL_ID, updatedCategoria.getId()) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(updatedCategoria)) + ) + .andExpect(status().isOk()); + + // Validate the Categoria in the database + List categoriaList = categoriaRepository.findAll(); + assertThat(categoriaList).hasSize(databaseSizeBeforeUpdate); + Categoria testCategoria = categoriaList.get(categoriaList.size() - 1); + assertThat(testCategoria.getNombre()).isEqualTo(UPDATED_NOMBRE); + assertThat(testCategoria.getEstado()).isEqualTo(UPDATED_ESTADO); + } + + @Test + @Transactional + void putNonExistingCategoria() throws Exception { + int databaseSizeBeforeUpdate = categoriaRepository.findAll().size(); + categoria.setId(count.incrementAndGet()); + + // If the entity doesn't have an ID, it will throw BadRequestAlertException + restCategoriaMockMvc + .perform( + put(ENTITY_API_URL_ID, categoria.getId()) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(categoria)) + ) + .andExpect(status().isBadRequest()); + + // Validate the Categoria in the database + List categoriaList = categoriaRepository.findAll(); + assertThat(categoriaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void putWithIdMismatchCategoria() throws Exception { + int databaseSizeBeforeUpdate = categoriaRepository.findAll().size(); + categoria.setId(count.incrementAndGet()); + + // If url ID doesn't match entity ID, it will throw BadRequestAlertException + restCategoriaMockMvc + .perform( + put(ENTITY_API_URL_ID, count.incrementAndGet()) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(categoria)) + ) + .andExpect(status().isBadRequest()); + + // Validate the Categoria in the database + List categoriaList = categoriaRepository.findAll(); + assertThat(categoriaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void putWithMissingIdPathParamCategoria() throws Exception { + int databaseSizeBeforeUpdate = categoriaRepository.findAll().size(); + categoria.setId(count.incrementAndGet()); + + // If url ID doesn't match entity ID, it will throw BadRequestAlertException + restCategoriaMockMvc + .perform(put(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(categoria))) + .andExpect(status().isMethodNotAllowed()); + + // Validate the Categoria in the database + List categoriaList = categoriaRepository.findAll(); + assertThat(categoriaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void partialUpdateCategoriaWithPatch() throws Exception { + // Initialize the database + categoriaRepository.saveAndFlush(categoria); + + int databaseSizeBeforeUpdate = categoriaRepository.findAll().size(); + + // Update the categoria using partial update + Categoria partialUpdatedCategoria = new Categoria(); + partialUpdatedCategoria.setId(categoria.getId()); + + partialUpdatedCategoria.nombre(UPDATED_NOMBRE).estado(UPDATED_ESTADO); + + restCategoriaMockMvc + .perform( + patch(ENTITY_API_URL_ID, partialUpdatedCategoria.getId()) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(partialUpdatedCategoria)) + ) + .andExpect(status().isOk()); + + // Validate the Categoria in the database + List categoriaList = categoriaRepository.findAll(); + assertThat(categoriaList).hasSize(databaseSizeBeforeUpdate); + Categoria testCategoria = categoriaList.get(categoriaList.size() - 1); + assertThat(testCategoria.getNombre()).isEqualTo(UPDATED_NOMBRE); + assertThat(testCategoria.getEstado()).isEqualTo(UPDATED_ESTADO); + } + + @Test + @Transactional + void fullUpdateCategoriaWithPatch() throws Exception { + // Initialize the database + categoriaRepository.saveAndFlush(categoria); + + int databaseSizeBeforeUpdate = categoriaRepository.findAll().size(); + + // Update the categoria using partial update + Categoria partialUpdatedCategoria = new Categoria(); + partialUpdatedCategoria.setId(categoria.getId()); + + partialUpdatedCategoria.nombre(UPDATED_NOMBRE).estado(UPDATED_ESTADO); + + restCategoriaMockMvc + .perform( + patch(ENTITY_API_URL_ID, partialUpdatedCategoria.getId()) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(partialUpdatedCategoria)) + ) + .andExpect(status().isOk()); + + // Validate the Categoria in the database + List categoriaList = categoriaRepository.findAll(); + assertThat(categoriaList).hasSize(databaseSizeBeforeUpdate); + Categoria testCategoria = categoriaList.get(categoriaList.size() - 1); + assertThat(testCategoria.getNombre()).isEqualTo(UPDATED_NOMBRE); + assertThat(testCategoria.getEstado()).isEqualTo(UPDATED_ESTADO); + } + + @Test + @Transactional + void patchNonExistingCategoria() throws Exception { + int databaseSizeBeforeUpdate = categoriaRepository.findAll().size(); + categoria.setId(count.incrementAndGet()); + + // If the entity doesn't have an ID, it will throw BadRequestAlertException + restCategoriaMockMvc + .perform( + patch(ENTITY_API_URL_ID, categoria.getId()) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(categoria)) + ) + .andExpect(status().isBadRequest()); + + // Validate the Categoria in the database + List categoriaList = categoriaRepository.findAll(); + assertThat(categoriaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void patchWithIdMismatchCategoria() throws Exception { + int databaseSizeBeforeUpdate = categoriaRepository.findAll().size(); + categoria.setId(count.incrementAndGet()); + + // If url ID doesn't match entity ID, it will throw BadRequestAlertException + restCategoriaMockMvc + .perform( + patch(ENTITY_API_URL_ID, count.incrementAndGet()) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(categoria)) + ) + .andExpect(status().isBadRequest()); + + // Validate the Categoria in the database + List categoriaList = categoriaRepository.findAll(); + assertThat(categoriaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void patchWithMissingIdPathParamCategoria() throws Exception { + int databaseSizeBeforeUpdate = categoriaRepository.findAll().size(); + categoria.setId(count.incrementAndGet()); + + // If url ID doesn't match entity ID, it will throw BadRequestAlertException + restCategoriaMockMvc + .perform( + patch(ENTITY_API_URL).contentType("application/merge-patch+json").content(TestUtil.convertObjectToJsonBytes(categoria)) + ) + .andExpect(status().isMethodNotAllowed()); + + // Validate the Categoria in the database + List categoriaList = categoriaRepository.findAll(); + assertThat(categoriaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void deleteCategoria() throws Exception { + // Initialize the database + categoriaRepository.saveAndFlush(categoria); + + int databaseSizeBeforeDelete = categoriaRepository.findAll().size(); + + // Delete the categoria + restCategoriaMockMvc + .perform(delete(ENTITY_API_URL_ID, categoria.getId()).accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isNoContent()); + + // Validate the database contains one less item + List categoriaList = categoriaRepository.findAll(); + assertThat(categoriaList).hasSize(databaseSizeBeforeDelete - 1); + } +} diff --git a/src/test/java/org/datasurvey/web/rest/ClientForwardControllerTest.java b/src/test/java/org/datasurvey/web/rest/ClientForwardControllerTest.java new file mode 100644 index 0000000..b3a02cb --- /dev/null +++ b/src/test/java/org/datasurvey/web/rest/ClientForwardControllerTest.java @@ -0,0 +1,73 @@ +package org.datasurvey.web.rest; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.forwardedUrl; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.ResultActions; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * Unit tests for the {@link ClientForwardController} REST controller. + */ +class ClientForwardControllerTest { + + private MockMvc restMockMvc; + + @BeforeEach + public void setup() { + ClientForwardController clientForwardController = new ClientForwardController(); + this.restMockMvc = MockMvcBuilders.standaloneSetup(clientForwardController, new TestController()).build(); + } + + @Test + void getBackendEndpoint() throws Exception { + restMockMvc + .perform(get("/test")) + .andExpect(status().isOk()) + .andExpect(content().contentTypeCompatibleWith(MediaType.TEXT_PLAIN_VALUE)) + .andExpect(content().string("test")); + } + + @Test + void getClientEndpoint() throws Exception { + ResultActions perform = restMockMvc.perform(get("/non-existant-mapping")); + perform.andExpect(status().isOk()).andExpect(forwardedUrl("/")); + } + + @Test + void getNestedClientEndpoint() throws Exception { + restMockMvc.perform(get("/admin/user-management")).andExpect(status().isOk()).andExpect(forwardedUrl("/")); + } + + @Test + void getWebsocketInfoEndpoint() throws Exception { + restMockMvc.perform(get("/websocket/info")).andExpect(status().isNotFound()); + } + + @Test + void getWebsocketEndpoint() throws Exception { + restMockMvc.perform(get("/websocket/tracker/308/sessionId/websocket")).andExpect(status().isNotFound()); + } + + @Test + void getWebsocketFallbackEndpoint() throws Exception { + restMockMvc.perform(get("/websocket/tracker/308/sessionId/xhr_streaming")).andExpect(status().isNotFound()); + } + + @RestController + public static class TestController { + + @RequestMapping(value = "/test") + public String test() { + return "test"; + } + } +} diff --git a/src/test/java/org/datasurvey/web/rest/EPreguntaAbiertaResourceIT.java b/src/test/java/org/datasurvey/web/rest/EPreguntaAbiertaResourceIT.java new file mode 100644 index 0000000..c68dbb1 --- /dev/null +++ b/src/test/java/org/datasurvey/web/rest/EPreguntaAbiertaResourceIT.java @@ -0,0 +1,785 @@ +package org.datasurvey.web.rest; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.hamcrest.Matchers.hasItem; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +import java.util.List; +import java.util.Random; +import java.util.concurrent.atomic.AtomicLong; +import javax.persistence.EntityManager; +import org.datasurvey.IntegrationTest; +import org.datasurvey.domain.EPreguntaAbierta; +import org.datasurvey.domain.EPreguntaAbiertaRespuesta; +import org.datasurvey.domain.Encuesta; +import org.datasurvey.repository.EPreguntaAbiertaRepository; +import org.datasurvey.service.criteria.EPreguntaAbiertaCriteria; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.http.MediaType; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.transaction.annotation.Transactional; + +/** + * Integration tests for the {@link EPreguntaAbiertaResource} REST controller. + */ +@IntegrationTest +@AutoConfigureMockMvc +@WithMockUser +class EPreguntaAbiertaResourceIT { + + private static final String DEFAULT_NOMBRE = "AAAAAAAAAA"; + private static final String UPDATED_NOMBRE = "BBBBBBBBBB"; + + private static final Boolean DEFAULT_OPCIONAL = false; + private static final Boolean UPDATED_OPCIONAL = true; + + private static final Integer DEFAULT_ORDEN = 1; + private static final Integer UPDATED_ORDEN = 2; + private static final Integer SMALLER_ORDEN = 1 - 1; + + private static final String ENTITY_API_URL = "/api/e-pregunta-abiertas"; + private static final String ENTITY_API_URL_ID = ENTITY_API_URL + "/{id}"; + + private static Random random = new Random(); + private static AtomicLong count = new AtomicLong(random.nextInt() + (2 * Integer.MAX_VALUE)); + + @Autowired + private EPreguntaAbiertaRepository ePreguntaAbiertaRepository; + + @Autowired + private EntityManager em; + + @Autowired + private MockMvc restEPreguntaAbiertaMockMvc; + + private EPreguntaAbierta ePreguntaAbierta; + + /** + * Create an entity for this test. + * + * This is a static method, as tests for other entities might also need it, + * if they test an entity which requires the current entity. + */ + public static EPreguntaAbierta createEntity(EntityManager em) { + EPreguntaAbierta ePreguntaAbierta = new EPreguntaAbierta().nombre(DEFAULT_NOMBRE).opcional(DEFAULT_OPCIONAL).orden(DEFAULT_ORDEN); + return ePreguntaAbierta; + } + + /** + * Create an updated entity for this test. + * + * This is a static method, as tests for other entities might also need it, + * if they test an entity which requires the current entity. + */ + public static EPreguntaAbierta createUpdatedEntity(EntityManager em) { + EPreguntaAbierta ePreguntaAbierta = new EPreguntaAbierta().nombre(UPDATED_NOMBRE).opcional(UPDATED_OPCIONAL).orden(UPDATED_ORDEN); + return ePreguntaAbierta; + } + + @BeforeEach + public void initTest() { + ePreguntaAbierta = createEntity(em); + } + + @Test + @Transactional + void createEPreguntaAbierta() throws Exception { + int databaseSizeBeforeCreate = ePreguntaAbiertaRepository.findAll().size(); + // Create the EPreguntaAbierta + restEPreguntaAbiertaMockMvc + .perform( + post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(ePreguntaAbierta)) + ) + .andExpect(status().isCreated()); + + // Validate the EPreguntaAbierta in the database + List ePreguntaAbiertaList = ePreguntaAbiertaRepository.findAll(); + assertThat(ePreguntaAbiertaList).hasSize(databaseSizeBeforeCreate + 1); + EPreguntaAbierta testEPreguntaAbierta = ePreguntaAbiertaList.get(ePreguntaAbiertaList.size() - 1); + assertThat(testEPreguntaAbierta.getNombre()).isEqualTo(DEFAULT_NOMBRE); + assertThat(testEPreguntaAbierta.getOpcional()).isEqualTo(DEFAULT_OPCIONAL); + assertThat(testEPreguntaAbierta.getOrden()).isEqualTo(DEFAULT_ORDEN); + } + + @Test + @Transactional + void createEPreguntaAbiertaWithExistingId() throws Exception { + // Create the EPreguntaAbierta with an existing ID + ePreguntaAbierta.setId(1L); + + int databaseSizeBeforeCreate = ePreguntaAbiertaRepository.findAll().size(); + + // An entity with an existing ID cannot be created, so this API call must fail + restEPreguntaAbiertaMockMvc + .perform( + post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(ePreguntaAbierta)) + ) + .andExpect(status().isBadRequest()); + + // Validate the EPreguntaAbierta in the database + List ePreguntaAbiertaList = ePreguntaAbiertaRepository.findAll(); + assertThat(ePreguntaAbiertaList).hasSize(databaseSizeBeforeCreate); + } + + @Test + @Transactional + void checkNombreIsRequired() throws Exception { + int databaseSizeBeforeTest = ePreguntaAbiertaRepository.findAll().size(); + // set the field null + ePreguntaAbierta.setNombre(null); + + // Create the EPreguntaAbierta, which fails. + + restEPreguntaAbiertaMockMvc + .perform( + post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(ePreguntaAbierta)) + ) + .andExpect(status().isBadRequest()); + + List ePreguntaAbiertaList = ePreguntaAbiertaRepository.findAll(); + assertThat(ePreguntaAbiertaList).hasSize(databaseSizeBeforeTest); + } + + @Test + @Transactional + void checkOpcionalIsRequired() throws Exception { + int databaseSizeBeforeTest = ePreguntaAbiertaRepository.findAll().size(); + // set the field null + ePreguntaAbierta.setOpcional(null); + + // Create the EPreguntaAbierta, which fails. + + restEPreguntaAbiertaMockMvc + .perform( + post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(ePreguntaAbierta)) + ) + .andExpect(status().isBadRequest()); + + List ePreguntaAbiertaList = ePreguntaAbiertaRepository.findAll(); + assertThat(ePreguntaAbiertaList).hasSize(databaseSizeBeforeTest); + } + + @Test + @Transactional + void checkOrdenIsRequired() throws Exception { + int databaseSizeBeforeTest = ePreguntaAbiertaRepository.findAll().size(); + // set the field null + ePreguntaAbierta.setOrden(null); + + // Create the EPreguntaAbierta, which fails. + + restEPreguntaAbiertaMockMvc + .perform( + post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(ePreguntaAbierta)) + ) + .andExpect(status().isBadRequest()); + + List ePreguntaAbiertaList = ePreguntaAbiertaRepository.findAll(); + assertThat(ePreguntaAbiertaList).hasSize(databaseSizeBeforeTest); + } + + @Test + @Transactional + void getAllEPreguntaAbiertas() throws Exception { + // Initialize the database + ePreguntaAbiertaRepository.saveAndFlush(ePreguntaAbierta); + + // Get all the ePreguntaAbiertaList + restEPreguntaAbiertaMockMvc + .perform(get(ENTITY_API_URL + "?sort=id,desc")) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.[*].id").value(hasItem(ePreguntaAbierta.getId().intValue()))) + .andExpect(jsonPath("$.[*].nombre").value(hasItem(DEFAULT_NOMBRE))) + .andExpect(jsonPath("$.[*].opcional").value(hasItem(DEFAULT_OPCIONAL.booleanValue()))) + .andExpect(jsonPath("$.[*].orden").value(hasItem(DEFAULT_ORDEN))); + } + + @Test + @Transactional + void getEPreguntaAbierta() throws Exception { + // Initialize the database + ePreguntaAbiertaRepository.saveAndFlush(ePreguntaAbierta); + + // Get the ePreguntaAbierta + restEPreguntaAbiertaMockMvc + .perform(get(ENTITY_API_URL_ID, ePreguntaAbierta.getId())) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.id").value(ePreguntaAbierta.getId().intValue())) + .andExpect(jsonPath("$.nombre").value(DEFAULT_NOMBRE)) + .andExpect(jsonPath("$.opcional").value(DEFAULT_OPCIONAL.booleanValue())) + .andExpect(jsonPath("$.orden").value(DEFAULT_ORDEN)); + } + + @Test + @Transactional + void getEPreguntaAbiertasByIdFiltering() throws Exception { + // Initialize the database + ePreguntaAbiertaRepository.saveAndFlush(ePreguntaAbierta); + + Long id = ePreguntaAbierta.getId(); + + defaultEPreguntaAbiertaShouldBeFound("id.equals=" + id); + defaultEPreguntaAbiertaShouldNotBeFound("id.notEquals=" + id); + + defaultEPreguntaAbiertaShouldBeFound("id.greaterThanOrEqual=" + id); + defaultEPreguntaAbiertaShouldNotBeFound("id.greaterThan=" + id); + + defaultEPreguntaAbiertaShouldBeFound("id.lessThanOrEqual=" + id); + defaultEPreguntaAbiertaShouldNotBeFound("id.lessThan=" + id); + } + + @Test + @Transactional + void getAllEPreguntaAbiertasByNombreIsEqualToSomething() throws Exception { + // Initialize the database + ePreguntaAbiertaRepository.saveAndFlush(ePreguntaAbierta); + + // Get all the ePreguntaAbiertaList where nombre equals to DEFAULT_NOMBRE + defaultEPreguntaAbiertaShouldBeFound("nombre.equals=" + DEFAULT_NOMBRE); + + // Get all the ePreguntaAbiertaList where nombre equals to UPDATED_NOMBRE + defaultEPreguntaAbiertaShouldNotBeFound("nombre.equals=" + UPDATED_NOMBRE); + } + + @Test + @Transactional + void getAllEPreguntaAbiertasByNombreIsNotEqualToSomething() throws Exception { + // Initialize the database + ePreguntaAbiertaRepository.saveAndFlush(ePreguntaAbierta); + + // Get all the ePreguntaAbiertaList where nombre not equals to DEFAULT_NOMBRE + defaultEPreguntaAbiertaShouldNotBeFound("nombre.notEquals=" + DEFAULT_NOMBRE); + + // Get all the ePreguntaAbiertaList where nombre not equals to UPDATED_NOMBRE + defaultEPreguntaAbiertaShouldBeFound("nombre.notEquals=" + UPDATED_NOMBRE); + } + + @Test + @Transactional + void getAllEPreguntaAbiertasByNombreIsInShouldWork() throws Exception { + // Initialize the database + ePreguntaAbiertaRepository.saveAndFlush(ePreguntaAbierta); + + // Get all the ePreguntaAbiertaList where nombre in DEFAULT_NOMBRE or UPDATED_NOMBRE + defaultEPreguntaAbiertaShouldBeFound("nombre.in=" + DEFAULT_NOMBRE + "," + UPDATED_NOMBRE); + + // Get all the ePreguntaAbiertaList where nombre equals to UPDATED_NOMBRE + defaultEPreguntaAbiertaShouldNotBeFound("nombre.in=" + UPDATED_NOMBRE); + } + + @Test + @Transactional + void getAllEPreguntaAbiertasByNombreIsNullOrNotNull() throws Exception { + // Initialize the database + ePreguntaAbiertaRepository.saveAndFlush(ePreguntaAbierta); + + // Get all the ePreguntaAbiertaList where nombre is not null + defaultEPreguntaAbiertaShouldBeFound("nombre.specified=true"); + + // Get all the ePreguntaAbiertaList where nombre is null + defaultEPreguntaAbiertaShouldNotBeFound("nombre.specified=false"); + } + + @Test + @Transactional + void getAllEPreguntaAbiertasByNombreContainsSomething() throws Exception { + // Initialize the database + ePreguntaAbiertaRepository.saveAndFlush(ePreguntaAbierta); + + // Get all the ePreguntaAbiertaList where nombre contains DEFAULT_NOMBRE + defaultEPreguntaAbiertaShouldBeFound("nombre.contains=" + DEFAULT_NOMBRE); + + // Get all the ePreguntaAbiertaList where nombre contains UPDATED_NOMBRE + defaultEPreguntaAbiertaShouldNotBeFound("nombre.contains=" + UPDATED_NOMBRE); + } + + @Test + @Transactional + void getAllEPreguntaAbiertasByNombreNotContainsSomething() throws Exception { + // Initialize the database + ePreguntaAbiertaRepository.saveAndFlush(ePreguntaAbierta); + + // Get all the ePreguntaAbiertaList where nombre does not contain DEFAULT_NOMBRE + defaultEPreguntaAbiertaShouldNotBeFound("nombre.doesNotContain=" + DEFAULT_NOMBRE); + + // Get all the ePreguntaAbiertaList where nombre does not contain UPDATED_NOMBRE + defaultEPreguntaAbiertaShouldBeFound("nombre.doesNotContain=" + UPDATED_NOMBRE); + } + + @Test + @Transactional + void getAllEPreguntaAbiertasByOpcionalIsEqualToSomething() throws Exception { + // Initialize the database + ePreguntaAbiertaRepository.saveAndFlush(ePreguntaAbierta); + + // Get all the ePreguntaAbiertaList where opcional equals to DEFAULT_OPCIONAL + defaultEPreguntaAbiertaShouldBeFound("opcional.equals=" + DEFAULT_OPCIONAL); + + // Get all the ePreguntaAbiertaList where opcional equals to UPDATED_OPCIONAL + defaultEPreguntaAbiertaShouldNotBeFound("opcional.equals=" + UPDATED_OPCIONAL); + } + + @Test + @Transactional + void getAllEPreguntaAbiertasByOpcionalIsNotEqualToSomething() throws Exception { + // Initialize the database + ePreguntaAbiertaRepository.saveAndFlush(ePreguntaAbierta); + + // Get all the ePreguntaAbiertaList where opcional not equals to DEFAULT_OPCIONAL + defaultEPreguntaAbiertaShouldNotBeFound("opcional.notEquals=" + DEFAULT_OPCIONAL); + + // Get all the ePreguntaAbiertaList where opcional not equals to UPDATED_OPCIONAL + defaultEPreguntaAbiertaShouldBeFound("opcional.notEquals=" + UPDATED_OPCIONAL); + } + + @Test + @Transactional + void getAllEPreguntaAbiertasByOpcionalIsInShouldWork() throws Exception { + // Initialize the database + ePreguntaAbiertaRepository.saveAndFlush(ePreguntaAbierta); + + // Get all the ePreguntaAbiertaList where opcional in DEFAULT_OPCIONAL or UPDATED_OPCIONAL + defaultEPreguntaAbiertaShouldBeFound("opcional.in=" + DEFAULT_OPCIONAL + "," + UPDATED_OPCIONAL); + + // Get all the ePreguntaAbiertaList where opcional equals to UPDATED_OPCIONAL + defaultEPreguntaAbiertaShouldNotBeFound("opcional.in=" + UPDATED_OPCIONAL); + } + + @Test + @Transactional + void getAllEPreguntaAbiertasByOpcionalIsNullOrNotNull() throws Exception { + // Initialize the database + ePreguntaAbiertaRepository.saveAndFlush(ePreguntaAbierta); + + // Get all the ePreguntaAbiertaList where opcional is not null + defaultEPreguntaAbiertaShouldBeFound("opcional.specified=true"); + + // Get all the ePreguntaAbiertaList where opcional is null + defaultEPreguntaAbiertaShouldNotBeFound("opcional.specified=false"); + } + + @Test + @Transactional + void getAllEPreguntaAbiertasByOrdenIsEqualToSomething() throws Exception { + // Initialize the database + ePreguntaAbiertaRepository.saveAndFlush(ePreguntaAbierta); + + // Get all the ePreguntaAbiertaList where orden equals to DEFAULT_ORDEN + defaultEPreguntaAbiertaShouldBeFound("orden.equals=" + DEFAULT_ORDEN); + + // Get all the ePreguntaAbiertaList where orden equals to UPDATED_ORDEN + defaultEPreguntaAbiertaShouldNotBeFound("orden.equals=" + UPDATED_ORDEN); + } + + @Test + @Transactional + void getAllEPreguntaAbiertasByOrdenIsNotEqualToSomething() throws Exception { + // Initialize the database + ePreguntaAbiertaRepository.saveAndFlush(ePreguntaAbierta); + + // Get all the ePreguntaAbiertaList where orden not equals to DEFAULT_ORDEN + defaultEPreguntaAbiertaShouldNotBeFound("orden.notEquals=" + DEFAULT_ORDEN); + + // Get all the ePreguntaAbiertaList where orden not equals to UPDATED_ORDEN + defaultEPreguntaAbiertaShouldBeFound("orden.notEquals=" + UPDATED_ORDEN); + } + + @Test + @Transactional + void getAllEPreguntaAbiertasByOrdenIsInShouldWork() throws Exception { + // Initialize the database + ePreguntaAbiertaRepository.saveAndFlush(ePreguntaAbierta); + + // Get all the ePreguntaAbiertaList where orden in DEFAULT_ORDEN or UPDATED_ORDEN + defaultEPreguntaAbiertaShouldBeFound("orden.in=" + DEFAULT_ORDEN + "," + UPDATED_ORDEN); + + // Get all the ePreguntaAbiertaList where orden equals to UPDATED_ORDEN + defaultEPreguntaAbiertaShouldNotBeFound("orden.in=" + UPDATED_ORDEN); + } + + @Test + @Transactional + void getAllEPreguntaAbiertasByOrdenIsNullOrNotNull() throws Exception { + // Initialize the database + ePreguntaAbiertaRepository.saveAndFlush(ePreguntaAbierta); + + // Get all the ePreguntaAbiertaList where orden is not null + defaultEPreguntaAbiertaShouldBeFound("orden.specified=true"); + + // Get all the ePreguntaAbiertaList where orden is null + defaultEPreguntaAbiertaShouldNotBeFound("orden.specified=false"); + } + + @Test + @Transactional + void getAllEPreguntaAbiertasByOrdenIsGreaterThanOrEqualToSomething() throws Exception { + // Initialize the database + ePreguntaAbiertaRepository.saveAndFlush(ePreguntaAbierta); + + // Get all the ePreguntaAbiertaList where orden is greater than or equal to DEFAULT_ORDEN + defaultEPreguntaAbiertaShouldBeFound("orden.greaterThanOrEqual=" + DEFAULT_ORDEN); + + // Get all the ePreguntaAbiertaList where orden is greater than or equal to UPDATED_ORDEN + defaultEPreguntaAbiertaShouldNotBeFound("orden.greaterThanOrEqual=" + UPDATED_ORDEN); + } + + @Test + @Transactional + void getAllEPreguntaAbiertasByOrdenIsLessThanOrEqualToSomething() throws Exception { + // Initialize the database + ePreguntaAbiertaRepository.saveAndFlush(ePreguntaAbierta); + + // Get all the ePreguntaAbiertaList where orden is less than or equal to DEFAULT_ORDEN + defaultEPreguntaAbiertaShouldBeFound("orden.lessThanOrEqual=" + DEFAULT_ORDEN); + + // Get all the ePreguntaAbiertaList where orden is less than or equal to SMALLER_ORDEN + defaultEPreguntaAbiertaShouldNotBeFound("orden.lessThanOrEqual=" + SMALLER_ORDEN); + } + + @Test + @Transactional + void getAllEPreguntaAbiertasByOrdenIsLessThanSomething() throws Exception { + // Initialize the database + ePreguntaAbiertaRepository.saveAndFlush(ePreguntaAbierta); + + // Get all the ePreguntaAbiertaList where orden is less than DEFAULT_ORDEN + defaultEPreguntaAbiertaShouldNotBeFound("orden.lessThan=" + DEFAULT_ORDEN); + + // Get all the ePreguntaAbiertaList where orden is less than UPDATED_ORDEN + defaultEPreguntaAbiertaShouldBeFound("orden.lessThan=" + UPDATED_ORDEN); + } + + @Test + @Transactional + void getAllEPreguntaAbiertasByOrdenIsGreaterThanSomething() throws Exception { + // Initialize the database + ePreguntaAbiertaRepository.saveAndFlush(ePreguntaAbierta); + + // Get all the ePreguntaAbiertaList where orden is greater than DEFAULT_ORDEN + defaultEPreguntaAbiertaShouldNotBeFound("orden.greaterThan=" + DEFAULT_ORDEN); + + // Get all the ePreguntaAbiertaList where orden is greater than SMALLER_ORDEN + defaultEPreguntaAbiertaShouldBeFound("orden.greaterThan=" + SMALLER_ORDEN); + } + + @Test + @Transactional + void getAllEPreguntaAbiertasByEPreguntaAbiertaRespuestaIsEqualToSomething() throws Exception { + // Initialize the database + ePreguntaAbiertaRepository.saveAndFlush(ePreguntaAbierta); + EPreguntaAbiertaRespuesta ePreguntaAbiertaRespuesta = EPreguntaAbiertaRespuestaResourceIT.createEntity(em); + em.persist(ePreguntaAbiertaRespuesta); + em.flush(); + ePreguntaAbierta.addEPreguntaAbiertaRespuesta(ePreguntaAbiertaRespuesta); + ePreguntaAbiertaRepository.saveAndFlush(ePreguntaAbierta); + Long ePreguntaAbiertaRespuestaId = ePreguntaAbiertaRespuesta.getId(); + + // Get all the ePreguntaAbiertaList where ePreguntaAbiertaRespuesta equals to ePreguntaAbiertaRespuestaId + defaultEPreguntaAbiertaShouldBeFound("ePreguntaAbiertaRespuestaId.equals=" + ePreguntaAbiertaRespuestaId); + + // Get all the ePreguntaAbiertaList where ePreguntaAbiertaRespuesta equals to (ePreguntaAbiertaRespuestaId + 1) + defaultEPreguntaAbiertaShouldNotBeFound("ePreguntaAbiertaRespuestaId.equals=" + (ePreguntaAbiertaRespuestaId + 1)); + } + + @Test + @Transactional + void getAllEPreguntaAbiertasByEncuestaIsEqualToSomething() throws Exception { + // Initialize the database + ePreguntaAbiertaRepository.saveAndFlush(ePreguntaAbierta); + Encuesta encuesta = EncuestaResourceIT.createEntity(em); + em.persist(encuesta); + em.flush(); + ePreguntaAbierta.setEncuesta(encuesta); + ePreguntaAbiertaRepository.saveAndFlush(ePreguntaAbierta); + Long encuestaId = encuesta.getId(); + + // Get all the ePreguntaAbiertaList where encuesta equals to encuestaId + defaultEPreguntaAbiertaShouldBeFound("encuestaId.equals=" + encuestaId); + + // Get all the ePreguntaAbiertaList where encuesta equals to (encuestaId + 1) + defaultEPreguntaAbiertaShouldNotBeFound("encuestaId.equals=" + (encuestaId + 1)); + } + + /** + * Executes the search, and checks that the default entity is returned. + */ + private void defaultEPreguntaAbiertaShouldBeFound(String filter) throws Exception { + restEPreguntaAbiertaMockMvc + .perform(get(ENTITY_API_URL + "?sort=id,desc&" + filter)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.[*].id").value(hasItem(ePreguntaAbierta.getId().intValue()))) + .andExpect(jsonPath("$.[*].nombre").value(hasItem(DEFAULT_NOMBRE))) + .andExpect(jsonPath("$.[*].opcional").value(hasItem(DEFAULT_OPCIONAL.booleanValue()))) + .andExpect(jsonPath("$.[*].orden").value(hasItem(DEFAULT_ORDEN))); + + // Check, that the count call also returns 1 + restEPreguntaAbiertaMockMvc + .perform(get(ENTITY_API_URL + "/count?sort=id,desc&" + filter)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(content().string("1")); + } + + /** + * Executes the search, and checks that the default entity is not returned. + */ + private void defaultEPreguntaAbiertaShouldNotBeFound(String filter) throws Exception { + restEPreguntaAbiertaMockMvc + .perform(get(ENTITY_API_URL + "?sort=id,desc&" + filter)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$").isArray()) + .andExpect(jsonPath("$").isEmpty()); + + // Check, that the count call also returns 0 + restEPreguntaAbiertaMockMvc + .perform(get(ENTITY_API_URL + "/count?sort=id,desc&" + filter)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(content().string("0")); + } + + @Test + @Transactional + void getNonExistingEPreguntaAbierta() throws Exception { + // Get the ePreguntaAbierta + restEPreguntaAbiertaMockMvc.perform(get(ENTITY_API_URL_ID, Long.MAX_VALUE)).andExpect(status().isNotFound()); + } + + @Test + @Transactional + void putNewEPreguntaAbierta() throws Exception { + // Initialize the database + ePreguntaAbiertaRepository.saveAndFlush(ePreguntaAbierta); + + int databaseSizeBeforeUpdate = ePreguntaAbiertaRepository.findAll().size(); + + // Update the ePreguntaAbierta + EPreguntaAbierta updatedEPreguntaAbierta = ePreguntaAbiertaRepository.findById(ePreguntaAbierta.getId()).get(); + // Disconnect from session so that the updates on updatedEPreguntaAbierta are not directly saved in db + em.detach(updatedEPreguntaAbierta); + updatedEPreguntaAbierta.nombre(UPDATED_NOMBRE).opcional(UPDATED_OPCIONAL).orden(UPDATED_ORDEN); + + restEPreguntaAbiertaMockMvc + .perform( + put(ENTITY_API_URL_ID, updatedEPreguntaAbierta.getId()) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(updatedEPreguntaAbierta)) + ) + .andExpect(status().isOk()); + + // Validate the EPreguntaAbierta in the database + List ePreguntaAbiertaList = ePreguntaAbiertaRepository.findAll(); + assertThat(ePreguntaAbiertaList).hasSize(databaseSizeBeforeUpdate); + EPreguntaAbierta testEPreguntaAbierta = ePreguntaAbiertaList.get(ePreguntaAbiertaList.size() - 1); + assertThat(testEPreguntaAbierta.getNombre()).isEqualTo(UPDATED_NOMBRE); + assertThat(testEPreguntaAbierta.getOpcional()).isEqualTo(UPDATED_OPCIONAL); + assertThat(testEPreguntaAbierta.getOrden()).isEqualTo(UPDATED_ORDEN); + } + + @Test + @Transactional + void putNonExistingEPreguntaAbierta() throws Exception { + int databaseSizeBeforeUpdate = ePreguntaAbiertaRepository.findAll().size(); + ePreguntaAbierta.setId(count.incrementAndGet()); + + // If the entity doesn't have an ID, it will throw BadRequestAlertException + restEPreguntaAbiertaMockMvc + .perform( + put(ENTITY_API_URL_ID, ePreguntaAbierta.getId()) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(ePreguntaAbierta)) + ) + .andExpect(status().isBadRequest()); + + // Validate the EPreguntaAbierta in the database + List ePreguntaAbiertaList = ePreguntaAbiertaRepository.findAll(); + assertThat(ePreguntaAbiertaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void putWithIdMismatchEPreguntaAbierta() throws Exception { + int databaseSizeBeforeUpdate = ePreguntaAbiertaRepository.findAll().size(); + ePreguntaAbierta.setId(count.incrementAndGet()); + + // If url ID doesn't match entity ID, it will throw BadRequestAlertException + restEPreguntaAbiertaMockMvc + .perform( + put(ENTITY_API_URL_ID, count.incrementAndGet()) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(ePreguntaAbierta)) + ) + .andExpect(status().isBadRequest()); + + // Validate the EPreguntaAbierta in the database + List ePreguntaAbiertaList = ePreguntaAbiertaRepository.findAll(); + assertThat(ePreguntaAbiertaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void putWithMissingIdPathParamEPreguntaAbierta() throws Exception { + int databaseSizeBeforeUpdate = ePreguntaAbiertaRepository.findAll().size(); + ePreguntaAbierta.setId(count.incrementAndGet()); + + // If url ID doesn't match entity ID, it will throw BadRequestAlertException + restEPreguntaAbiertaMockMvc + .perform( + put(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(ePreguntaAbierta)) + ) + .andExpect(status().isMethodNotAllowed()); + + // Validate the EPreguntaAbierta in the database + List ePreguntaAbiertaList = ePreguntaAbiertaRepository.findAll(); + assertThat(ePreguntaAbiertaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void partialUpdateEPreguntaAbiertaWithPatch() throws Exception { + // Initialize the database + ePreguntaAbiertaRepository.saveAndFlush(ePreguntaAbierta); + + int databaseSizeBeforeUpdate = ePreguntaAbiertaRepository.findAll().size(); + + // Update the ePreguntaAbierta using partial update + EPreguntaAbierta partialUpdatedEPreguntaAbierta = new EPreguntaAbierta(); + partialUpdatedEPreguntaAbierta.setId(ePreguntaAbierta.getId()); + + partialUpdatedEPreguntaAbierta.nombre(UPDATED_NOMBRE).opcional(UPDATED_OPCIONAL).orden(UPDATED_ORDEN); + + restEPreguntaAbiertaMockMvc + .perform( + patch(ENTITY_API_URL_ID, partialUpdatedEPreguntaAbierta.getId()) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(partialUpdatedEPreguntaAbierta)) + ) + .andExpect(status().isOk()); + + // Validate the EPreguntaAbierta in the database + List ePreguntaAbiertaList = ePreguntaAbiertaRepository.findAll(); + assertThat(ePreguntaAbiertaList).hasSize(databaseSizeBeforeUpdate); + EPreguntaAbierta testEPreguntaAbierta = ePreguntaAbiertaList.get(ePreguntaAbiertaList.size() - 1); + assertThat(testEPreguntaAbierta.getNombre()).isEqualTo(UPDATED_NOMBRE); + assertThat(testEPreguntaAbierta.getOpcional()).isEqualTo(UPDATED_OPCIONAL); + assertThat(testEPreguntaAbierta.getOrden()).isEqualTo(UPDATED_ORDEN); + } + + @Test + @Transactional + void fullUpdateEPreguntaAbiertaWithPatch() throws Exception { + // Initialize the database + ePreguntaAbiertaRepository.saveAndFlush(ePreguntaAbierta); + + int databaseSizeBeforeUpdate = ePreguntaAbiertaRepository.findAll().size(); + + // Update the ePreguntaAbierta using partial update + EPreguntaAbierta partialUpdatedEPreguntaAbierta = new EPreguntaAbierta(); + partialUpdatedEPreguntaAbierta.setId(ePreguntaAbierta.getId()); + + partialUpdatedEPreguntaAbierta.nombre(UPDATED_NOMBRE).opcional(UPDATED_OPCIONAL).orden(UPDATED_ORDEN); + + restEPreguntaAbiertaMockMvc + .perform( + patch(ENTITY_API_URL_ID, partialUpdatedEPreguntaAbierta.getId()) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(partialUpdatedEPreguntaAbierta)) + ) + .andExpect(status().isOk()); + + // Validate the EPreguntaAbierta in the database + List ePreguntaAbiertaList = ePreguntaAbiertaRepository.findAll(); + assertThat(ePreguntaAbiertaList).hasSize(databaseSizeBeforeUpdate); + EPreguntaAbierta testEPreguntaAbierta = ePreguntaAbiertaList.get(ePreguntaAbiertaList.size() - 1); + assertThat(testEPreguntaAbierta.getNombre()).isEqualTo(UPDATED_NOMBRE); + assertThat(testEPreguntaAbierta.getOpcional()).isEqualTo(UPDATED_OPCIONAL); + assertThat(testEPreguntaAbierta.getOrden()).isEqualTo(UPDATED_ORDEN); + } + + @Test + @Transactional + void patchNonExistingEPreguntaAbierta() throws Exception { + int databaseSizeBeforeUpdate = ePreguntaAbiertaRepository.findAll().size(); + ePreguntaAbierta.setId(count.incrementAndGet()); + + // If the entity doesn't have an ID, it will throw BadRequestAlertException + restEPreguntaAbiertaMockMvc + .perform( + patch(ENTITY_API_URL_ID, ePreguntaAbierta.getId()) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(ePreguntaAbierta)) + ) + .andExpect(status().isBadRequest()); + + // Validate the EPreguntaAbierta in the database + List ePreguntaAbiertaList = ePreguntaAbiertaRepository.findAll(); + assertThat(ePreguntaAbiertaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void patchWithIdMismatchEPreguntaAbierta() throws Exception { + int databaseSizeBeforeUpdate = ePreguntaAbiertaRepository.findAll().size(); + ePreguntaAbierta.setId(count.incrementAndGet()); + + // If url ID doesn't match entity ID, it will throw BadRequestAlertException + restEPreguntaAbiertaMockMvc + .perform( + patch(ENTITY_API_URL_ID, count.incrementAndGet()) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(ePreguntaAbierta)) + ) + .andExpect(status().isBadRequest()); + + // Validate the EPreguntaAbierta in the database + List ePreguntaAbiertaList = ePreguntaAbiertaRepository.findAll(); + assertThat(ePreguntaAbiertaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void patchWithMissingIdPathParamEPreguntaAbierta() throws Exception { + int databaseSizeBeforeUpdate = ePreguntaAbiertaRepository.findAll().size(); + ePreguntaAbierta.setId(count.incrementAndGet()); + + // If url ID doesn't match entity ID, it will throw BadRequestAlertException + restEPreguntaAbiertaMockMvc + .perform( + patch(ENTITY_API_URL) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(ePreguntaAbierta)) + ) + .andExpect(status().isMethodNotAllowed()); + + // Validate the EPreguntaAbierta in the database + List ePreguntaAbiertaList = ePreguntaAbiertaRepository.findAll(); + assertThat(ePreguntaAbiertaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void deleteEPreguntaAbierta() throws Exception { + // Initialize the database + ePreguntaAbiertaRepository.saveAndFlush(ePreguntaAbierta); + + int databaseSizeBeforeDelete = ePreguntaAbiertaRepository.findAll().size(); + + // Delete the ePreguntaAbierta + restEPreguntaAbiertaMockMvc + .perform(delete(ENTITY_API_URL_ID, ePreguntaAbierta.getId()).accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isNoContent()); + + // Validate the database contains one less item + List ePreguntaAbiertaList = ePreguntaAbiertaRepository.findAll(); + assertThat(ePreguntaAbiertaList).hasSize(databaseSizeBeforeDelete - 1); + } +} diff --git a/src/test/java/org/datasurvey/web/rest/EPreguntaAbiertaRespuestaResourceIT.java b/src/test/java/org/datasurvey/web/rest/EPreguntaAbiertaRespuestaResourceIT.java new file mode 100644 index 0000000..b0d9877 --- /dev/null +++ b/src/test/java/org/datasurvey/web/rest/EPreguntaAbiertaRespuestaResourceIT.java @@ -0,0 +1,566 @@ +package org.datasurvey.web.rest; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.hamcrest.Matchers.hasItem; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +import java.util.List; +import java.util.Random; +import java.util.concurrent.atomic.AtomicLong; +import javax.persistence.EntityManager; +import org.datasurvey.IntegrationTest; +import org.datasurvey.domain.EPreguntaAbierta; +import org.datasurvey.domain.EPreguntaAbiertaRespuesta; +import org.datasurvey.repository.EPreguntaAbiertaRespuestaRepository; +import org.datasurvey.service.criteria.EPreguntaAbiertaRespuestaCriteria; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.http.MediaType; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.transaction.annotation.Transactional; + +/** + * Integration tests for the {@link EPreguntaAbiertaRespuestaResource} REST controller. + */ +@IntegrationTest +@AutoConfigureMockMvc +@WithMockUser +class EPreguntaAbiertaRespuestaResourceIT { + + private static final String DEFAULT_RESPUESTA = "AAAAAAAAAA"; + private static final String UPDATED_RESPUESTA = "BBBBBBBBBB"; + + private static final String ENTITY_API_URL = "/api/e-pregunta-abierta-respuestas"; + private static final String ENTITY_API_URL_ID = ENTITY_API_URL + "/{id}"; + + private static Random random = new Random(); + private static AtomicLong count = new AtomicLong(random.nextInt() + (2 * Integer.MAX_VALUE)); + + @Autowired + private EPreguntaAbiertaRespuestaRepository ePreguntaAbiertaRespuestaRepository; + + @Autowired + private EntityManager em; + + @Autowired + private MockMvc restEPreguntaAbiertaRespuestaMockMvc; + + private EPreguntaAbiertaRespuesta ePreguntaAbiertaRespuesta; + + /** + * Create an entity for this test. + * + * This is a static method, as tests for other entities might also need it, + * if they test an entity which requires the current entity. + */ + public static EPreguntaAbiertaRespuesta createEntity(EntityManager em) { + EPreguntaAbiertaRespuesta ePreguntaAbiertaRespuesta = new EPreguntaAbiertaRespuesta().respuesta(DEFAULT_RESPUESTA); + return ePreguntaAbiertaRespuesta; + } + + /** + * Create an updated entity for this test. + * + * This is a static method, as tests for other entities might also need it, + * if they test an entity which requires the current entity. + */ + public static EPreguntaAbiertaRespuesta createUpdatedEntity(EntityManager em) { + EPreguntaAbiertaRespuesta ePreguntaAbiertaRespuesta = new EPreguntaAbiertaRespuesta().respuesta(UPDATED_RESPUESTA); + return ePreguntaAbiertaRespuesta; + } + + @BeforeEach + public void initTest() { + ePreguntaAbiertaRespuesta = createEntity(em); + } + + @Test + @Transactional + void createEPreguntaAbiertaRespuesta() throws Exception { + int databaseSizeBeforeCreate = ePreguntaAbiertaRespuestaRepository.findAll().size(); + // Create the EPreguntaAbiertaRespuesta + restEPreguntaAbiertaRespuestaMockMvc + .perform( + post(ENTITY_API_URL) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(ePreguntaAbiertaRespuesta)) + ) + .andExpect(status().isCreated()); + + // Validate the EPreguntaAbiertaRespuesta in the database + List ePreguntaAbiertaRespuestaList = ePreguntaAbiertaRespuestaRepository.findAll(); + assertThat(ePreguntaAbiertaRespuestaList).hasSize(databaseSizeBeforeCreate + 1); + EPreguntaAbiertaRespuesta testEPreguntaAbiertaRespuesta = ePreguntaAbiertaRespuestaList.get( + ePreguntaAbiertaRespuestaList.size() - 1 + ); + assertThat(testEPreguntaAbiertaRespuesta.getRespuesta()).isEqualTo(DEFAULT_RESPUESTA); + } + + @Test + @Transactional + void createEPreguntaAbiertaRespuestaWithExistingId() throws Exception { + // Create the EPreguntaAbiertaRespuesta with an existing ID + ePreguntaAbiertaRespuesta.setId(1L); + + int databaseSizeBeforeCreate = ePreguntaAbiertaRespuestaRepository.findAll().size(); + + // An entity with an existing ID cannot be created, so this API call must fail + restEPreguntaAbiertaRespuestaMockMvc + .perform( + post(ENTITY_API_URL) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(ePreguntaAbiertaRespuesta)) + ) + .andExpect(status().isBadRequest()); + + // Validate the EPreguntaAbiertaRespuesta in the database + List ePreguntaAbiertaRespuestaList = ePreguntaAbiertaRespuestaRepository.findAll(); + assertThat(ePreguntaAbiertaRespuestaList).hasSize(databaseSizeBeforeCreate); + } + + @Test + @Transactional + void checkRespuestaIsRequired() throws Exception { + int databaseSizeBeforeTest = ePreguntaAbiertaRespuestaRepository.findAll().size(); + // set the field null + ePreguntaAbiertaRespuesta.setRespuesta(null); + + // Create the EPreguntaAbiertaRespuesta, which fails. + + restEPreguntaAbiertaRespuestaMockMvc + .perform( + post(ENTITY_API_URL) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(ePreguntaAbiertaRespuesta)) + ) + .andExpect(status().isBadRequest()); + + List ePreguntaAbiertaRespuestaList = ePreguntaAbiertaRespuestaRepository.findAll(); + assertThat(ePreguntaAbiertaRespuestaList).hasSize(databaseSizeBeforeTest); + } + + @Test + @Transactional + void getAllEPreguntaAbiertaRespuestas() throws Exception { + // Initialize the database + ePreguntaAbiertaRespuestaRepository.saveAndFlush(ePreguntaAbiertaRespuesta); + + // Get all the ePreguntaAbiertaRespuestaList + restEPreguntaAbiertaRespuestaMockMvc + .perform(get(ENTITY_API_URL + "?sort=id,desc")) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.[*].id").value(hasItem(ePreguntaAbiertaRespuesta.getId().intValue()))) + .andExpect(jsonPath("$.[*].respuesta").value(hasItem(DEFAULT_RESPUESTA))); + } + + @Test + @Transactional + void getEPreguntaAbiertaRespuesta() throws Exception { + // Initialize the database + ePreguntaAbiertaRespuestaRepository.saveAndFlush(ePreguntaAbiertaRespuesta); + + // Get the ePreguntaAbiertaRespuesta + restEPreguntaAbiertaRespuestaMockMvc + .perform(get(ENTITY_API_URL_ID, ePreguntaAbiertaRespuesta.getId())) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.id").value(ePreguntaAbiertaRespuesta.getId().intValue())) + .andExpect(jsonPath("$.respuesta").value(DEFAULT_RESPUESTA)); + } + + @Test + @Transactional + void getEPreguntaAbiertaRespuestasByIdFiltering() throws Exception { + // Initialize the database + ePreguntaAbiertaRespuestaRepository.saveAndFlush(ePreguntaAbiertaRespuesta); + + Long id = ePreguntaAbiertaRespuesta.getId(); + + defaultEPreguntaAbiertaRespuestaShouldBeFound("id.equals=" + id); + defaultEPreguntaAbiertaRespuestaShouldNotBeFound("id.notEquals=" + id); + + defaultEPreguntaAbiertaRespuestaShouldBeFound("id.greaterThanOrEqual=" + id); + defaultEPreguntaAbiertaRespuestaShouldNotBeFound("id.greaterThan=" + id); + + defaultEPreguntaAbiertaRespuestaShouldBeFound("id.lessThanOrEqual=" + id); + defaultEPreguntaAbiertaRespuestaShouldNotBeFound("id.lessThan=" + id); + } + + @Test + @Transactional + void getAllEPreguntaAbiertaRespuestasByRespuestaIsEqualToSomething() throws Exception { + // Initialize the database + ePreguntaAbiertaRespuestaRepository.saveAndFlush(ePreguntaAbiertaRespuesta); + + // Get all the ePreguntaAbiertaRespuestaList where respuesta equals to DEFAULT_RESPUESTA + defaultEPreguntaAbiertaRespuestaShouldBeFound("respuesta.equals=" + DEFAULT_RESPUESTA); + + // Get all the ePreguntaAbiertaRespuestaList where respuesta equals to UPDATED_RESPUESTA + defaultEPreguntaAbiertaRespuestaShouldNotBeFound("respuesta.equals=" + UPDATED_RESPUESTA); + } + + @Test + @Transactional + void getAllEPreguntaAbiertaRespuestasByRespuestaIsNotEqualToSomething() throws Exception { + // Initialize the database + ePreguntaAbiertaRespuestaRepository.saveAndFlush(ePreguntaAbiertaRespuesta); + + // Get all the ePreguntaAbiertaRespuestaList where respuesta not equals to DEFAULT_RESPUESTA + defaultEPreguntaAbiertaRespuestaShouldNotBeFound("respuesta.notEquals=" + DEFAULT_RESPUESTA); + + // Get all the ePreguntaAbiertaRespuestaList where respuesta not equals to UPDATED_RESPUESTA + defaultEPreguntaAbiertaRespuestaShouldBeFound("respuesta.notEquals=" + UPDATED_RESPUESTA); + } + + @Test + @Transactional + void getAllEPreguntaAbiertaRespuestasByRespuestaIsInShouldWork() throws Exception { + // Initialize the database + ePreguntaAbiertaRespuestaRepository.saveAndFlush(ePreguntaAbiertaRespuesta); + + // Get all the ePreguntaAbiertaRespuestaList where respuesta in DEFAULT_RESPUESTA or UPDATED_RESPUESTA + defaultEPreguntaAbiertaRespuestaShouldBeFound("respuesta.in=" + DEFAULT_RESPUESTA + "," + UPDATED_RESPUESTA); + + // Get all the ePreguntaAbiertaRespuestaList where respuesta equals to UPDATED_RESPUESTA + defaultEPreguntaAbiertaRespuestaShouldNotBeFound("respuesta.in=" + UPDATED_RESPUESTA); + } + + @Test + @Transactional + void getAllEPreguntaAbiertaRespuestasByRespuestaIsNullOrNotNull() throws Exception { + // Initialize the database + ePreguntaAbiertaRespuestaRepository.saveAndFlush(ePreguntaAbiertaRespuesta); + + // Get all the ePreguntaAbiertaRespuestaList where respuesta is not null + defaultEPreguntaAbiertaRespuestaShouldBeFound("respuesta.specified=true"); + + // Get all the ePreguntaAbiertaRespuestaList where respuesta is null + defaultEPreguntaAbiertaRespuestaShouldNotBeFound("respuesta.specified=false"); + } + + @Test + @Transactional + void getAllEPreguntaAbiertaRespuestasByRespuestaContainsSomething() throws Exception { + // Initialize the database + ePreguntaAbiertaRespuestaRepository.saveAndFlush(ePreguntaAbiertaRespuesta); + + // Get all the ePreguntaAbiertaRespuestaList where respuesta contains DEFAULT_RESPUESTA + defaultEPreguntaAbiertaRespuestaShouldBeFound("respuesta.contains=" + DEFAULT_RESPUESTA); + + // Get all the ePreguntaAbiertaRespuestaList where respuesta contains UPDATED_RESPUESTA + defaultEPreguntaAbiertaRespuestaShouldNotBeFound("respuesta.contains=" + UPDATED_RESPUESTA); + } + + @Test + @Transactional + void getAllEPreguntaAbiertaRespuestasByRespuestaNotContainsSomething() throws Exception { + // Initialize the database + ePreguntaAbiertaRespuestaRepository.saveAndFlush(ePreguntaAbiertaRespuesta); + + // Get all the ePreguntaAbiertaRespuestaList where respuesta does not contain DEFAULT_RESPUESTA + defaultEPreguntaAbiertaRespuestaShouldNotBeFound("respuesta.doesNotContain=" + DEFAULT_RESPUESTA); + + // Get all the ePreguntaAbiertaRespuestaList where respuesta does not contain UPDATED_RESPUESTA + defaultEPreguntaAbiertaRespuestaShouldBeFound("respuesta.doesNotContain=" + UPDATED_RESPUESTA); + } + + @Test + @Transactional + void getAllEPreguntaAbiertaRespuestasByEPreguntaAbiertaIsEqualToSomething() throws Exception { + // Initialize the database + ePreguntaAbiertaRespuestaRepository.saveAndFlush(ePreguntaAbiertaRespuesta); + EPreguntaAbierta ePreguntaAbierta = EPreguntaAbiertaResourceIT.createEntity(em); + em.persist(ePreguntaAbierta); + em.flush(); + ePreguntaAbiertaRespuesta.setEPreguntaAbierta(ePreguntaAbierta); + ePreguntaAbiertaRespuestaRepository.saveAndFlush(ePreguntaAbiertaRespuesta); + Long ePreguntaAbiertaId = ePreguntaAbierta.getId(); + + // Get all the ePreguntaAbiertaRespuestaList where ePreguntaAbierta equals to ePreguntaAbiertaId + defaultEPreguntaAbiertaRespuestaShouldBeFound("ePreguntaAbiertaId.equals=" + ePreguntaAbiertaId); + + // Get all the ePreguntaAbiertaRespuestaList where ePreguntaAbierta equals to (ePreguntaAbiertaId + 1) + defaultEPreguntaAbiertaRespuestaShouldNotBeFound("ePreguntaAbiertaId.equals=" + (ePreguntaAbiertaId + 1)); + } + + /** + * Executes the search, and checks that the default entity is returned. + */ + private void defaultEPreguntaAbiertaRespuestaShouldBeFound(String filter) throws Exception { + restEPreguntaAbiertaRespuestaMockMvc + .perform(get(ENTITY_API_URL + "?sort=id,desc&" + filter)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.[*].id").value(hasItem(ePreguntaAbiertaRespuesta.getId().intValue()))) + .andExpect(jsonPath("$.[*].respuesta").value(hasItem(DEFAULT_RESPUESTA))); + + // Check, that the count call also returns 1 + restEPreguntaAbiertaRespuestaMockMvc + .perform(get(ENTITY_API_URL + "/count?sort=id,desc&" + filter)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(content().string("1")); + } + + /** + * Executes the search, and checks that the default entity is not returned. + */ + private void defaultEPreguntaAbiertaRespuestaShouldNotBeFound(String filter) throws Exception { + restEPreguntaAbiertaRespuestaMockMvc + .perform(get(ENTITY_API_URL + "?sort=id,desc&" + filter)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$").isArray()) + .andExpect(jsonPath("$").isEmpty()); + + // Check, that the count call also returns 0 + restEPreguntaAbiertaRespuestaMockMvc + .perform(get(ENTITY_API_URL + "/count?sort=id,desc&" + filter)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(content().string("0")); + } + + @Test + @Transactional + void getNonExistingEPreguntaAbiertaRespuesta() throws Exception { + // Get the ePreguntaAbiertaRespuesta + restEPreguntaAbiertaRespuestaMockMvc.perform(get(ENTITY_API_URL_ID, Long.MAX_VALUE)).andExpect(status().isNotFound()); + } + + @Test + @Transactional + void putNewEPreguntaAbiertaRespuesta() throws Exception { + // Initialize the database + ePreguntaAbiertaRespuestaRepository.saveAndFlush(ePreguntaAbiertaRespuesta); + + int databaseSizeBeforeUpdate = ePreguntaAbiertaRespuestaRepository.findAll().size(); + + // Update the ePreguntaAbiertaRespuesta + EPreguntaAbiertaRespuesta updatedEPreguntaAbiertaRespuesta = ePreguntaAbiertaRespuestaRepository + .findById(ePreguntaAbiertaRespuesta.getId()) + .get(); + // Disconnect from session so that the updates on updatedEPreguntaAbiertaRespuesta are not directly saved in db + em.detach(updatedEPreguntaAbiertaRespuesta); + updatedEPreguntaAbiertaRespuesta.respuesta(UPDATED_RESPUESTA); + + restEPreguntaAbiertaRespuestaMockMvc + .perform( + put(ENTITY_API_URL_ID, updatedEPreguntaAbiertaRespuesta.getId()) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(updatedEPreguntaAbiertaRespuesta)) + ) + .andExpect(status().isOk()); + + // Validate the EPreguntaAbiertaRespuesta in the database + List ePreguntaAbiertaRespuestaList = ePreguntaAbiertaRespuestaRepository.findAll(); + assertThat(ePreguntaAbiertaRespuestaList).hasSize(databaseSizeBeforeUpdate); + EPreguntaAbiertaRespuesta testEPreguntaAbiertaRespuesta = ePreguntaAbiertaRespuestaList.get( + ePreguntaAbiertaRespuestaList.size() - 1 + ); + assertThat(testEPreguntaAbiertaRespuesta.getRespuesta()).isEqualTo(UPDATED_RESPUESTA); + } + + @Test + @Transactional + void putNonExistingEPreguntaAbiertaRespuesta() throws Exception { + int databaseSizeBeforeUpdate = ePreguntaAbiertaRespuestaRepository.findAll().size(); + ePreguntaAbiertaRespuesta.setId(count.incrementAndGet()); + + // If the entity doesn't have an ID, it will throw BadRequestAlertException + restEPreguntaAbiertaRespuestaMockMvc + .perform( + put(ENTITY_API_URL_ID, ePreguntaAbiertaRespuesta.getId()) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(ePreguntaAbiertaRespuesta)) + ) + .andExpect(status().isBadRequest()); + + // Validate the EPreguntaAbiertaRespuesta in the database + List ePreguntaAbiertaRespuestaList = ePreguntaAbiertaRespuestaRepository.findAll(); + assertThat(ePreguntaAbiertaRespuestaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void putWithIdMismatchEPreguntaAbiertaRespuesta() throws Exception { + int databaseSizeBeforeUpdate = ePreguntaAbiertaRespuestaRepository.findAll().size(); + ePreguntaAbiertaRespuesta.setId(count.incrementAndGet()); + + // If url ID doesn't match entity ID, it will throw BadRequestAlertException + restEPreguntaAbiertaRespuestaMockMvc + .perform( + put(ENTITY_API_URL_ID, count.incrementAndGet()) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(ePreguntaAbiertaRespuesta)) + ) + .andExpect(status().isBadRequest()); + + // Validate the EPreguntaAbiertaRespuesta in the database + List ePreguntaAbiertaRespuestaList = ePreguntaAbiertaRespuestaRepository.findAll(); + assertThat(ePreguntaAbiertaRespuestaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void putWithMissingIdPathParamEPreguntaAbiertaRespuesta() throws Exception { + int databaseSizeBeforeUpdate = ePreguntaAbiertaRespuestaRepository.findAll().size(); + ePreguntaAbiertaRespuesta.setId(count.incrementAndGet()); + + // If url ID doesn't match entity ID, it will throw BadRequestAlertException + restEPreguntaAbiertaRespuestaMockMvc + .perform( + put(ENTITY_API_URL) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(ePreguntaAbiertaRespuesta)) + ) + .andExpect(status().isMethodNotAllowed()); + + // Validate the EPreguntaAbiertaRespuesta in the database + List ePreguntaAbiertaRespuestaList = ePreguntaAbiertaRespuestaRepository.findAll(); + assertThat(ePreguntaAbiertaRespuestaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void partialUpdateEPreguntaAbiertaRespuestaWithPatch() throws Exception { + // Initialize the database + ePreguntaAbiertaRespuestaRepository.saveAndFlush(ePreguntaAbiertaRespuesta); + + int databaseSizeBeforeUpdate = ePreguntaAbiertaRespuestaRepository.findAll().size(); + + // Update the ePreguntaAbiertaRespuesta using partial update + EPreguntaAbiertaRespuesta partialUpdatedEPreguntaAbiertaRespuesta = new EPreguntaAbiertaRespuesta(); + partialUpdatedEPreguntaAbiertaRespuesta.setId(ePreguntaAbiertaRespuesta.getId()); + + restEPreguntaAbiertaRespuestaMockMvc + .perform( + patch(ENTITY_API_URL_ID, partialUpdatedEPreguntaAbiertaRespuesta.getId()) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(partialUpdatedEPreguntaAbiertaRespuesta)) + ) + .andExpect(status().isOk()); + + // Validate the EPreguntaAbiertaRespuesta in the database + List ePreguntaAbiertaRespuestaList = ePreguntaAbiertaRespuestaRepository.findAll(); + assertThat(ePreguntaAbiertaRespuestaList).hasSize(databaseSizeBeforeUpdate); + EPreguntaAbiertaRespuesta testEPreguntaAbiertaRespuesta = ePreguntaAbiertaRespuestaList.get( + ePreguntaAbiertaRespuestaList.size() - 1 + ); + assertThat(testEPreguntaAbiertaRespuesta.getRespuesta()).isEqualTo(DEFAULT_RESPUESTA); + } + + @Test + @Transactional + void fullUpdateEPreguntaAbiertaRespuestaWithPatch() throws Exception { + // Initialize the database + ePreguntaAbiertaRespuestaRepository.saveAndFlush(ePreguntaAbiertaRespuesta); + + int databaseSizeBeforeUpdate = ePreguntaAbiertaRespuestaRepository.findAll().size(); + + // Update the ePreguntaAbiertaRespuesta using partial update + EPreguntaAbiertaRespuesta partialUpdatedEPreguntaAbiertaRespuesta = new EPreguntaAbiertaRespuesta(); + partialUpdatedEPreguntaAbiertaRespuesta.setId(ePreguntaAbiertaRespuesta.getId()); + + partialUpdatedEPreguntaAbiertaRespuesta.respuesta(UPDATED_RESPUESTA); + + restEPreguntaAbiertaRespuestaMockMvc + .perform( + patch(ENTITY_API_URL_ID, partialUpdatedEPreguntaAbiertaRespuesta.getId()) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(partialUpdatedEPreguntaAbiertaRespuesta)) + ) + .andExpect(status().isOk()); + + // Validate the EPreguntaAbiertaRespuesta in the database + List ePreguntaAbiertaRespuestaList = ePreguntaAbiertaRespuestaRepository.findAll(); + assertThat(ePreguntaAbiertaRespuestaList).hasSize(databaseSizeBeforeUpdate); + EPreguntaAbiertaRespuesta testEPreguntaAbiertaRespuesta = ePreguntaAbiertaRespuestaList.get( + ePreguntaAbiertaRespuestaList.size() - 1 + ); + assertThat(testEPreguntaAbiertaRespuesta.getRespuesta()).isEqualTo(UPDATED_RESPUESTA); + } + + @Test + @Transactional + void patchNonExistingEPreguntaAbiertaRespuesta() throws Exception { + int databaseSizeBeforeUpdate = ePreguntaAbiertaRespuestaRepository.findAll().size(); + ePreguntaAbiertaRespuesta.setId(count.incrementAndGet()); + + // If the entity doesn't have an ID, it will throw BadRequestAlertException + restEPreguntaAbiertaRespuestaMockMvc + .perform( + patch(ENTITY_API_URL_ID, ePreguntaAbiertaRespuesta.getId()) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(ePreguntaAbiertaRespuesta)) + ) + .andExpect(status().isBadRequest()); + + // Validate the EPreguntaAbiertaRespuesta in the database + List ePreguntaAbiertaRespuestaList = ePreguntaAbiertaRespuestaRepository.findAll(); + assertThat(ePreguntaAbiertaRespuestaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void patchWithIdMismatchEPreguntaAbiertaRespuesta() throws Exception { + int databaseSizeBeforeUpdate = ePreguntaAbiertaRespuestaRepository.findAll().size(); + ePreguntaAbiertaRespuesta.setId(count.incrementAndGet()); + + // If url ID doesn't match entity ID, it will throw BadRequestAlertException + restEPreguntaAbiertaRespuestaMockMvc + .perform( + patch(ENTITY_API_URL_ID, count.incrementAndGet()) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(ePreguntaAbiertaRespuesta)) + ) + .andExpect(status().isBadRequest()); + + // Validate the EPreguntaAbiertaRespuesta in the database + List ePreguntaAbiertaRespuestaList = ePreguntaAbiertaRespuestaRepository.findAll(); + assertThat(ePreguntaAbiertaRespuestaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void patchWithMissingIdPathParamEPreguntaAbiertaRespuesta() throws Exception { + int databaseSizeBeforeUpdate = ePreguntaAbiertaRespuestaRepository.findAll().size(); + ePreguntaAbiertaRespuesta.setId(count.incrementAndGet()); + + // If url ID doesn't match entity ID, it will throw BadRequestAlertException + restEPreguntaAbiertaRespuestaMockMvc + .perform( + patch(ENTITY_API_URL) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(ePreguntaAbiertaRespuesta)) + ) + .andExpect(status().isMethodNotAllowed()); + + // Validate the EPreguntaAbiertaRespuesta in the database + List ePreguntaAbiertaRespuestaList = ePreguntaAbiertaRespuestaRepository.findAll(); + assertThat(ePreguntaAbiertaRespuestaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void deleteEPreguntaAbiertaRespuesta() throws Exception { + // Initialize the database + ePreguntaAbiertaRespuestaRepository.saveAndFlush(ePreguntaAbiertaRespuesta); + + int databaseSizeBeforeDelete = ePreguntaAbiertaRespuestaRepository.findAll().size(); + + // Delete the ePreguntaAbiertaRespuesta + restEPreguntaAbiertaRespuestaMockMvc + .perform(delete(ENTITY_API_URL_ID, ePreguntaAbiertaRespuesta.getId()).accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isNoContent()); + + // Validate the database contains one less item + List ePreguntaAbiertaRespuestaList = ePreguntaAbiertaRespuestaRepository.findAll(); + assertThat(ePreguntaAbiertaRespuestaList).hasSize(databaseSizeBeforeDelete - 1); + } +} diff --git a/src/test/java/org/datasurvey/web/rest/EPreguntaCerradaOpcionResourceIT.java b/src/test/java/org/datasurvey/web/rest/EPreguntaCerradaOpcionResourceIT.java new file mode 100644 index 0000000..241190b --- /dev/null +++ b/src/test/java/org/datasurvey/web/rest/EPreguntaCerradaOpcionResourceIT.java @@ -0,0 +1,836 @@ +package org.datasurvey.web.rest; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.hamcrest.Matchers.hasItem; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +import java.util.List; +import java.util.Random; +import java.util.concurrent.atomic.AtomicLong; +import javax.persistence.EntityManager; +import org.datasurvey.IntegrationTest; +import org.datasurvey.domain.EPreguntaCerrada; +import org.datasurvey.domain.EPreguntaCerradaOpcion; +import org.datasurvey.repository.EPreguntaCerradaOpcionRepository; +import org.datasurvey.service.criteria.EPreguntaCerradaOpcionCriteria; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.http.MediaType; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.transaction.annotation.Transactional; + +/** + * Integration tests for the {@link EPreguntaCerradaOpcionResource} REST controller. + */ +@IntegrationTest +@AutoConfigureMockMvc +@WithMockUser +class EPreguntaCerradaOpcionResourceIT { + + private static final String DEFAULT_NOMBRE = "AAAAAAAAAA"; + private static final String UPDATED_NOMBRE = "BBBBBBBBBB"; + + private static final Integer DEFAULT_ORDEN = 1; + private static final Integer UPDATED_ORDEN = 2; + private static final Integer SMALLER_ORDEN = 1 - 1; + + private static final Integer DEFAULT_CANTIDAD = 1; + private static final Integer UPDATED_CANTIDAD = 2; + private static final Integer SMALLER_CANTIDAD = 1 - 1; + + private static final String ENTITY_API_URL = "/api/e-pregunta-cerrada-opcions"; + private static final String ENTITY_API_URL_ID = ENTITY_API_URL + "/{id}"; + + private static Random random = new Random(); + private static AtomicLong count = new AtomicLong(random.nextInt() + (2 * Integer.MAX_VALUE)); + + @Autowired + private EPreguntaCerradaOpcionRepository ePreguntaCerradaOpcionRepository; + + @Autowired + private EntityManager em; + + @Autowired + private MockMvc restEPreguntaCerradaOpcionMockMvc; + + private EPreguntaCerradaOpcion ePreguntaCerradaOpcion; + + /** + * Create an entity for this test. + * + * This is a static method, as tests for other entities might also need it, + * if they test an entity which requires the current entity. + */ + public static EPreguntaCerradaOpcion createEntity(EntityManager em) { + EPreguntaCerradaOpcion ePreguntaCerradaOpcion = new EPreguntaCerradaOpcion() + .nombre(DEFAULT_NOMBRE) + .orden(DEFAULT_ORDEN) + .cantidad(DEFAULT_CANTIDAD); + return ePreguntaCerradaOpcion; + } + + /** + * Create an updated entity for this test. + * + * This is a static method, as tests for other entities might also need it, + * if they test an entity which requires the current entity. + */ + public static EPreguntaCerradaOpcion createUpdatedEntity(EntityManager em) { + EPreguntaCerradaOpcion ePreguntaCerradaOpcion = new EPreguntaCerradaOpcion() + .nombre(UPDATED_NOMBRE) + .orden(UPDATED_ORDEN) + .cantidad(UPDATED_CANTIDAD); + return ePreguntaCerradaOpcion; + } + + @BeforeEach + public void initTest() { + ePreguntaCerradaOpcion = createEntity(em); + } + + @Test + @Transactional + void createEPreguntaCerradaOpcion() throws Exception { + int databaseSizeBeforeCreate = ePreguntaCerradaOpcionRepository.findAll().size(); + // Create the EPreguntaCerradaOpcion + restEPreguntaCerradaOpcionMockMvc + .perform( + post(ENTITY_API_URL) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(ePreguntaCerradaOpcion)) + ) + .andExpect(status().isCreated()); + + // Validate the EPreguntaCerradaOpcion in the database + List ePreguntaCerradaOpcionList = ePreguntaCerradaOpcionRepository.findAll(); + assertThat(ePreguntaCerradaOpcionList).hasSize(databaseSizeBeforeCreate + 1); + EPreguntaCerradaOpcion testEPreguntaCerradaOpcion = ePreguntaCerradaOpcionList.get(ePreguntaCerradaOpcionList.size() - 1); + assertThat(testEPreguntaCerradaOpcion.getNombre()).isEqualTo(DEFAULT_NOMBRE); + assertThat(testEPreguntaCerradaOpcion.getOrden()).isEqualTo(DEFAULT_ORDEN); + assertThat(testEPreguntaCerradaOpcion.getCantidad()).isEqualTo(DEFAULT_CANTIDAD); + } + + @Test + @Transactional + void createEPreguntaCerradaOpcionWithExistingId() throws Exception { + // Create the EPreguntaCerradaOpcion with an existing ID + ePreguntaCerradaOpcion.setId(1L); + + int databaseSizeBeforeCreate = ePreguntaCerradaOpcionRepository.findAll().size(); + + // An entity with an existing ID cannot be created, so this API call must fail + restEPreguntaCerradaOpcionMockMvc + .perform( + post(ENTITY_API_URL) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(ePreguntaCerradaOpcion)) + ) + .andExpect(status().isBadRequest()); + + // Validate the EPreguntaCerradaOpcion in the database + List ePreguntaCerradaOpcionList = ePreguntaCerradaOpcionRepository.findAll(); + assertThat(ePreguntaCerradaOpcionList).hasSize(databaseSizeBeforeCreate); + } + + @Test + @Transactional + void checkNombreIsRequired() throws Exception { + int databaseSizeBeforeTest = ePreguntaCerradaOpcionRepository.findAll().size(); + // set the field null + ePreguntaCerradaOpcion.setNombre(null); + + // Create the EPreguntaCerradaOpcion, which fails. + + restEPreguntaCerradaOpcionMockMvc + .perform( + post(ENTITY_API_URL) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(ePreguntaCerradaOpcion)) + ) + .andExpect(status().isBadRequest()); + + List ePreguntaCerradaOpcionList = ePreguntaCerradaOpcionRepository.findAll(); + assertThat(ePreguntaCerradaOpcionList).hasSize(databaseSizeBeforeTest); + } + + @Test + @Transactional + void checkOrdenIsRequired() throws Exception { + int databaseSizeBeforeTest = ePreguntaCerradaOpcionRepository.findAll().size(); + // set the field null + ePreguntaCerradaOpcion.setOrden(null); + + // Create the EPreguntaCerradaOpcion, which fails. + + restEPreguntaCerradaOpcionMockMvc + .perform( + post(ENTITY_API_URL) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(ePreguntaCerradaOpcion)) + ) + .andExpect(status().isBadRequest()); + + List ePreguntaCerradaOpcionList = ePreguntaCerradaOpcionRepository.findAll(); + assertThat(ePreguntaCerradaOpcionList).hasSize(databaseSizeBeforeTest); + } + + @Test + @Transactional + void checkCantidadIsRequired() throws Exception { + int databaseSizeBeforeTest = ePreguntaCerradaOpcionRepository.findAll().size(); + // set the field null + ePreguntaCerradaOpcion.setCantidad(null); + + // Create the EPreguntaCerradaOpcion, which fails. + + restEPreguntaCerradaOpcionMockMvc + .perform( + post(ENTITY_API_URL) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(ePreguntaCerradaOpcion)) + ) + .andExpect(status().isBadRequest()); + + List ePreguntaCerradaOpcionList = ePreguntaCerradaOpcionRepository.findAll(); + assertThat(ePreguntaCerradaOpcionList).hasSize(databaseSizeBeforeTest); + } + + @Test + @Transactional + void getAllEPreguntaCerradaOpcions() throws Exception { + // Initialize the database + ePreguntaCerradaOpcionRepository.saveAndFlush(ePreguntaCerradaOpcion); + + // Get all the ePreguntaCerradaOpcionList + restEPreguntaCerradaOpcionMockMvc + .perform(get(ENTITY_API_URL + "?sort=id,desc")) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.[*].id").value(hasItem(ePreguntaCerradaOpcion.getId().intValue()))) + .andExpect(jsonPath("$.[*].nombre").value(hasItem(DEFAULT_NOMBRE))) + .andExpect(jsonPath("$.[*].orden").value(hasItem(DEFAULT_ORDEN))) + .andExpect(jsonPath("$.[*].cantidad").value(hasItem(DEFAULT_CANTIDAD))); + } + + @Test + @Transactional + void getEPreguntaCerradaOpcion() throws Exception { + // Initialize the database + ePreguntaCerradaOpcionRepository.saveAndFlush(ePreguntaCerradaOpcion); + + // Get the ePreguntaCerradaOpcion + restEPreguntaCerradaOpcionMockMvc + .perform(get(ENTITY_API_URL_ID, ePreguntaCerradaOpcion.getId())) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.id").value(ePreguntaCerradaOpcion.getId().intValue())) + .andExpect(jsonPath("$.nombre").value(DEFAULT_NOMBRE)) + .andExpect(jsonPath("$.orden").value(DEFAULT_ORDEN)) + .andExpect(jsonPath("$.cantidad").value(DEFAULT_CANTIDAD)); + } + + @Test + @Transactional + void getEPreguntaCerradaOpcionsByIdFiltering() throws Exception { + // Initialize the database + ePreguntaCerradaOpcionRepository.saveAndFlush(ePreguntaCerradaOpcion); + + Long id = ePreguntaCerradaOpcion.getId(); + + defaultEPreguntaCerradaOpcionShouldBeFound("id.equals=" + id); + defaultEPreguntaCerradaOpcionShouldNotBeFound("id.notEquals=" + id); + + defaultEPreguntaCerradaOpcionShouldBeFound("id.greaterThanOrEqual=" + id); + defaultEPreguntaCerradaOpcionShouldNotBeFound("id.greaterThan=" + id); + + defaultEPreguntaCerradaOpcionShouldBeFound("id.lessThanOrEqual=" + id); + defaultEPreguntaCerradaOpcionShouldNotBeFound("id.lessThan=" + id); + } + + @Test + @Transactional + void getAllEPreguntaCerradaOpcionsByNombreIsEqualToSomething() throws Exception { + // Initialize the database + ePreguntaCerradaOpcionRepository.saveAndFlush(ePreguntaCerradaOpcion); + + // Get all the ePreguntaCerradaOpcionList where nombre equals to DEFAULT_NOMBRE + defaultEPreguntaCerradaOpcionShouldBeFound("nombre.equals=" + DEFAULT_NOMBRE); + + // Get all the ePreguntaCerradaOpcionList where nombre equals to UPDATED_NOMBRE + defaultEPreguntaCerradaOpcionShouldNotBeFound("nombre.equals=" + UPDATED_NOMBRE); + } + + @Test + @Transactional + void getAllEPreguntaCerradaOpcionsByNombreIsNotEqualToSomething() throws Exception { + // Initialize the database + ePreguntaCerradaOpcionRepository.saveAndFlush(ePreguntaCerradaOpcion); + + // Get all the ePreguntaCerradaOpcionList where nombre not equals to DEFAULT_NOMBRE + defaultEPreguntaCerradaOpcionShouldNotBeFound("nombre.notEquals=" + DEFAULT_NOMBRE); + + // Get all the ePreguntaCerradaOpcionList where nombre not equals to UPDATED_NOMBRE + defaultEPreguntaCerradaOpcionShouldBeFound("nombre.notEquals=" + UPDATED_NOMBRE); + } + + @Test + @Transactional + void getAllEPreguntaCerradaOpcionsByNombreIsInShouldWork() throws Exception { + // Initialize the database + ePreguntaCerradaOpcionRepository.saveAndFlush(ePreguntaCerradaOpcion); + + // Get all the ePreguntaCerradaOpcionList where nombre in DEFAULT_NOMBRE or UPDATED_NOMBRE + defaultEPreguntaCerradaOpcionShouldBeFound("nombre.in=" + DEFAULT_NOMBRE + "," + UPDATED_NOMBRE); + + // Get all the ePreguntaCerradaOpcionList where nombre equals to UPDATED_NOMBRE + defaultEPreguntaCerradaOpcionShouldNotBeFound("nombre.in=" + UPDATED_NOMBRE); + } + + @Test + @Transactional + void getAllEPreguntaCerradaOpcionsByNombreIsNullOrNotNull() throws Exception { + // Initialize the database + ePreguntaCerradaOpcionRepository.saveAndFlush(ePreguntaCerradaOpcion); + + // Get all the ePreguntaCerradaOpcionList where nombre is not null + defaultEPreguntaCerradaOpcionShouldBeFound("nombre.specified=true"); + + // Get all the ePreguntaCerradaOpcionList where nombre is null + defaultEPreguntaCerradaOpcionShouldNotBeFound("nombre.specified=false"); + } + + @Test + @Transactional + void getAllEPreguntaCerradaOpcionsByNombreContainsSomething() throws Exception { + // Initialize the database + ePreguntaCerradaOpcionRepository.saveAndFlush(ePreguntaCerradaOpcion); + + // Get all the ePreguntaCerradaOpcionList where nombre contains DEFAULT_NOMBRE + defaultEPreguntaCerradaOpcionShouldBeFound("nombre.contains=" + DEFAULT_NOMBRE); + + // Get all the ePreguntaCerradaOpcionList where nombre contains UPDATED_NOMBRE + defaultEPreguntaCerradaOpcionShouldNotBeFound("nombre.contains=" + UPDATED_NOMBRE); + } + + @Test + @Transactional + void getAllEPreguntaCerradaOpcionsByNombreNotContainsSomething() throws Exception { + // Initialize the database + ePreguntaCerradaOpcionRepository.saveAndFlush(ePreguntaCerradaOpcion); + + // Get all the ePreguntaCerradaOpcionList where nombre does not contain DEFAULT_NOMBRE + defaultEPreguntaCerradaOpcionShouldNotBeFound("nombre.doesNotContain=" + DEFAULT_NOMBRE); + + // Get all the ePreguntaCerradaOpcionList where nombre does not contain UPDATED_NOMBRE + defaultEPreguntaCerradaOpcionShouldBeFound("nombre.doesNotContain=" + UPDATED_NOMBRE); + } + + @Test + @Transactional + void getAllEPreguntaCerradaOpcionsByOrdenIsEqualToSomething() throws Exception { + // Initialize the database + ePreguntaCerradaOpcionRepository.saveAndFlush(ePreguntaCerradaOpcion); + + // Get all the ePreguntaCerradaOpcionList where orden equals to DEFAULT_ORDEN + defaultEPreguntaCerradaOpcionShouldBeFound("orden.equals=" + DEFAULT_ORDEN); + + // Get all the ePreguntaCerradaOpcionList where orden equals to UPDATED_ORDEN + defaultEPreguntaCerradaOpcionShouldNotBeFound("orden.equals=" + UPDATED_ORDEN); + } + + @Test + @Transactional + void getAllEPreguntaCerradaOpcionsByOrdenIsNotEqualToSomething() throws Exception { + // Initialize the database + ePreguntaCerradaOpcionRepository.saveAndFlush(ePreguntaCerradaOpcion); + + // Get all the ePreguntaCerradaOpcionList where orden not equals to DEFAULT_ORDEN + defaultEPreguntaCerradaOpcionShouldNotBeFound("orden.notEquals=" + DEFAULT_ORDEN); + + // Get all the ePreguntaCerradaOpcionList where orden not equals to UPDATED_ORDEN + defaultEPreguntaCerradaOpcionShouldBeFound("orden.notEquals=" + UPDATED_ORDEN); + } + + @Test + @Transactional + void getAllEPreguntaCerradaOpcionsByOrdenIsInShouldWork() throws Exception { + // Initialize the database + ePreguntaCerradaOpcionRepository.saveAndFlush(ePreguntaCerradaOpcion); + + // Get all the ePreguntaCerradaOpcionList where orden in DEFAULT_ORDEN or UPDATED_ORDEN + defaultEPreguntaCerradaOpcionShouldBeFound("orden.in=" + DEFAULT_ORDEN + "," + UPDATED_ORDEN); + + // Get all the ePreguntaCerradaOpcionList where orden equals to UPDATED_ORDEN + defaultEPreguntaCerradaOpcionShouldNotBeFound("orden.in=" + UPDATED_ORDEN); + } + + @Test + @Transactional + void getAllEPreguntaCerradaOpcionsByOrdenIsNullOrNotNull() throws Exception { + // Initialize the database + ePreguntaCerradaOpcionRepository.saveAndFlush(ePreguntaCerradaOpcion); + + // Get all the ePreguntaCerradaOpcionList where orden is not null + defaultEPreguntaCerradaOpcionShouldBeFound("orden.specified=true"); + + // Get all the ePreguntaCerradaOpcionList where orden is null + defaultEPreguntaCerradaOpcionShouldNotBeFound("orden.specified=false"); + } + + @Test + @Transactional + void getAllEPreguntaCerradaOpcionsByOrdenIsGreaterThanOrEqualToSomething() throws Exception { + // Initialize the database + ePreguntaCerradaOpcionRepository.saveAndFlush(ePreguntaCerradaOpcion); + + // Get all the ePreguntaCerradaOpcionList where orden is greater than or equal to DEFAULT_ORDEN + defaultEPreguntaCerradaOpcionShouldBeFound("orden.greaterThanOrEqual=" + DEFAULT_ORDEN); + + // Get all the ePreguntaCerradaOpcionList where orden is greater than or equal to UPDATED_ORDEN + defaultEPreguntaCerradaOpcionShouldNotBeFound("orden.greaterThanOrEqual=" + UPDATED_ORDEN); + } + + @Test + @Transactional + void getAllEPreguntaCerradaOpcionsByOrdenIsLessThanOrEqualToSomething() throws Exception { + // Initialize the database + ePreguntaCerradaOpcionRepository.saveAndFlush(ePreguntaCerradaOpcion); + + // Get all the ePreguntaCerradaOpcionList where orden is less than or equal to DEFAULT_ORDEN + defaultEPreguntaCerradaOpcionShouldBeFound("orden.lessThanOrEqual=" + DEFAULT_ORDEN); + + // Get all the ePreguntaCerradaOpcionList where orden is less than or equal to SMALLER_ORDEN + defaultEPreguntaCerradaOpcionShouldNotBeFound("orden.lessThanOrEqual=" + SMALLER_ORDEN); + } + + @Test + @Transactional + void getAllEPreguntaCerradaOpcionsByOrdenIsLessThanSomething() throws Exception { + // Initialize the database + ePreguntaCerradaOpcionRepository.saveAndFlush(ePreguntaCerradaOpcion); + + // Get all the ePreguntaCerradaOpcionList where orden is less than DEFAULT_ORDEN + defaultEPreguntaCerradaOpcionShouldNotBeFound("orden.lessThan=" + DEFAULT_ORDEN); + + // Get all the ePreguntaCerradaOpcionList where orden is less than UPDATED_ORDEN + defaultEPreguntaCerradaOpcionShouldBeFound("orden.lessThan=" + UPDATED_ORDEN); + } + + @Test + @Transactional + void getAllEPreguntaCerradaOpcionsByOrdenIsGreaterThanSomething() throws Exception { + // Initialize the database + ePreguntaCerradaOpcionRepository.saveAndFlush(ePreguntaCerradaOpcion); + + // Get all the ePreguntaCerradaOpcionList where orden is greater than DEFAULT_ORDEN + defaultEPreguntaCerradaOpcionShouldNotBeFound("orden.greaterThan=" + DEFAULT_ORDEN); + + // Get all the ePreguntaCerradaOpcionList where orden is greater than SMALLER_ORDEN + defaultEPreguntaCerradaOpcionShouldBeFound("orden.greaterThan=" + SMALLER_ORDEN); + } + + @Test + @Transactional + void getAllEPreguntaCerradaOpcionsByCantidadIsEqualToSomething() throws Exception { + // Initialize the database + ePreguntaCerradaOpcionRepository.saveAndFlush(ePreguntaCerradaOpcion); + + // Get all the ePreguntaCerradaOpcionList where cantidad equals to DEFAULT_CANTIDAD + defaultEPreguntaCerradaOpcionShouldBeFound("cantidad.equals=" + DEFAULT_CANTIDAD); + + // Get all the ePreguntaCerradaOpcionList where cantidad equals to UPDATED_CANTIDAD + defaultEPreguntaCerradaOpcionShouldNotBeFound("cantidad.equals=" + UPDATED_CANTIDAD); + } + + @Test + @Transactional + void getAllEPreguntaCerradaOpcionsByCantidadIsNotEqualToSomething() throws Exception { + // Initialize the database + ePreguntaCerradaOpcionRepository.saveAndFlush(ePreguntaCerradaOpcion); + + // Get all the ePreguntaCerradaOpcionList where cantidad not equals to DEFAULT_CANTIDAD + defaultEPreguntaCerradaOpcionShouldNotBeFound("cantidad.notEquals=" + DEFAULT_CANTIDAD); + + // Get all the ePreguntaCerradaOpcionList where cantidad not equals to UPDATED_CANTIDAD + defaultEPreguntaCerradaOpcionShouldBeFound("cantidad.notEquals=" + UPDATED_CANTIDAD); + } + + @Test + @Transactional + void getAllEPreguntaCerradaOpcionsByCantidadIsInShouldWork() throws Exception { + // Initialize the database + ePreguntaCerradaOpcionRepository.saveAndFlush(ePreguntaCerradaOpcion); + + // Get all the ePreguntaCerradaOpcionList where cantidad in DEFAULT_CANTIDAD or UPDATED_CANTIDAD + defaultEPreguntaCerradaOpcionShouldBeFound("cantidad.in=" + DEFAULT_CANTIDAD + "," + UPDATED_CANTIDAD); + + // Get all the ePreguntaCerradaOpcionList where cantidad equals to UPDATED_CANTIDAD + defaultEPreguntaCerradaOpcionShouldNotBeFound("cantidad.in=" + UPDATED_CANTIDAD); + } + + @Test + @Transactional + void getAllEPreguntaCerradaOpcionsByCantidadIsNullOrNotNull() throws Exception { + // Initialize the database + ePreguntaCerradaOpcionRepository.saveAndFlush(ePreguntaCerradaOpcion); + + // Get all the ePreguntaCerradaOpcionList where cantidad is not null + defaultEPreguntaCerradaOpcionShouldBeFound("cantidad.specified=true"); + + // Get all the ePreguntaCerradaOpcionList where cantidad is null + defaultEPreguntaCerradaOpcionShouldNotBeFound("cantidad.specified=false"); + } + + @Test + @Transactional + void getAllEPreguntaCerradaOpcionsByCantidadIsGreaterThanOrEqualToSomething() throws Exception { + // Initialize the database + ePreguntaCerradaOpcionRepository.saveAndFlush(ePreguntaCerradaOpcion); + + // Get all the ePreguntaCerradaOpcionList where cantidad is greater than or equal to DEFAULT_CANTIDAD + defaultEPreguntaCerradaOpcionShouldBeFound("cantidad.greaterThanOrEqual=" + DEFAULT_CANTIDAD); + + // Get all the ePreguntaCerradaOpcionList where cantidad is greater than or equal to UPDATED_CANTIDAD + defaultEPreguntaCerradaOpcionShouldNotBeFound("cantidad.greaterThanOrEqual=" + UPDATED_CANTIDAD); + } + + @Test + @Transactional + void getAllEPreguntaCerradaOpcionsByCantidadIsLessThanOrEqualToSomething() throws Exception { + // Initialize the database + ePreguntaCerradaOpcionRepository.saveAndFlush(ePreguntaCerradaOpcion); + + // Get all the ePreguntaCerradaOpcionList where cantidad is less than or equal to DEFAULT_CANTIDAD + defaultEPreguntaCerradaOpcionShouldBeFound("cantidad.lessThanOrEqual=" + DEFAULT_CANTIDAD); + + // Get all the ePreguntaCerradaOpcionList where cantidad is less than or equal to SMALLER_CANTIDAD + defaultEPreguntaCerradaOpcionShouldNotBeFound("cantidad.lessThanOrEqual=" + SMALLER_CANTIDAD); + } + + @Test + @Transactional + void getAllEPreguntaCerradaOpcionsByCantidadIsLessThanSomething() throws Exception { + // Initialize the database + ePreguntaCerradaOpcionRepository.saveAndFlush(ePreguntaCerradaOpcion); + + // Get all the ePreguntaCerradaOpcionList where cantidad is less than DEFAULT_CANTIDAD + defaultEPreguntaCerradaOpcionShouldNotBeFound("cantidad.lessThan=" + DEFAULT_CANTIDAD); + + // Get all the ePreguntaCerradaOpcionList where cantidad is less than UPDATED_CANTIDAD + defaultEPreguntaCerradaOpcionShouldBeFound("cantidad.lessThan=" + UPDATED_CANTIDAD); + } + + @Test + @Transactional + void getAllEPreguntaCerradaOpcionsByCantidadIsGreaterThanSomething() throws Exception { + // Initialize the database + ePreguntaCerradaOpcionRepository.saveAndFlush(ePreguntaCerradaOpcion); + + // Get all the ePreguntaCerradaOpcionList where cantidad is greater than DEFAULT_CANTIDAD + defaultEPreguntaCerradaOpcionShouldNotBeFound("cantidad.greaterThan=" + DEFAULT_CANTIDAD); + + // Get all the ePreguntaCerradaOpcionList where cantidad is greater than SMALLER_CANTIDAD + defaultEPreguntaCerradaOpcionShouldBeFound("cantidad.greaterThan=" + SMALLER_CANTIDAD); + } + + @Test + @Transactional + void getAllEPreguntaCerradaOpcionsByEPreguntaCerradaIsEqualToSomething() throws Exception { + // Initialize the database + ePreguntaCerradaOpcionRepository.saveAndFlush(ePreguntaCerradaOpcion); + EPreguntaCerrada ePreguntaCerrada = EPreguntaCerradaResourceIT.createEntity(em); + em.persist(ePreguntaCerrada); + em.flush(); + ePreguntaCerradaOpcion.setEPreguntaCerrada(ePreguntaCerrada); + ePreguntaCerradaOpcionRepository.saveAndFlush(ePreguntaCerradaOpcion); + Long ePreguntaCerradaId = ePreguntaCerrada.getId(); + + // Get all the ePreguntaCerradaOpcionList where ePreguntaCerrada equals to ePreguntaCerradaId + defaultEPreguntaCerradaOpcionShouldBeFound("ePreguntaCerradaId.equals=" + ePreguntaCerradaId); + + // Get all the ePreguntaCerradaOpcionList where ePreguntaCerrada equals to (ePreguntaCerradaId + 1) + defaultEPreguntaCerradaOpcionShouldNotBeFound("ePreguntaCerradaId.equals=" + (ePreguntaCerradaId + 1)); + } + + /** + * Executes the search, and checks that the default entity is returned. + */ + private void defaultEPreguntaCerradaOpcionShouldBeFound(String filter) throws Exception { + restEPreguntaCerradaOpcionMockMvc + .perform(get(ENTITY_API_URL + "?sort=id,desc&" + filter)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.[*].id").value(hasItem(ePreguntaCerradaOpcion.getId().intValue()))) + .andExpect(jsonPath("$.[*].nombre").value(hasItem(DEFAULT_NOMBRE))) + .andExpect(jsonPath("$.[*].orden").value(hasItem(DEFAULT_ORDEN))) + .andExpect(jsonPath("$.[*].cantidad").value(hasItem(DEFAULT_CANTIDAD))); + + // Check, that the count call also returns 1 + restEPreguntaCerradaOpcionMockMvc + .perform(get(ENTITY_API_URL + "/count?sort=id,desc&" + filter)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(content().string("1")); + } + + /** + * Executes the search, and checks that the default entity is not returned. + */ + private void defaultEPreguntaCerradaOpcionShouldNotBeFound(String filter) throws Exception { + restEPreguntaCerradaOpcionMockMvc + .perform(get(ENTITY_API_URL + "?sort=id,desc&" + filter)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$").isArray()) + .andExpect(jsonPath("$").isEmpty()); + + // Check, that the count call also returns 0 + restEPreguntaCerradaOpcionMockMvc + .perform(get(ENTITY_API_URL + "/count?sort=id,desc&" + filter)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(content().string("0")); + } + + @Test + @Transactional + void getNonExistingEPreguntaCerradaOpcion() throws Exception { + // Get the ePreguntaCerradaOpcion + restEPreguntaCerradaOpcionMockMvc.perform(get(ENTITY_API_URL_ID, Long.MAX_VALUE)).andExpect(status().isNotFound()); + } + + @Test + @Transactional + void putNewEPreguntaCerradaOpcion() throws Exception { + // Initialize the database + ePreguntaCerradaOpcionRepository.saveAndFlush(ePreguntaCerradaOpcion); + + int databaseSizeBeforeUpdate = ePreguntaCerradaOpcionRepository.findAll().size(); + + // Update the ePreguntaCerradaOpcion + EPreguntaCerradaOpcion updatedEPreguntaCerradaOpcion = ePreguntaCerradaOpcionRepository + .findById(ePreguntaCerradaOpcion.getId()) + .get(); + // Disconnect from session so that the updates on updatedEPreguntaCerradaOpcion are not directly saved in db + em.detach(updatedEPreguntaCerradaOpcion); + updatedEPreguntaCerradaOpcion.nombre(UPDATED_NOMBRE).orden(UPDATED_ORDEN).cantidad(UPDATED_CANTIDAD); + + restEPreguntaCerradaOpcionMockMvc + .perform( + put(ENTITY_API_URL_ID, updatedEPreguntaCerradaOpcion.getId()) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(updatedEPreguntaCerradaOpcion)) + ) + .andExpect(status().isOk()); + + // Validate the EPreguntaCerradaOpcion in the database + List ePreguntaCerradaOpcionList = ePreguntaCerradaOpcionRepository.findAll(); + assertThat(ePreguntaCerradaOpcionList).hasSize(databaseSizeBeforeUpdate); + EPreguntaCerradaOpcion testEPreguntaCerradaOpcion = ePreguntaCerradaOpcionList.get(ePreguntaCerradaOpcionList.size() - 1); + assertThat(testEPreguntaCerradaOpcion.getNombre()).isEqualTo(UPDATED_NOMBRE); + assertThat(testEPreguntaCerradaOpcion.getOrden()).isEqualTo(UPDATED_ORDEN); + assertThat(testEPreguntaCerradaOpcion.getCantidad()).isEqualTo(UPDATED_CANTIDAD); + } + + @Test + @Transactional + void putNonExistingEPreguntaCerradaOpcion() throws Exception { + int databaseSizeBeforeUpdate = ePreguntaCerradaOpcionRepository.findAll().size(); + ePreguntaCerradaOpcion.setId(count.incrementAndGet()); + + // If the entity doesn't have an ID, it will throw BadRequestAlertException + restEPreguntaCerradaOpcionMockMvc + .perform( + put(ENTITY_API_URL_ID, ePreguntaCerradaOpcion.getId()) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(ePreguntaCerradaOpcion)) + ) + .andExpect(status().isBadRequest()); + + // Validate the EPreguntaCerradaOpcion in the database + List ePreguntaCerradaOpcionList = ePreguntaCerradaOpcionRepository.findAll(); + assertThat(ePreguntaCerradaOpcionList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void putWithIdMismatchEPreguntaCerradaOpcion() throws Exception { + int databaseSizeBeforeUpdate = ePreguntaCerradaOpcionRepository.findAll().size(); + ePreguntaCerradaOpcion.setId(count.incrementAndGet()); + + // If url ID doesn't match entity ID, it will throw BadRequestAlertException + restEPreguntaCerradaOpcionMockMvc + .perform( + put(ENTITY_API_URL_ID, count.incrementAndGet()) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(ePreguntaCerradaOpcion)) + ) + .andExpect(status().isBadRequest()); + + // Validate the EPreguntaCerradaOpcion in the database + List ePreguntaCerradaOpcionList = ePreguntaCerradaOpcionRepository.findAll(); + assertThat(ePreguntaCerradaOpcionList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void putWithMissingIdPathParamEPreguntaCerradaOpcion() throws Exception { + int databaseSizeBeforeUpdate = ePreguntaCerradaOpcionRepository.findAll().size(); + ePreguntaCerradaOpcion.setId(count.incrementAndGet()); + + // If url ID doesn't match entity ID, it will throw BadRequestAlertException + restEPreguntaCerradaOpcionMockMvc + .perform( + put(ENTITY_API_URL) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(ePreguntaCerradaOpcion)) + ) + .andExpect(status().isMethodNotAllowed()); + + // Validate the EPreguntaCerradaOpcion in the database + List ePreguntaCerradaOpcionList = ePreguntaCerradaOpcionRepository.findAll(); + assertThat(ePreguntaCerradaOpcionList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void partialUpdateEPreguntaCerradaOpcionWithPatch() throws Exception { + // Initialize the database + ePreguntaCerradaOpcionRepository.saveAndFlush(ePreguntaCerradaOpcion); + + int databaseSizeBeforeUpdate = ePreguntaCerradaOpcionRepository.findAll().size(); + + // Update the ePreguntaCerradaOpcion using partial update + EPreguntaCerradaOpcion partialUpdatedEPreguntaCerradaOpcion = new EPreguntaCerradaOpcion(); + partialUpdatedEPreguntaCerradaOpcion.setId(ePreguntaCerradaOpcion.getId()); + + restEPreguntaCerradaOpcionMockMvc + .perform( + patch(ENTITY_API_URL_ID, partialUpdatedEPreguntaCerradaOpcion.getId()) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(partialUpdatedEPreguntaCerradaOpcion)) + ) + .andExpect(status().isOk()); + + // Validate the EPreguntaCerradaOpcion in the database + List ePreguntaCerradaOpcionList = ePreguntaCerradaOpcionRepository.findAll(); + assertThat(ePreguntaCerradaOpcionList).hasSize(databaseSizeBeforeUpdate); + EPreguntaCerradaOpcion testEPreguntaCerradaOpcion = ePreguntaCerradaOpcionList.get(ePreguntaCerradaOpcionList.size() - 1); + assertThat(testEPreguntaCerradaOpcion.getNombre()).isEqualTo(DEFAULT_NOMBRE); + assertThat(testEPreguntaCerradaOpcion.getOrden()).isEqualTo(DEFAULT_ORDEN); + assertThat(testEPreguntaCerradaOpcion.getCantidad()).isEqualTo(DEFAULT_CANTIDAD); + } + + @Test + @Transactional + void fullUpdateEPreguntaCerradaOpcionWithPatch() throws Exception { + // Initialize the database + ePreguntaCerradaOpcionRepository.saveAndFlush(ePreguntaCerradaOpcion); + + int databaseSizeBeforeUpdate = ePreguntaCerradaOpcionRepository.findAll().size(); + + // Update the ePreguntaCerradaOpcion using partial update + EPreguntaCerradaOpcion partialUpdatedEPreguntaCerradaOpcion = new EPreguntaCerradaOpcion(); + partialUpdatedEPreguntaCerradaOpcion.setId(ePreguntaCerradaOpcion.getId()); + + partialUpdatedEPreguntaCerradaOpcion.nombre(UPDATED_NOMBRE).orden(UPDATED_ORDEN).cantidad(UPDATED_CANTIDAD); + + restEPreguntaCerradaOpcionMockMvc + .perform( + patch(ENTITY_API_URL_ID, partialUpdatedEPreguntaCerradaOpcion.getId()) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(partialUpdatedEPreguntaCerradaOpcion)) + ) + .andExpect(status().isOk()); + + // Validate the EPreguntaCerradaOpcion in the database + List ePreguntaCerradaOpcionList = ePreguntaCerradaOpcionRepository.findAll(); + assertThat(ePreguntaCerradaOpcionList).hasSize(databaseSizeBeforeUpdate); + EPreguntaCerradaOpcion testEPreguntaCerradaOpcion = ePreguntaCerradaOpcionList.get(ePreguntaCerradaOpcionList.size() - 1); + assertThat(testEPreguntaCerradaOpcion.getNombre()).isEqualTo(UPDATED_NOMBRE); + assertThat(testEPreguntaCerradaOpcion.getOrden()).isEqualTo(UPDATED_ORDEN); + assertThat(testEPreguntaCerradaOpcion.getCantidad()).isEqualTo(UPDATED_CANTIDAD); + } + + @Test + @Transactional + void patchNonExistingEPreguntaCerradaOpcion() throws Exception { + int databaseSizeBeforeUpdate = ePreguntaCerradaOpcionRepository.findAll().size(); + ePreguntaCerradaOpcion.setId(count.incrementAndGet()); + + // If the entity doesn't have an ID, it will throw BadRequestAlertException + restEPreguntaCerradaOpcionMockMvc + .perform( + patch(ENTITY_API_URL_ID, ePreguntaCerradaOpcion.getId()) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(ePreguntaCerradaOpcion)) + ) + .andExpect(status().isBadRequest()); + + // Validate the EPreguntaCerradaOpcion in the database + List ePreguntaCerradaOpcionList = ePreguntaCerradaOpcionRepository.findAll(); + assertThat(ePreguntaCerradaOpcionList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void patchWithIdMismatchEPreguntaCerradaOpcion() throws Exception { + int databaseSizeBeforeUpdate = ePreguntaCerradaOpcionRepository.findAll().size(); + ePreguntaCerradaOpcion.setId(count.incrementAndGet()); + + // If url ID doesn't match entity ID, it will throw BadRequestAlertException + restEPreguntaCerradaOpcionMockMvc + .perform( + patch(ENTITY_API_URL_ID, count.incrementAndGet()) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(ePreguntaCerradaOpcion)) + ) + .andExpect(status().isBadRequest()); + + // Validate the EPreguntaCerradaOpcion in the database + List ePreguntaCerradaOpcionList = ePreguntaCerradaOpcionRepository.findAll(); + assertThat(ePreguntaCerradaOpcionList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void patchWithMissingIdPathParamEPreguntaCerradaOpcion() throws Exception { + int databaseSizeBeforeUpdate = ePreguntaCerradaOpcionRepository.findAll().size(); + ePreguntaCerradaOpcion.setId(count.incrementAndGet()); + + // If url ID doesn't match entity ID, it will throw BadRequestAlertException + restEPreguntaCerradaOpcionMockMvc + .perform( + patch(ENTITY_API_URL) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(ePreguntaCerradaOpcion)) + ) + .andExpect(status().isMethodNotAllowed()); + + // Validate the EPreguntaCerradaOpcion in the database + List ePreguntaCerradaOpcionList = ePreguntaCerradaOpcionRepository.findAll(); + assertThat(ePreguntaCerradaOpcionList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void deleteEPreguntaCerradaOpcion() throws Exception { + // Initialize the database + ePreguntaCerradaOpcionRepository.saveAndFlush(ePreguntaCerradaOpcion); + + int databaseSizeBeforeDelete = ePreguntaCerradaOpcionRepository.findAll().size(); + + // Delete the ePreguntaCerradaOpcion + restEPreguntaCerradaOpcionMockMvc + .perform(delete(ENTITY_API_URL_ID, ePreguntaCerradaOpcion.getId()).accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isNoContent()); + + // Validate the database contains one less item + List ePreguntaCerradaOpcionList = ePreguntaCerradaOpcionRepository.findAll(); + assertThat(ePreguntaCerradaOpcionList).hasSize(databaseSizeBeforeDelete - 1); + } +} diff --git a/src/test/java/org/datasurvey/web/rest/EPreguntaCerradaResourceIT.java b/src/test/java/org/datasurvey/web/rest/EPreguntaCerradaResourceIT.java new file mode 100644 index 0000000..da95f86 --- /dev/null +++ b/src/test/java/org/datasurvey/web/rest/EPreguntaCerradaResourceIT.java @@ -0,0 +1,875 @@ +package org.datasurvey.web.rest; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.hamcrest.Matchers.hasItem; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +import java.util.List; +import java.util.Random; +import java.util.concurrent.atomic.AtomicLong; +import javax.persistence.EntityManager; +import org.datasurvey.IntegrationTest; +import org.datasurvey.domain.EPreguntaCerrada; +import org.datasurvey.domain.EPreguntaCerradaOpcion; +import org.datasurvey.domain.Encuesta; +import org.datasurvey.domain.enumeration.PreguntaCerradaTipo; +import org.datasurvey.repository.EPreguntaCerradaRepository; +import org.datasurvey.service.criteria.EPreguntaCerradaCriteria; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.http.MediaType; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.transaction.annotation.Transactional; + +/** + * Integration tests for the {@link EPreguntaCerradaResource} REST controller. + */ +@IntegrationTest +@AutoConfigureMockMvc +@WithMockUser +class EPreguntaCerradaResourceIT { + + private static final String DEFAULT_NOMBRE = "AAAAAAAAAA"; + private static final String UPDATED_NOMBRE = "BBBBBBBBBB"; + + private static final PreguntaCerradaTipo DEFAULT_TIPO = PreguntaCerradaTipo.SINGLE; + private static final PreguntaCerradaTipo UPDATED_TIPO = PreguntaCerradaTipo.MULTIPLE; + + private static final Boolean DEFAULT_OPCIONAL = false; + private static final Boolean UPDATED_OPCIONAL = true; + + private static final Integer DEFAULT_ORDEN = 1; + private static final Integer UPDATED_ORDEN = 2; + private static final Integer SMALLER_ORDEN = 1 - 1; + + private static final String ENTITY_API_URL = "/api/e-pregunta-cerradas"; + private static final String ENTITY_API_URL_ID = ENTITY_API_URL + "/{id}"; + + private static Random random = new Random(); + private static AtomicLong count = new AtomicLong(random.nextInt() + (2 * Integer.MAX_VALUE)); + + @Autowired + private EPreguntaCerradaRepository ePreguntaCerradaRepository; + + @Autowired + private EntityManager em; + + @Autowired + private MockMvc restEPreguntaCerradaMockMvc; + + private EPreguntaCerrada ePreguntaCerrada; + + /** + * Create an entity for this test. + * + * This is a static method, as tests for other entities might also need it, + * if they test an entity which requires the current entity. + */ + public static EPreguntaCerrada createEntity(EntityManager em) { + EPreguntaCerrada ePreguntaCerrada = new EPreguntaCerrada() + .nombre(DEFAULT_NOMBRE) + .tipo(DEFAULT_TIPO) + .opcional(DEFAULT_OPCIONAL) + .orden(DEFAULT_ORDEN); + return ePreguntaCerrada; + } + + /** + * Create an updated entity for this test. + * + * This is a static method, as tests for other entities might also need it, + * if they test an entity which requires the current entity. + */ + public static EPreguntaCerrada createUpdatedEntity(EntityManager em) { + EPreguntaCerrada ePreguntaCerrada = new EPreguntaCerrada() + .nombre(UPDATED_NOMBRE) + .tipo(UPDATED_TIPO) + .opcional(UPDATED_OPCIONAL) + .orden(UPDATED_ORDEN); + return ePreguntaCerrada; + } + + @BeforeEach + public void initTest() { + ePreguntaCerrada = createEntity(em); + } + + @Test + @Transactional + void createEPreguntaCerrada() throws Exception { + int databaseSizeBeforeCreate = ePreguntaCerradaRepository.findAll().size(); + // Create the EPreguntaCerrada + restEPreguntaCerradaMockMvc + .perform( + post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(ePreguntaCerrada)) + ) + .andExpect(status().isCreated()); + + // Validate the EPreguntaCerrada in the database + List ePreguntaCerradaList = ePreguntaCerradaRepository.findAll(); + assertThat(ePreguntaCerradaList).hasSize(databaseSizeBeforeCreate + 1); + EPreguntaCerrada testEPreguntaCerrada = ePreguntaCerradaList.get(ePreguntaCerradaList.size() - 1); + assertThat(testEPreguntaCerrada.getNombre()).isEqualTo(DEFAULT_NOMBRE); + assertThat(testEPreguntaCerrada.getTipo()).isEqualTo(DEFAULT_TIPO); + assertThat(testEPreguntaCerrada.getOpcional()).isEqualTo(DEFAULT_OPCIONAL); + assertThat(testEPreguntaCerrada.getOrden()).isEqualTo(DEFAULT_ORDEN); + } + + @Test + @Transactional + void createEPreguntaCerradaWithExistingId() throws Exception { + // Create the EPreguntaCerrada with an existing ID + ePreguntaCerrada.setId(1L); + + int databaseSizeBeforeCreate = ePreguntaCerradaRepository.findAll().size(); + + // An entity with an existing ID cannot be created, so this API call must fail + restEPreguntaCerradaMockMvc + .perform( + post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(ePreguntaCerrada)) + ) + .andExpect(status().isBadRequest()); + + // Validate the EPreguntaCerrada in the database + List ePreguntaCerradaList = ePreguntaCerradaRepository.findAll(); + assertThat(ePreguntaCerradaList).hasSize(databaseSizeBeforeCreate); + } + + @Test + @Transactional + void checkNombreIsRequired() throws Exception { + int databaseSizeBeforeTest = ePreguntaCerradaRepository.findAll().size(); + // set the field null + ePreguntaCerrada.setNombre(null); + + // Create the EPreguntaCerrada, which fails. + + restEPreguntaCerradaMockMvc + .perform( + post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(ePreguntaCerrada)) + ) + .andExpect(status().isBadRequest()); + + List ePreguntaCerradaList = ePreguntaCerradaRepository.findAll(); + assertThat(ePreguntaCerradaList).hasSize(databaseSizeBeforeTest); + } + + @Test + @Transactional + void checkTipoIsRequired() throws Exception { + int databaseSizeBeforeTest = ePreguntaCerradaRepository.findAll().size(); + // set the field null + ePreguntaCerrada.setTipo(null); + + // Create the EPreguntaCerrada, which fails. + + restEPreguntaCerradaMockMvc + .perform( + post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(ePreguntaCerrada)) + ) + .andExpect(status().isBadRequest()); + + List ePreguntaCerradaList = ePreguntaCerradaRepository.findAll(); + assertThat(ePreguntaCerradaList).hasSize(databaseSizeBeforeTest); + } + + @Test + @Transactional + void checkOpcionalIsRequired() throws Exception { + int databaseSizeBeforeTest = ePreguntaCerradaRepository.findAll().size(); + // set the field null + ePreguntaCerrada.setOpcional(null); + + // Create the EPreguntaCerrada, which fails. + + restEPreguntaCerradaMockMvc + .perform( + post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(ePreguntaCerrada)) + ) + .andExpect(status().isBadRequest()); + + List ePreguntaCerradaList = ePreguntaCerradaRepository.findAll(); + assertThat(ePreguntaCerradaList).hasSize(databaseSizeBeforeTest); + } + + @Test + @Transactional + void checkOrdenIsRequired() throws Exception { + int databaseSizeBeforeTest = ePreguntaCerradaRepository.findAll().size(); + // set the field null + ePreguntaCerrada.setOrden(null); + + // Create the EPreguntaCerrada, which fails. + + restEPreguntaCerradaMockMvc + .perform( + post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(ePreguntaCerrada)) + ) + .andExpect(status().isBadRequest()); + + List ePreguntaCerradaList = ePreguntaCerradaRepository.findAll(); + assertThat(ePreguntaCerradaList).hasSize(databaseSizeBeforeTest); + } + + @Test + @Transactional + void getAllEPreguntaCerradas() throws Exception { + // Initialize the database + ePreguntaCerradaRepository.saveAndFlush(ePreguntaCerrada); + + // Get all the ePreguntaCerradaList + restEPreguntaCerradaMockMvc + .perform(get(ENTITY_API_URL + "?sort=id,desc")) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.[*].id").value(hasItem(ePreguntaCerrada.getId().intValue()))) + .andExpect(jsonPath("$.[*].nombre").value(hasItem(DEFAULT_NOMBRE))) + .andExpect(jsonPath("$.[*].tipo").value(hasItem(DEFAULT_TIPO.toString()))) + .andExpect(jsonPath("$.[*].opcional").value(hasItem(DEFAULT_OPCIONAL.booleanValue()))) + .andExpect(jsonPath("$.[*].orden").value(hasItem(DEFAULT_ORDEN))); + } + + @Test + @Transactional + void getEPreguntaCerrada() throws Exception { + // Initialize the database + ePreguntaCerradaRepository.saveAndFlush(ePreguntaCerrada); + + // Get the ePreguntaCerrada + restEPreguntaCerradaMockMvc + .perform(get(ENTITY_API_URL_ID, ePreguntaCerrada.getId())) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.id").value(ePreguntaCerrada.getId().intValue())) + .andExpect(jsonPath("$.nombre").value(DEFAULT_NOMBRE)) + .andExpect(jsonPath("$.tipo").value(DEFAULT_TIPO.toString())) + .andExpect(jsonPath("$.opcional").value(DEFAULT_OPCIONAL.booleanValue())) + .andExpect(jsonPath("$.orden").value(DEFAULT_ORDEN)); + } + + @Test + @Transactional + void getEPreguntaCerradasByIdFiltering() throws Exception { + // Initialize the database + ePreguntaCerradaRepository.saveAndFlush(ePreguntaCerrada); + + Long id = ePreguntaCerrada.getId(); + + defaultEPreguntaCerradaShouldBeFound("id.equals=" + id); + defaultEPreguntaCerradaShouldNotBeFound("id.notEquals=" + id); + + defaultEPreguntaCerradaShouldBeFound("id.greaterThanOrEqual=" + id); + defaultEPreguntaCerradaShouldNotBeFound("id.greaterThan=" + id); + + defaultEPreguntaCerradaShouldBeFound("id.lessThanOrEqual=" + id); + defaultEPreguntaCerradaShouldNotBeFound("id.lessThan=" + id); + } + + @Test + @Transactional + void getAllEPreguntaCerradasByNombreIsEqualToSomething() throws Exception { + // Initialize the database + ePreguntaCerradaRepository.saveAndFlush(ePreguntaCerrada); + + // Get all the ePreguntaCerradaList where nombre equals to DEFAULT_NOMBRE + defaultEPreguntaCerradaShouldBeFound("nombre.equals=" + DEFAULT_NOMBRE); + + // Get all the ePreguntaCerradaList where nombre equals to UPDATED_NOMBRE + defaultEPreguntaCerradaShouldNotBeFound("nombre.equals=" + UPDATED_NOMBRE); + } + + @Test + @Transactional + void getAllEPreguntaCerradasByNombreIsNotEqualToSomething() throws Exception { + // Initialize the database + ePreguntaCerradaRepository.saveAndFlush(ePreguntaCerrada); + + // Get all the ePreguntaCerradaList where nombre not equals to DEFAULT_NOMBRE + defaultEPreguntaCerradaShouldNotBeFound("nombre.notEquals=" + DEFAULT_NOMBRE); + + // Get all the ePreguntaCerradaList where nombre not equals to UPDATED_NOMBRE + defaultEPreguntaCerradaShouldBeFound("nombre.notEquals=" + UPDATED_NOMBRE); + } + + @Test + @Transactional + void getAllEPreguntaCerradasByNombreIsInShouldWork() throws Exception { + // Initialize the database + ePreguntaCerradaRepository.saveAndFlush(ePreguntaCerrada); + + // Get all the ePreguntaCerradaList where nombre in DEFAULT_NOMBRE or UPDATED_NOMBRE + defaultEPreguntaCerradaShouldBeFound("nombre.in=" + DEFAULT_NOMBRE + "," + UPDATED_NOMBRE); + + // Get all the ePreguntaCerradaList where nombre equals to UPDATED_NOMBRE + defaultEPreguntaCerradaShouldNotBeFound("nombre.in=" + UPDATED_NOMBRE); + } + + @Test + @Transactional + void getAllEPreguntaCerradasByNombreIsNullOrNotNull() throws Exception { + // Initialize the database + ePreguntaCerradaRepository.saveAndFlush(ePreguntaCerrada); + + // Get all the ePreguntaCerradaList where nombre is not null + defaultEPreguntaCerradaShouldBeFound("nombre.specified=true"); + + // Get all the ePreguntaCerradaList where nombre is null + defaultEPreguntaCerradaShouldNotBeFound("nombre.specified=false"); + } + + @Test + @Transactional + void getAllEPreguntaCerradasByNombreContainsSomething() throws Exception { + // Initialize the database + ePreguntaCerradaRepository.saveAndFlush(ePreguntaCerrada); + + // Get all the ePreguntaCerradaList where nombre contains DEFAULT_NOMBRE + defaultEPreguntaCerradaShouldBeFound("nombre.contains=" + DEFAULT_NOMBRE); + + // Get all the ePreguntaCerradaList where nombre contains UPDATED_NOMBRE + defaultEPreguntaCerradaShouldNotBeFound("nombre.contains=" + UPDATED_NOMBRE); + } + + @Test + @Transactional + void getAllEPreguntaCerradasByNombreNotContainsSomething() throws Exception { + // Initialize the database + ePreguntaCerradaRepository.saveAndFlush(ePreguntaCerrada); + + // Get all the ePreguntaCerradaList where nombre does not contain DEFAULT_NOMBRE + defaultEPreguntaCerradaShouldNotBeFound("nombre.doesNotContain=" + DEFAULT_NOMBRE); + + // Get all the ePreguntaCerradaList where nombre does not contain UPDATED_NOMBRE + defaultEPreguntaCerradaShouldBeFound("nombre.doesNotContain=" + UPDATED_NOMBRE); + } + + @Test + @Transactional + void getAllEPreguntaCerradasByTipoIsEqualToSomething() throws Exception { + // Initialize the database + ePreguntaCerradaRepository.saveAndFlush(ePreguntaCerrada); + + // Get all the ePreguntaCerradaList where tipo equals to DEFAULT_TIPO + defaultEPreguntaCerradaShouldBeFound("tipo.equals=" + DEFAULT_TIPO); + + // Get all the ePreguntaCerradaList where tipo equals to UPDATED_TIPO + defaultEPreguntaCerradaShouldNotBeFound("tipo.equals=" + UPDATED_TIPO); + } + + @Test + @Transactional + void getAllEPreguntaCerradasByTipoIsNotEqualToSomething() throws Exception { + // Initialize the database + ePreguntaCerradaRepository.saveAndFlush(ePreguntaCerrada); + + // Get all the ePreguntaCerradaList where tipo not equals to DEFAULT_TIPO + defaultEPreguntaCerradaShouldNotBeFound("tipo.notEquals=" + DEFAULT_TIPO); + + // Get all the ePreguntaCerradaList where tipo not equals to UPDATED_TIPO + defaultEPreguntaCerradaShouldBeFound("tipo.notEquals=" + UPDATED_TIPO); + } + + @Test + @Transactional + void getAllEPreguntaCerradasByTipoIsInShouldWork() throws Exception { + // Initialize the database + ePreguntaCerradaRepository.saveAndFlush(ePreguntaCerrada); + + // Get all the ePreguntaCerradaList where tipo in DEFAULT_TIPO or UPDATED_TIPO + defaultEPreguntaCerradaShouldBeFound("tipo.in=" + DEFAULT_TIPO + "," + UPDATED_TIPO); + + // Get all the ePreguntaCerradaList where tipo equals to UPDATED_TIPO + defaultEPreguntaCerradaShouldNotBeFound("tipo.in=" + UPDATED_TIPO); + } + + @Test + @Transactional + void getAllEPreguntaCerradasByTipoIsNullOrNotNull() throws Exception { + // Initialize the database + ePreguntaCerradaRepository.saveAndFlush(ePreguntaCerrada); + + // Get all the ePreguntaCerradaList where tipo is not null + defaultEPreguntaCerradaShouldBeFound("tipo.specified=true"); + + // Get all the ePreguntaCerradaList where tipo is null + defaultEPreguntaCerradaShouldNotBeFound("tipo.specified=false"); + } + + @Test + @Transactional + void getAllEPreguntaCerradasByOpcionalIsEqualToSomething() throws Exception { + // Initialize the database + ePreguntaCerradaRepository.saveAndFlush(ePreguntaCerrada); + + // Get all the ePreguntaCerradaList where opcional equals to DEFAULT_OPCIONAL + defaultEPreguntaCerradaShouldBeFound("opcional.equals=" + DEFAULT_OPCIONAL); + + // Get all the ePreguntaCerradaList where opcional equals to UPDATED_OPCIONAL + defaultEPreguntaCerradaShouldNotBeFound("opcional.equals=" + UPDATED_OPCIONAL); + } + + @Test + @Transactional + void getAllEPreguntaCerradasByOpcionalIsNotEqualToSomething() throws Exception { + // Initialize the database + ePreguntaCerradaRepository.saveAndFlush(ePreguntaCerrada); + + // Get all the ePreguntaCerradaList where opcional not equals to DEFAULT_OPCIONAL + defaultEPreguntaCerradaShouldNotBeFound("opcional.notEquals=" + DEFAULT_OPCIONAL); + + // Get all the ePreguntaCerradaList where opcional not equals to UPDATED_OPCIONAL + defaultEPreguntaCerradaShouldBeFound("opcional.notEquals=" + UPDATED_OPCIONAL); + } + + @Test + @Transactional + void getAllEPreguntaCerradasByOpcionalIsInShouldWork() throws Exception { + // Initialize the database + ePreguntaCerradaRepository.saveAndFlush(ePreguntaCerrada); + + // Get all the ePreguntaCerradaList where opcional in DEFAULT_OPCIONAL or UPDATED_OPCIONAL + defaultEPreguntaCerradaShouldBeFound("opcional.in=" + DEFAULT_OPCIONAL + "," + UPDATED_OPCIONAL); + + // Get all the ePreguntaCerradaList where opcional equals to UPDATED_OPCIONAL + defaultEPreguntaCerradaShouldNotBeFound("opcional.in=" + UPDATED_OPCIONAL); + } + + @Test + @Transactional + void getAllEPreguntaCerradasByOpcionalIsNullOrNotNull() throws Exception { + // Initialize the database + ePreguntaCerradaRepository.saveAndFlush(ePreguntaCerrada); + + // Get all the ePreguntaCerradaList where opcional is not null + defaultEPreguntaCerradaShouldBeFound("opcional.specified=true"); + + // Get all the ePreguntaCerradaList where opcional is null + defaultEPreguntaCerradaShouldNotBeFound("opcional.specified=false"); + } + + @Test + @Transactional + void getAllEPreguntaCerradasByOrdenIsEqualToSomething() throws Exception { + // Initialize the database + ePreguntaCerradaRepository.saveAndFlush(ePreguntaCerrada); + + // Get all the ePreguntaCerradaList where orden equals to DEFAULT_ORDEN + defaultEPreguntaCerradaShouldBeFound("orden.equals=" + DEFAULT_ORDEN); + + // Get all the ePreguntaCerradaList where orden equals to UPDATED_ORDEN + defaultEPreguntaCerradaShouldNotBeFound("orden.equals=" + UPDATED_ORDEN); + } + + @Test + @Transactional + void getAllEPreguntaCerradasByOrdenIsNotEqualToSomething() throws Exception { + // Initialize the database + ePreguntaCerradaRepository.saveAndFlush(ePreguntaCerrada); + + // Get all the ePreguntaCerradaList where orden not equals to DEFAULT_ORDEN + defaultEPreguntaCerradaShouldNotBeFound("orden.notEquals=" + DEFAULT_ORDEN); + + // Get all the ePreguntaCerradaList where orden not equals to UPDATED_ORDEN + defaultEPreguntaCerradaShouldBeFound("orden.notEquals=" + UPDATED_ORDEN); + } + + @Test + @Transactional + void getAllEPreguntaCerradasByOrdenIsInShouldWork() throws Exception { + // Initialize the database + ePreguntaCerradaRepository.saveAndFlush(ePreguntaCerrada); + + // Get all the ePreguntaCerradaList where orden in DEFAULT_ORDEN or UPDATED_ORDEN + defaultEPreguntaCerradaShouldBeFound("orden.in=" + DEFAULT_ORDEN + "," + UPDATED_ORDEN); + + // Get all the ePreguntaCerradaList where orden equals to UPDATED_ORDEN + defaultEPreguntaCerradaShouldNotBeFound("orden.in=" + UPDATED_ORDEN); + } + + @Test + @Transactional + void getAllEPreguntaCerradasByOrdenIsNullOrNotNull() throws Exception { + // Initialize the database + ePreguntaCerradaRepository.saveAndFlush(ePreguntaCerrada); + + // Get all the ePreguntaCerradaList where orden is not null + defaultEPreguntaCerradaShouldBeFound("orden.specified=true"); + + // Get all the ePreguntaCerradaList where orden is null + defaultEPreguntaCerradaShouldNotBeFound("orden.specified=false"); + } + + @Test + @Transactional + void getAllEPreguntaCerradasByOrdenIsGreaterThanOrEqualToSomething() throws Exception { + // Initialize the database + ePreguntaCerradaRepository.saveAndFlush(ePreguntaCerrada); + + // Get all the ePreguntaCerradaList where orden is greater than or equal to DEFAULT_ORDEN + defaultEPreguntaCerradaShouldBeFound("orden.greaterThanOrEqual=" + DEFAULT_ORDEN); + + // Get all the ePreguntaCerradaList where orden is greater than or equal to UPDATED_ORDEN + defaultEPreguntaCerradaShouldNotBeFound("orden.greaterThanOrEqual=" + UPDATED_ORDEN); + } + + @Test + @Transactional + void getAllEPreguntaCerradasByOrdenIsLessThanOrEqualToSomething() throws Exception { + // Initialize the database + ePreguntaCerradaRepository.saveAndFlush(ePreguntaCerrada); + + // Get all the ePreguntaCerradaList where orden is less than or equal to DEFAULT_ORDEN + defaultEPreguntaCerradaShouldBeFound("orden.lessThanOrEqual=" + DEFAULT_ORDEN); + + // Get all the ePreguntaCerradaList where orden is less than or equal to SMALLER_ORDEN + defaultEPreguntaCerradaShouldNotBeFound("orden.lessThanOrEqual=" + SMALLER_ORDEN); + } + + @Test + @Transactional + void getAllEPreguntaCerradasByOrdenIsLessThanSomething() throws Exception { + // Initialize the database + ePreguntaCerradaRepository.saveAndFlush(ePreguntaCerrada); + + // Get all the ePreguntaCerradaList where orden is less than DEFAULT_ORDEN + defaultEPreguntaCerradaShouldNotBeFound("orden.lessThan=" + DEFAULT_ORDEN); + + // Get all the ePreguntaCerradaList where orden is less than UPDATED_ORDEN + defaultEPreguntaCerradaShouldBeFound("orden.lessThan=" + UPDATED_ORDEN); + } + + @Test + @Transactional + void getAllEPreguntaCerradasByOrdenIsGreaterThanSomething() throws Exception { + // Initialize the database + ePreguntaCerradaRepository.saveAndFlush(ePreguntaCerrada); + + // Get all the ePreguntaCerradaList where orden is greater than DEFAULT_ORDEN + defaultEPreguntaCerradaShouldNotBeFound("orden.greaterThan=" + DEFAULT_ORDEN); + + // Get all the ePreguntaCerradaList where orden is greater than SMALLER_ORDEN + defaultEPreguntaCerradaShouldBeFound("orden.greaterThan=" + SMALLER_ORDEN); + } + + @Test + @Transactional + void getAllEPreguntaCerradasByEPreguntaCerradaOpcionIsEqualToSomething() throws Exception { + // Initialize the database + ePreguntaCerradaRepository.saveAndFlush(ePreguntaCerrada); + EPreguntaCerradaOpcion ePreguntaCerradaOpcion = EPreguntaCerradaOpcionResourceIT.createEntity(em); + em.persist(ePreguntaCerradaOpcion); + em.flush(); + ePreguntaCerrada.addEPreguntaCerradaOpcion(ePreguntaCerradaOpcion); + ePreguntaCerradaRepository.saveAndFlush(ePreguntaCerrada); + Long ePreguntaCerradaOpcionId = ePreguntaCerradaOpcion.getId(); + + // Get all the ePreguntaCerradaList where ePreguntaCerradaOpcion equals to ePreguntaCerradaOpcionId + defaultEPreguntaCerradaShouldBeFound("ePreguntaCerradaOpcionId.equals=" + ePreguntaCerradaOpcionId); + + // Get all the ePreguntaCerradaList where ePreguntaCerradaOpcion equals to (ePreguntaCerradaOpcionId + 1) + defaultEPreguntaCerradaShouldNotBeFound("ePreguntaCerradaOpcionId.equals=" + (ePreguntaCerradaOpcionId + 1)); + } + + @Test + @Transactional + void getAllEPreguntaCerradasByEncuestaIsEqualToSomething() throws Exception { + // Initialize the database + ePreguntaCerradaRepository.saveAndFlush(ePreguntaCerrada); + Encuesta encuesta = EncuestaResourceIT.createEntity(em); + em.persist(encuesta); + em.flush(); + ePreguntaCerrada.setEncuesta(encuesta); + ePreguntaCerradaRepository.saveAndFlush(ePreguntaCerrada); + Long encuestaId = encuesta.getId(); + + // Get all the ePreguntaCerradaList where encuesta equals to encuestaId + defaultEPreguntaCerradaShouldBeFound("encuestaId.equals=" + encuestaId); + + // Get all the ePreguntaCerradaList where encuesta equals to (encuestaId + 1) + defaultEPreguntaCerradaShouldNotBeFound("encuestaId.equals=" + (encuestaId + 1)); + } + + /** + * Executes the search, and checks that the default entity is returned. + */ + private void defaultEPreguntaCerradaShouldBeFound(String filter) throws Exception { + restEPreguntaCerradaMockMvc + .perform(get(ENTITY_API_URL + "?sort=id,desc&" + filter)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.[*].id").value(hasItem(ePreguntaCerrada.getId().intValue()))) + .andExpect(jsonPath("$.[*].nombre").value(hasItem(DEFAULT_NOMBRE))) + .andExpect(jsonPath("$.[*].tipo").value(hasItem(DEFAULT_TIPO.toString()))) + .andExpect(jsonPath("$.[*].opcional").value(hasItem(DEFAULT_OPCIONAL.booleanValue()))) + .andExpect(jsonPath("$.[*].orden").value(hasItem(DEFAULT_ORDEN))); + + // Check, that the count call also returns 1 + restEPreguntaCerradaMockMvc + .perform(get(ENTITY_API_URL + "/count?sort=id,desc&" + filter)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(content().string("1")); + } + + /** + * Executes the search, and checks that the default entity is not returned. + */ + private void defaultEPreguntaCerradaShouldNotBeFound(String filter) throws Exception { + restEPreguntaCerradaMockMvc + .perform(get(ENTITY_API_URL + "?sort=id,desc&" + filter)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$").isArray()) + .andExpect(jsonPath("$").isEmpty()); + + // Check, that the count call also returns 0 + restEPreguntaCerradaMockMvc + .perform(get(ENTITY_API_URL + "/count?sort=id,desc&" + filter)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(content().string("0")); + } + + @Test + @Transactional + void getNonExistingEPreguntaCerrada() throws Exception { + // Get the ePreguntaCerrada + restEPreguntaCerradaMockMvc.perform(get(ENTITY_API_URL_ID, Long.MAX_VALUE)).andExpect(status().isNotFound()); + } + + @Test + @Transactional + void putNewEPreguntaCerrada() throws Exception { + // Initialize the database + ePreguntaCerradaRepository.saveAndFlush(ePreguntaCerrada); + + int databaseSizeBeforeUpdate = ePreguntaCerradaRepository.findAll().size(); + + // Update the ePreguntaCerrada + EPreguntaCerrada updatedEPreguntaCerrada = ePreguntaCerradaRepository.findById(ePreguntaCerrada.getId()).get(); + // Disconnect from session so that the updates on updatedEPreguntaCerrada are not directly saved in db + em.detach(updatedEPreguntaCerrada); + updatedEPreguntaCerrada.nombre(UPDATED_NOMBRE).tipo(UPDATED_TIPO).opcional(UPDATED_OPCIONAL).orden(UPDATED_ORDEN); + + restEPreguntaCerradaMockMvc + .perform( + put(ENTITY_API_URL_ID, updatedEPreguntaCerrada.getId()) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(updatedEPreguntaCerrada)) + ) + .andExpect(status().isOk()); + + // Validate the EPreguntaCerrada in the database + List ePreguntaCerradaList = ePreguntaCerradaRepository.findAll(); + assertThat(ePreguntaCerradaList).hasSize(databaseSizeBeforeUpdate); + EPreguntaCerrada testEPreguntaCerrada = ePreguntaCerradaList.get(ePreguntaCerradaList.size() - 1); + assertThat(testEPreguntaCerrada.getNombre()).isEqualTo(UPDATED_NOMBRE); + assertThat(testEPreguntaCerrada.getTipo()).isEqualTo(UPDATED_TIPO); + assertThat(testEPreguntaCerrada.getOpcional()).isEqualTo(UPDATED_OPCIONAL); + assertThat(testEPreguntaCerrada.getOrden()).isEqualTo(UPDATED_ORDEN); + } + + @Test + @Transactional + void putNonExistingEPreguntaCerrada() throws Exception { + int databaseSizeBeforeUpdate = ePreguntaCerradaRepository.findAll().size(); + ePreguntaCerrada.setId(count.incrementAndGet()); + + // If the entity doesn't have an ID, it will throw BadRequestAlertException + restEPreguntaCerradaMockMvc + .perform( + put(ENTITY_API_URL_ID, ePreguntaCerrada.getId()) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(ePreguntaCerrada)) + ) + .andExpect(status().isBadRequest()); + + // Validate the EPreguntaCerrada in the database + List ePreguntaCerradaList = ePreguntaCerradaRepository.findAll(); + assertThat(ePreguntaCerradaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void putWithIdMismatchEPreguntaCerrada() throws Exception { + int databaseSizeBeforeUpdate = ePreguntaCerradaRepository.findAll().size(); + ePreguntaCerrada.setId(count.incrementAndGet()); + + // If url ID doesn't match entity ID, it will throw BadRequestAlertException + restEPreguntaCerradaMockMvc + .perform( + put(ENTITY_API_URL_ID, count.incrementAndGet()) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(ePreguntaCerrada)) + ) + .andExpect(status().isBadRequest()); + + // Validate the EPreguntaCerrada in the database + List ePreguntaCerradaList = ePreguntaCerradaRepository.findAll(); + assertThat(ePreguntaCerradaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void putWithMissingIdPathParamEPreguntaCerrada() throws Exception { + int databaseSizeBeforeUpdate = ePreguntaCerradaRepository.findAll().size(); + ePreguntaCerrada.setId(count.incrementAndGet()); + + // If url ID doesn't match entity ID, it will throw BadRequestAlertException + restEPreguntaCerradaMockMvc + .perform( + put(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(ePreguntaCerrada)) + ) + .andExpect(status().isMethodNotAllowed()); + + // Validate the EPreguntaCerrada in the database + List ePreguntaCerradaList = ePreguntaCerradaRepository.findAll(); + assertThat(ePreguntaCerradaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void partialUpdateEPreguntaCerradaWithPatch() throws Exception { + // Initialize the database + ePreguntaCerradaRepository.saveAndFlush(ePreguntaCerrada); + + int databaseSizeBeforeUpdate = ePreguntaCerradaRepository.findAll().size(); + + // Update the ePreguntaCerrada using partial update + EPreguntaCerrada partialUpdatedEPreguntaCerrada = new EPreguntaCerrada(); + partialUpdatedEPreguntaCerrada.setId(ePreguntaCerrada.getId()); + + partialUpdatedEPreguntaCerrada.tipo(UPDATED_TIPO); + + restEPreguntaCerradaMockMvc + .perform( + patch(ENTITY_API_URL_ID, partialUpdatedEPreguntaCerrada.getId()) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(partialUpdatedEPreguntaCerrada)) + ) + .andExpect(status().isOk()); + + // Validate the EPreguntaCerrada in the database + List ePreguntaCerradaList = ePreguntaCerradaRepository.findAll(); + assertThat(ePreguntaCerradaList).hasSize(databaseSizeBeforeUpdate); + EPreguntaCerrada testEPreguntaCerrada = ePreguntaCerradaList.get(ePreguntaCerradaList.size() - 1); + assertThat(testEPreguntaCerrada.getNombre()).isEqualTo(DEFAULT_NOMBRE); + assertThat(testEPreguntaCerrada.getTipo()).isEqualTo(UPDATED_TIPO); + assertThat(testEPreguntaCerrada.getOpcional()).isEqualTo(DEFAULT_OPCIONAL); + assertThat(testEPreguntaCerrada.getOrden()).isEqualTo(DEFAULT_ORDEN); + } + + @Test + @Transactional + void fullUpdateEPreguntaCerradaWithPatch() throws Exception { + // Initialize the database + ePreguntaCerradaRepository.saveAndFlush(ePreguntaCerrada); + + int databaseSizeBeforeUpdate = ePreguntaCerradaRepository.findAll().size(); + + // Update the ePreguntaCerrada using partial update + EPreguntaCerrada partialUpdatedEPreguntaCerrada = new EPreguntaCerrada(); + partialUpdatedEPreguntaCerrada.setId(ePreguntaCerrada.getId()); + + partialUpdatedEPreguntaCerrada.nombre(UPDATED_NOMBRE).tipo(UPDATED_TIPO).opcional(UPDATED_OPCIONAL).orden(UPDATED_ORDEN); + + restEPreguntaCerradaMockMvc + .perform( + patch(ENTITY_API_URL_ID, partialUpdatedEPreguntaCerrada.getId()) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(partialUpdatedEPreguntaCerrada)) + ) + .andExpect(status().isOk()); + + // Validate the EPreguntaCerrada in the database + List ePreguntaCerradaList = ePreguntaCerradaRepository.findAll(); + assertThat(ePreguntaCerradaList).hasSize(databaseSizeBeforeUpdate); + EPreguntaCerrada testEPreguntaCerrada = ePreguntaCerradaList.get(ePreguntaCerradaList.size() - 1); + assertThat(testEPreguntaCerrada.getNombre()).isEqualTo(UPDATED_NOMBRE); + assertThat(testEPreguntaCerrada.getTipo()).isEqualTo(UPDATED_TIPO); + assertThat(testEPreguntaCerrada.getOpcional()).isEqualTo(UPDATED_OPCIONAL); + assertThat(testEPreguntaCerrada.getOrden()).isEqualTo(UPDATED_ORDEN); + } + + @Test + @Transactional + void patchNonExistingEPreguntaCerrada() throws Exception { + int databaseSizeBeforeUpdate = ePreguntaCerradaRepository.findAll().size(); + ePreguntaCerrada.setId(count.incrementAndGet()); + + // If the entity doesn't have an ID, it will throw BadRequestAlertException + restEPreguntaCerradaMockMvc + .perform( + patch(ENTITY_API_URL_ID, ePreguntaCerrada.getId()) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(ePreguntaCerrada)) + ) + .andExpect(status().isBadRequest()); + + // Validate the EPreguntaCerrada in the database + List ePreguntaCerradaList = ePreguntaCerradaRepository.findAll(); + assertThat(ePreguntaCerradaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void patchWithIdMismatchEPreguntaCerrada() throws Exception { + int databaseSizeBeforeUpdate = ePreguntaCerradaRepository.findAll().size(); + ePreguntaCerrada.setId(count.incrementAndGet()); + + // If url ID doesn't match entity ID, it will throw BadRequestAlertException + restEPreguntaCerradaMockMvc + .perform( + patch(ENTITY_API_URL_ID, count.incrementAndGet()) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(ePreguntaCerrada)) + ) + .andExpect(status().isBadRequest()); + + // Validate the EPreguntaCerrada in the database + List ePreguntaCerradaList = ePreguntaCerradaRepository.findAll(); + assertThat(ePreguntaCerradaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void patchWithMissingIdPathParamEPreguntaCerrada() throws Exception { + int databaseSizeBeforeUpdate = ePreguntaCerradaRepository.findAll().size(); + ePreguntaCerrada.setId(count.incrementAndGet()); + + // If url ID doesn't match entity ID, it will throw BadRequestAlertException + restEPreguntaCerradaMockMvc + .perform( + patch(ENTITY_API_URL) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(ePreguntaCerrada)) + ) + .andExpect(status().isMethodNotAllowed()); + + // Validate the EPreguntaCerrada in the database + List ePreguntaCerradaList = ePreguntaCerradaRepository.findAll(); + assertThat(ePreguntaCerradaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void deleteEPreguntaCerrada() throws Exception { + // Initialize the database + ePreguntaCerradaRepository.saveAndFlush(ePreguntaCerrada); + + int databaseSizeBeforeDelete = ePreguntaCerradaRepository.findAll().size(); + + // Delete the ePreguntaCerrada + restEPreguntaCerradaMockMvc + .perform(delete(ENTITY_API_URL_ID, ePreguntaCerrada.getId()).accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isNoContent()); + + // Validate the database contains one less item + List ePreguntaCerradaList = ePreguntaCerradaRepository.findAll(); + assertThat(ePreguntaCerradaList).hasSize(databaseSizeBeforeDelete - 1); + } +} diff --git a/src/test/java/org/datasurvey/web/rest/EncuestaResourceIT.java b/src/test/java/org/datasurvey/web/rest/EncuestaResourceIT.java new file mode 100644 index 0000000..088868a --- /dev/null +++ b/src/test/java/org/datasurvey/web/rest/EncuestaResourceIT.java @@ -0,0 +1,1611 @@ +package org.datasurvey.web.rest; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.datasurvey.web.rest.TestUtil.sameInstant; +import static org.hamcrest.Matchers.hasItem; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +import java.time.Instant; +import java.time.ZoneId; +import java.time.ZoneOffset; +import java.time.ZonedDateTime; +import java.util.List; +import java.util.Random; +import java.util.concurrent.atomic.AtomicLong; +import javax.persistence.EntityManager; +import org.datasurvey.IntegrationTest; +import org.datasurvey.domain.Categoria; +import org.datasurvey.domain.EPreguntaAbierta; +import org.datasurvey.domain.EPreguntaCerrada; +import org.datasurvey.domain.Encuesta; +import org.datasurvey.domain.UsuarioEncuesta; +import org.datasurvey.domain.UsuarioExtra; +import org.datasurvey.domain.enumeration.AccesoEncuesta; +import org.datasurvey.domain.enumeration.EstadoEncuesta; +import org.datasurvey.repository.EncuestaRepository; +import org.datasurvey.service.criteria.EncuestaCriteria; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.http.MediaType; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.transaction.annotation.Transactional; + +/** + * Integration tests for the {@link EncuestaResource} REST controller. + */ +@IntegrationTest +@AutoConfigureMockMvc +@WithMockUser +class EncuestaResourceIT { + + private static final String DEFAULT_NOMBRE = "AAAAAAAAAA"; + private static final String UPDATED_NOMBRE = "BBBBBBBBBB"; + + private static final String DEFAULT_DESCRIPCION = "AAAAAAAAAA"; + private static final String UPDATED_DESCRIPCION = "BBBBBBBBBB"; + + private static final ZonedDateTime DEFAULT_FECHA_CREACION = ZonedDateTime.ofInstant(Instant.ofEpochMilli(0L), ZoneOffset.UTC); + private static final ZonedDateTime UPDATED_FECHA_CREACION = ZonedDateTime.now(ZoneId.systemDefault()).withNano(0); + private static final ZonedDateTime SMALLER_FECHA_CREACION = ZonedDateTime.ofInstant(Instant.ofEpochMilli(-1L), ZoneOffset.UTC); + + private static final ZonedDateTime DEFAULT_FECHA_PUBLICACION = ZonedDateTime.ofInstant(Instant.ofEpochMilli(0L), ZoneOffset.UTC); + private static final ZonedDateTime UPDATED_FECHA_PUBLICACION = ZonedDateTime.now(ZoneId.systemDefault()).withNano(0); + private static final ZonedDateTime SMALLER_FECHA_PUBLICACION = ZonedDateTime.ofInstant(Instant.ofEpochMilli(-1L), ZoneOffset.UTC); + + private static final ZonedDateTime DEFAULT_FECHA_FINALIZAR = ZonedDateTime.ofInstant(Instant.ofEpochMilli(0L), ZoneOffset.UTC); + private static final ZonedDateTime UPDATED_FECHA_FINALIZAR = ZonedDateTime.now(ZoneId.systemDefault()).withNano(0); + private static final ZonedDateTime SMALLER_FECHA_FINALIZAR = ZonedDateTime.ofInstant(Instant.ofEpochMilli(-1L), ZoneOffset.UTC); + + private static final ZonedDateTime DEFAULT_FECHA_FINALIZADA = ZonedDateTime.ofInstant(Instant.ofEpochMilli(0L), ZoneOffset.UTC); + private static final ZonedDateTime UPDATED_FECHA_FINALIZADA = ZonedDateTime.now(ZoneId.systemDefault()).withNano(0); + private static final ZonedDateTime SMALLER_FECHA_FINALIZADA = ZonedDateTime.ofInstant(Instant.ofEpochMilli(-1L), ZoneOffset.UTC); + + private static final Double DEFAULT_CALIFICACION = 1D; + private static final Double UPDATED_CALIFICACION = 2D; + private static final Double SMALLER_CALIFICACION = 1D - 1D; + + private static final AccesoEncuesta DEFAULT_ACCESO = AccesoEncuesta.PUBLIC; + private static final AccesoEncuesta UPDATED_ACCESO = AccesoEncuesta.PRIVATE; + + private static final String DEFAULT_CONTRASENNA = "AAAAAAAAAA"; + private static final String UPDATED_CONTRASENNA = "BBBBBBBBBB"; + + private static final EstadoEncuesta DEFAULT_ESTADO = EstadoEncuesta.DRAFT; + private static final EstadoEncuesta UPDATED_ESTADO = EstadoEncuesta.ACTIVE; + + private static final String ENTITY_API_URL = "/api/encuestas"; + private static final String ENTITY_API_URL_ID = ENTITY_API_URL + "/{id}"; + + private static Random random = new Random(); + private static AtomicLong count = new AtomicLong(random.nextInt() + (2 * Integer.MAX_VALUE)); + + @Autowired + private EncuestaRepository encuestaRepository; + + @Autowired + private EntityManager em; + + @Autowired + private MockMvc restEncuestaMockMvc; + + private Encuesta encuesta; + + /** + * Create an entity for this test. + * + * This is a static method, as tests for other entities might also need it, + * if they test an entity which requires the current entity. + */ + public static Encuesta createEntity(EntityManager em) { + Encuesta encuesta = new Encuesta() + .nombre(DEFAULT_NOMBRE) + .descripcion(DEFAULT_DESCRIPCION) + .fechaCreacion(DEFAULT_FECHA_CREACION) + .fechaPublicacion(DEFAULT_FECHA_PUBLICACION) + .fechaFinalizar(DEFAULT_FECHA_FINALIZAR) + .fechaFinalizada(DEFAULT_FECHA_FINALIZADA) + .calificacion(DEFAULT_CALIFICACION) + .acceso(DEFAULT_ACCESO) + .contrasenna(DEFAULT_CONTRASENNA) + .estado(DEFAULT_ESTADO); + return encuesta; + } + + /** + * Create an updated entity for this test. + * + * This is a static method, as tests for other entities might also need it, + * if they test an entity which requires the current entity. + */ + public static Encuesta createUpdatedEntity(EntityManager em) { + Encuesta encuesta = new Encuesta() + .nombre(UPDATED_NOMBRE) + .descripcion(UPDATED_DESCRIPCION) + .fechaCreacion(UPDATED_FECHA_CREACION) + .fechaPublicacion(UPDATED_FECHA_PUBLICACION) + .fechaFinalizar(UPDATED_FECHA_FINALIZAR) + .fechaFinalizada(UPDATED_FECHA_FINALIZADA) + .calificacion(UPDATED_CALIFICACION) + .acceso(UPDATED_ACCESO) + .contrasenna(UPDATED_CONTRASENNA) + .estado(UPDATED_ESTADO); + return encuesta; + } + + @BeforeEach + public void initTest() { + encuesta = createEntity(em); + } + + @Test + @Transactional + void createEncuesta() throws Exception { + int databaseSizeBeforeCreate = encuestaRepository.findAll().size(); + // Create the Encuesta + restEncuestaMockMvc + .perform(post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(encuesta))) + .andExpect(status().isCreated()); + + // Validate the Encuesta in the database + List encuestaList = encuestaRepository.findAll(); + assertThat(encuestaList).hasSize(databaseSizeBeforeCreate + 1); + Encuesta testEncuesta = encuestaList.get(encuestaList.size() - 1); + assertThat(testEncuesta.getNombre()).isEqualTo(DEFAULT_NOMBRE); + assertThat(testEncuesta.getDescripcion()).isEqualTo(DEFAULT_DESCRIPCION); + assertThat(testEncuesta.getFechaCreacion()).isEqualTo(DEFAULT_FECHA_CREACION); + assertThat(testEncuesta.getFechaPublicacion()).isEqualTo(DEFAULT_FECHA_PUBLICACION); + assertThat(testEncuesta.getFechaFinalizar()).isEqualTo(DEFAULT_FECHA_FINALIZAR); + assertThat(testEncuesta.getFechaFinalizada()).isEqualTo(DEFAULT_FECHA_FINALIZADA); + assertThat(testEncuesta.getCalificacion()).isEqualTo(DEFAULT_CALIFICACION); + assertThat(testEncuesta.getAcceso()).isEqualTo(DEFAULT_ACCESO); + assertThat(testEncuesta.getContrasenna()).isEqualTo(DEFAULT_CONTRASENNA); + assertThat(testEncuesta.getEstado()).isEqualTo(DEFAULT_ESTADO); + } + + @Test + @Transactional + void createEncuestaWithExistingId() throws Exception { + // Create the Encuesta with an existing ID + encuesta.setId(1L); + + int databaseSizeBeforeCreate = encuestaRepository.findAll().size(); + + // An entity with an existing ID cannot be created, so this API call must fail + restEncuestaMockMvc + .perform(post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(encuesta))) + .andExpect(status().isBadRequest()); + + // Validate the Encuesta in the database + List encuestaList = encuestaRepository.findAll(); + assertThat(encuestaList).hasSize(databaseSizeBeforeCreate); + } + + @Test + @Transactional + void checkNombreIsRequired() throws Exception { + int databaseSizeBeforeTest = encuestaRepository.findAll().size(); + // set the field null + encuesta.setNombre(null); + + // Create the Encuesta, which fails. + + restEncuestaMockMvc + .perform(post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(encuesta))) + .andExpect(status().isBadRequest()); + + List encuestaList = encuestaRepository.findAll(); + assertThat(encuestaList).hasSize(databaseSizeBeforeTest); + } + + @Test + @Transactional + void checkFechaCreacionIsRequired() throws Exception { + int databaseSizeBeforeTest = encuestaRepository.findAll().size(); + // set the field null + encuesta.setFechaCreacion(null); + + // Create the Encuesta, which fails. + + restEncuestaMockMvc + .perform(post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(encuesta))) + .andExpect(status().isBadRequest()); + + List encuestaList = encuestaRepository.findAll(); + assertThat(encuestaList).hasSize(databaseSizeBeforeTest); + } + + @Test + @Transactional + void checkCalificacionIsRequired() throws Exception { + int databaseSizeBeforeTest = encuestaRepository.findAll().size(); + // set the field null + encuesta.setCalificacion(null); + + // Create the Encuesta, which fails. + + restEncuestaMockMvc + .perform(post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(encuesta))) + .andExpect(status().isBadRequest()); + + List encuestaList = encuestaRepository.findAll(); + assertThat(encuestaList).hasSize(databaseSizeBeforeTest); + } + + @Test + @Transactional + void checkAccesoIsRequired() throws Exception { + int databaseSizeBeforeTest = encuestaRepository.findAll().size(); + // set the field null + encuesta.setAcceso(null); + + // Create the Encuesta, which fails. + + restEncuestaMockMvc + .perform(post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(encuesta))) + .andExpect(status().isBadRequest()); + + List encuestaList = encuestaRepository.findAll(); + assertThat(encuestaList).hasSize(databaseSizeBeforeTest); + } + + @Test + @Transactional + void checkEstadoIsRequired() throws Exception { + int databaseSizeBeforeTest = encuestaRepository.findAll().size(); + // set the field null + encuesta.setEstado(null); + + // Create the Encuesta, which fails. + + restEncuestaMockMvc + .perform(post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(encuesta))) + .andExpect(status().isBadRequest()); + + List encuestaList = encuestaRepository.findAll(); + assertThat(encuestaList).hasSize(databaseSizeBeforeTest); + } + + @Test + @Transactional + void getAllEncuestas() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList + restEncuestaMockMvc + .perform(get(ENTITY_API_URL + "?sort=id,desc")) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.[*].id").value(hasItem(encuesta.getId().intValue()))) + .andExpect(jsonPath("$.[*].nombre").value(hasItem(DEFAULT_NOMBRE))) + .andExpect(jsonPath("$.[*].descripcion").value(hasItem(DEFAULT_DESCRIPCION))) + .andExpect(jsonPath("$.[*].fechaCreacion").value(hasItem(sameInstant(DEFAULT_FECHA_CREACION)))) + .andExpect(jsonPath("$.[*].fechaPublicacion").value(hasItem(sameInstant(DEFAULT_FECHA_PUBLICACION)))) + .andExpect(jsonPath("$.[*].fechaFinalizar").value(hasItem(sameInstant(DEFAULT_FECHA_FINALIZAR)))) + .andExpect(jsonPath("$.[*].fechaFinalizada").value(hasItem(sameInstant(DEFAULT_FECHA_FINALIZADA)))) + .andExpect(jsonPath("$.[*].calificacion").value(hasItem(DEFAULT_CALIFICACION.doubleValue()))) + .andExpect(jsonPath("$.[*].acceso").value(hasItem(DEFAULT_ACCESO.toString()))) + .andExpect(jsonPath("$.[*].contrasenna").value(hasItem(DEFAULT_CONTRASENNA))) + .andExpect(jsonPath("$.[*].estado").value(hasItem(DEFAULT_ESTADO.toString()))); + } + + @Test + @Transactional + void getEncuesta() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get the encuesta + restEncuestaMockMvc + .perform(get(ENTITY_API_URL_ID, encuesta.getId())) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.id").value(encuesta.getId().intValue())) + .andExpect(jsonPath("$.nombre").value(DEFAULT_NOMBRE)) + .andExpect(jsonPath("$.descripcion").value(DEFAULT_DESCRIPCION)) + .andExpect(jsonPath("$.fechaCreacion").value(sameInstant(DEFAULT_FECHA_CREACION))) + .andExpect(jsonPath("$.fechaPublicacion").value(sameInstant(DEFAULT_FECHA_PUBLICACION))) + .andExpect(jsonPath("$.fechaFinalizar").value(sameInstant(DEFAULT_FECHA_FINALIZAR))) + .andExpect(jsonPath("$.fechaFinalizada").value(sameInstant(DEFAULT_FECHA_FINALIZADA))) + .andExpect(jsonPath("$.calificacion").value(DEFAULT_CALIFICACION.doubleValue())) + .andExpect(jsonPath("$.acceso").value(DEFAULT_ACCESO.toString())) + .andExpect(jsonPath("$.contrasenna").value(DEFAULT_CONTRASENNA)) + .andExpect(jsonPath("$.estado").value(DEFAULT_ESTADO.toString())); + } + + @Test + @Transactional + void getEncuestasByIdFiltering() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + Long id = encuesta.getId(); + + defaultEncuestaShouldBeFound("id.equals=" + id); + defaultEncuestaShouldNotBeFound("id.notEquals=" + id); + + defaultEncuestaShouldBeFound("id.greaterThanOrEqual=" + id); + defaultEncuestaShouldNotBeFound("id.greaterThan=" + id); + + defaultEncuestaShouldBeFound("id.lessThanOrEqual=" + id); + defaultEncuestaShouldNotBeFound("id.lessThan=" + id); + } + + @Test + @Transactional + void getAllEncuestasByNombreIsEqualToSomething() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where nombre equals to DEFAULT_NOMBRE + defaultEncuestaShouldBeFound("nombre.equals=" + DEFAULT_NOMBRE); + + // Get all the encuestaList where nombre equals to UPDATED_NOMBRE + defaultEncuestaShouldNotBeFound("nombre.equals=" + UPDATED_NOMBRE); + } + + @Test + @Transactional + void getAllEncuestasByNombreIsNotEqualToSomething() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where nombre not equals to DEFAULT_NOMBRE + defaultEncuestaShouldNotBeFound("nombre.notEquals=" + DEFAULT_NOMBRE); + + // Get all the encuestaList where nombre not equals to UPDATED_NOMBRE + defaultEncuestaShouldBeFound("nombre.notEquals=" + UPDATED_NOMBRE); + } + + @Test + @Transactional + void getAllEncuestasByNombreIsInShouldWork() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where nombre in DEFAULT_NOMBRE or UPDATED_NOMBRE + defaultEncuestaShouldBeFound("nombre.in=" + DEFAULT_NOMBRE + "," + UPDATED_NOMBRE); + + // Get all the encuestaList where nombre equals to UPDATED_NOMBRE + defaultEncuestaShouldNotBeFound("nombre.in=" + UPDATED_NOMBRE); + } + + @Test + @Transactional + void getAllEncuestasByNombreIsNullOrNotNull() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where nombre is not null + defaultEncuestaShouldBeFound("nombre.specified=true"); + + // Get all the encuestaList where nombre is null + defaultEncuestaShouldNotBeFound("nombre.specified=false"); + } + + @Test + @Transactional + void getAllEncuestasByNombreContainsSomething() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where nombre contains DEFAULT_NOMBRE + defaultEncuestaShouldBeFound("nombre.contains=" + DEFAULT_NOMBRE); + + // Get all the encuestaList where nombre contains UPDATED_NOMBRE + defaultEncuestaShouldNotBeFound("nombre.contains=" + UPDATED_NOMBRE); + } + + @Test + @Transactional + void getAllEncuestasByNombreNotContainsSomething() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where nombre does not contain DEFAULT_NOMBRE + defaultEncuestaShouldNotBeFound("nombre.doesNotContain=" + DEFAULT_NOMBRE); + + // Get all the encuestaList where nombre does not contain UPDATED_NOMBRE + defaultEncuestaShouldBeFound("nombre.doesNotContain=" + UPDATED_NOMBRE); + } + + @Test + @Transactional + void getAllEncuestasByDescripcionIsEqualToSomething() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where descripcion equals to DEFAULT_DESCRIPCION + defaultEncuestaShouldBeFound("descripcion.equals=" + DEFAULT_DESCRIPCION); + + // Get all the encuestaList where descripcion equals to UPDATED_DESCRIPCION + defaultEncuestaShouldNotBeFound("descripcion.equals=" + UPDATED_DESCRIPCION); + } + + @Test + @Transactional + void getAllEncuestasByDescripcionIsNotEqualToSomething() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where descripcion not equals to DEFAULT_DESCRIPCION + defaultEncuestaShouldNotBeFound("descripcion.notEquals=" + DEFAULT_DESCRIPCION); + + // Get all the encuestaList where descripcion not equals to UPDATED_DESCRIPCION + defaultEncuestaShouldBeFound("descripcion.notEquals=" + UPDATED_DESCRIPCION); + } + + @Test + @Transactional + void getAllEncuestasByDescripcionIsInShouldWork() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where descripcion in DEFAULT_DESCRIPCION or UPDATED_DESCRIPCION + defaultEncuestaShouldBeFound("descripcion.in=" + DEFAULT_DESCRIPCION + "," + UPDATED_DESCRIPCION); + + // Get all the encuestaList where descripcion equals to UPDATED_DESCRIPCION + defaultEncuestaShouldNotBeFound("descripcion.in=" + UPDATED_DESCRIPCION); + } + + @Test + @Transactional + void getAllEncuestasByDescripcionIsNullOrNotNull() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where descripcion is not null + defaultEncuestaShouldBeFound("descripcion.specified=true"); + + // Get all the encuestaList where descripcion is null + defaultEncuestaShouldNotBeFound("descripcion.specified=false"); + } + + @Test + @Transactional + void getAllEncuestasByDescripcionContainsSomething() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where descripcion contains DEFAULT_DESCRIPCION + defaultEncuestaShouldBeFound("descripcion.contains=" + DEFAULT_DESCRIPCION); + + // Get all the encuestaList where descripcion contains UPDATED_DESCRIPCION + defaultEncuestaShouldNotBeFound("descripcion.contains=" + UPDATED_DESCRIPCION); + } + + @Test + @Transactional + void getAllEncuestasByDescripcionNotContainsSomething() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where descripcion does not contain DEFAULT_DESCRIPCION + defaultEncuestaShouldNotBeFound("descripcion.doesNotContain=" + DEFAULT_DESCRIPCION); + + // Get all the encuestaList where descripcion does not contain UPDATED_DESCRIPCION + defaultEncuestaShouldBeFound("descripcion.doesNotContain=" + UPDATED_DESCRIPCION); + } + + @Test + @Transactional + void getAllEncuestasByFechaCreacionIsEqualToSomething() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where fechaCreacion equals to DEFAULT_FECHA_CREACION + defaultEncuestaShouldBeFound("fechaCreacion.equals=" + DEFAULT_FECHA_CREACION); + + // Get all the encuestaList where fechaCreacion equals to UPDATED_FECHA_CREACION + defaultEncuestaShouldNotBeFound("fechaCreacion.equals=" + UPDATED_FECHA_CREACION); + } + + @Test + @Transactional + void getAllEncuestasByFechaCreacionIsNotEqualToSomething() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where fechaCreacion not equals to DEFAULT_FECHA_CREACION + defaultEncuestaShouldNotBeFound("fechaCreacion.notEquals=" + DEFAULT_FECHA_CREACION); + + // Get all the encuestaList where fechaCreacion not equals to UPDATED_FECHA_CREACION + defaultEncuestaShouldBeFound("fechaCreacion.notEquals=" + UPDATED_FECHA_CREACION); + } + + @Test + @Transactional + void getAllEncuestasByFechaCreacionIsInShouldWork() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where fechaCreacion in DEFAULT_FECHA_CREACION or UPDATED_FECHA_CREACION + defaultEncuestaShouldBeFound("fechaCreacion.in=" + DEFAULT_FECHA_CREACION + "," + UPDATED_FECHA_CREACION); + + // Get all the encuestaList where fechaCreacion equals to UPDATED_FECHA_CREACION + defaultEncuestaShouldNotBeFound("fechaCreacion.in=" + UPDATED_FECHA_CREACION); + } + + @Test + @Transactional + void getAllEncuestasByFechaCreacionIsNullOrNotNull() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where fechaCreacion is not null + defaultEncuestaShouldBeFound("fechaCreacion.specified=true"); + + // Get all the encuestaList where fechaCreacion is null + defaultEncuestaShouldNotBeFound("fechaCreacion.specified=false"); + } + + @Test + @Transactional + void getAllEncuestasByFechaCreacionIsGreaterThanOrEqualToSomething() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where fechaCreacion is greater than or equal to DEFAULT_FECHA_CREACION + defaultEncuestaShouldBeFound("fechaCreacion.greaterThanOrEqual=" + DEFAULT_FECHA_CREACION); + + // Get all the encuestaList where fechaCreacion is greater than or equal to UPDATED_FECHA_CREACION + defaultEncuestaShouldNotBeFound("fechaCreacion.greaterThanOrEqual=" + UPDATED_FECHA_CREACION); + } + + @Test + @Transactional + void getAllEncuestasByFechaCreacionIsLessThanOrEqualToSomething() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where fechaCreacion is less than or equal to DEFAULT_FECHA_CREACION + defaultEncuestaShouldBeFound("fechaCreacion.lessThanOrEqual=" + DEFAULT_FECHA_CREACION); + + // Get all the encuestaList where fechaCreacion is less than or equal to SMALLER_FECHA_CREACION + defaultEncuestaShouldNotBeFound("fechaCreacion.lessThanOrEqual=" + SMALLER_FECHA_CREACION); + } + + @Test + @Transactional + void getAllEncuestasByFechaCreacionIsLessThanSomething() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where fechaCreacion is less than DEFAULT_FECHA_CREACION + defaultEncuestaShouldNotBeFound("fechaCreacion.lessThan=" + DEFAULT_FECHA_CREACION); + + // Get all the encuestaList where fechaCreacion is less than UPDATED_FECHA_CREACION + defaultEncuestaShouldBeFound("fechaCreacion.lessThan=" + UPDATED_FECHA_CREACION); + } + + @Test + @Transactional + void getAllEncuestasByFechaCreacionIsGreaterThanSomething() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where fechaCreacion is greater than DEFAULT_FECHA_CREACION + defaultEncuestaShouldNotBeFound("fechaCreacion.greaterThan=" + DEFAULT_FECHA_CREACION); + + // Get all the encuestaList where fechaCreacion is greater than SMALLER_FECHA_CREACION + defaultEncuestaShouldBeFound("fechaCreacion.greaterThan=" + SMALLER_FECHA_CREACION); + } + + @Test + @Transactional + void getAllEncuestasByFechaPublicacionIsEqualToSomething() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where fechaPublicacion equals to DEFAULT_FECHA_PUBLICACION + defaultEncuestaShouldBeFound("fechaPublicacion.equals=" + DEFAULT_FECHA_PUBLICACION); + + // Get all the encuestaList where fechaPublicacion equals to UPDATED_FECHA_PUBLICACION + defaultEncuestaShouldNotBeFound("fechaPublicacion.equals=" + UPDATED_FECHA_PUBLICACION); + } + + @Test + @Transactional + void getAllEncuestasByFechaPublicacionIsNotEqualToSomething() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where fechaPublicacion not equals to DEFAULT_FECHA_PUBLICACION + defaultEncuestaShouldNotBeFound("fechaPublicacion.notEquals=" + DEFAULT_FECHA_PUBLICACION); + + // Get all the encuestaList where fechaPublicacion not equals to UPDATED_FECHA_PUBLICACION + defaultEncuestaShouldBeFound("fechaPublicacion.notEquals=" + UPDATED_FECHA_PUBLICACION); + } + + @Test + @Transactional + void getAllEncuestasByFechaPublicacionIsInShouldWork() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where fechaPublicacion in DEFAULT_FECHA_PUBLICACION or UPDATED_FECHA_PUBLICACION + defaultEncuestaShouldBeFound("fechaPublicacion.in=" + DEFAULT_FECHA_PUBLICACION + "," + UPDATED_FECHA_PUBLICACION); + + // Get all the encuestaList where fechaPublicacion equals to UPDATED_FECHA_PUBLICACION + defaultEncuestaShouldNotBeFound("fechaPublicacion.in=" + UPDATED_FECHA_PUBLICACION); + } + + @Test + @Transactional + void getAllEncuestasByFechaPublicacionIsNullOrNotNull() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where fechaPublicacion is not null + defaultEncuestaShouldBeFound("fechaPublicacion.specified=true"); + + // Get all the encuestaList where fechaPublicacion is null + defaultEncuestaShouldNotBeFound("fechaPublicacion.specified=false"); + } + + @Test + @Transactional + void getAllEncuestasByFechaPublicacionIsGreaterThanOrEqualToSomething() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where fechaPublicacion is greater than or equal to DEFAULT_FECHA_PUBLICACION + defaultEncuestaShouldBeFound("fechaPublicacion.greaterThanOrEqual=" + DEFAULT_FECHA_PUBLICACION); + + // Get all the encuestaList where fechaPublicacion is greater than or equal to UPDATED_FECHA_PUBLICACION + defaultEncuestaShouldNotBeFound("fechaPublicacion.greaterThanOrEqual=" + UPDATED_FECHA_PUBLICACION); + } + + @Test + @Transactional + void getAllEncuestasByFechaPublicacionIsLessThanOrEqualToSomething() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where fechaPublicacion is less than or equal to DEFAULT_FECHA_PUBLICACION + defaultEncuestaShouldBeFound("fechaPublicacion.lessThanOrEqual=" + DEFAULT_FECHA_PUBLICACION); + + // Get all the encuestaList where fechaPublicacion is less than or equal to SMALLER_FECHA_PUBLICACION + defaultEncuestaShouldNotBeFound("fechaPublicacion.lessThanOrEqual=" + SMALLER_FECHA_PUBLICACION); + } + + @Test + @Transactional + void getAllEncuestasByFechaPublicacionIsLessThanSomething() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where fechaPublicacion is less than DEFAULT_FECHA_PUBLICACION + defaultEncuestaShouldNotBeFound("fechaPublicacion.lessThan=" + DEFAULT_FECHA_PUBLICACION); + + // Get all the encuestaList where fechaPublicacion is less than UPDATED_FECHA_PUBLICACION + defaultEncuestaShouldBeFound("fechaPublicacion.lessThan=" + UPDATED_FECHA_PUBLICACION); + } + + @Test + @Transactional + void getAllEncuestasByFechaPublicacionIsGreaterThanSomething() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where fechaPublicacion is greater than DEFAULT_FECHA_PUBLICACION + defaultEncuestaShouldNotBeFound("fechaPublicacion.greaterThan=" + DEFAULT_FECHA_PUBLICACION); + + // Get all the encuestaList where fechaPublicacion is greater than SMALLER_FECHA_PUBLICACION + defaultEncuestaShouldBeFound("fechaPublicacion.greaterThan=" + SMALLER_FECHA_PUBLICACION); + } + + @Test + @Transactional + void getAllEncuestasByFechaFinalizarIsEqualToSomething() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where fechaFinalizar equals to DEFAULT_FECHA_FINALIZAR + defaultEncuestaShouldBeFound("fechaFinalizar.equals=" + DEFAULT_FECHA_FINALIZAR); + + // Get all the encuestaList where fechaFinalizar equals to UPDATED_FECHA_FINALIZAR + defaultEncuestaShouldNotBeFound("fechaFinalizar.equals=" + UPDATED_FECHA_FINALIZAR); + } + + @Test + @Transactional + void getAllEncuestasByFechaFinalizarIsNotEqualToSomething() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where fechaFinalizar not equals to DEFAULT_FECHA_FINALIZAR + defaultEncuestaShouldNotBeFound("fechaFinalizar.notEquals=" + DEFAULT_FECHA_FINALIZAR); + + // Get all the encuestaList where fechaFinalizar not equals to UPDATED_FECHA_FINALIZAR + defaultEncuestaShouldBeFound("fechaFinalizar.notEquals=" + UPDATED_FECHA_FINALIZAR); + } + + @Test + @Transactional + void getAllEncuestasByFechaFinalizarIsInShouldWork() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where fechaFinalizar in DEFAULT_FECHA_FINALIZAR or UPDATED_FECHA_FINALIZAR + defaultEncuestaShouldBeFound("fechaFinalizar.in=" + DEFAULT_FECHA_FINALIZAR + "," + UPDATED_FECHA_FINALIZAR); + + // Get all the encuestaList where fechaFinalizar equals to UPDATED_FECHA_FINALIZAR + defaultEncuestaShouldNotBeFound("fechaFinalizar.in=" + UPDATED_FECHA_FINALIZAR); + } + + @Test + @Transactional + void getAllEncuestasByFechaFinalizarIsNullOrNotNull() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where fechaFinalizar is not null + defaultEncuestaShouldBeFound("fechaFinalizar.specified=true"); + + // Get all the encuestaList where fechaFinalizar is null + defaultEncuestaShouldNotBeFound("fechaFinalizar.specified=false"); + } + + @Test + @Transactional + void getAllEncuestasByFechaFinalizarIsGreaterThanOrEqualToSomething() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where fechaFinalizar is greater than or equal to DEFAULT_FECHA_FINALIZAR + defaultEncuestaShouldBeFound("fechaFinalizar.greaterThanOrEqual=" + DEFAULT_FECHA_FINALIZAR); + + // Get all the encuestaList where fechaFinalizar is greater than or equal to UPDATED_FECHA_FINALIZAR + defaultEncuestaShouldNotBeFound("fechaFinalizar.greaterThanOrEqual=" + UPDATED_FECHA_FINALIZAR); + } + + @Test + @Transactional + void getAllEncuestasByFechaFinalizarIsLessThanOrEqualToSomething() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where fechaFinalizar is less than or equal to DEFAULT_FECHA_FINALIZAR + defaultEncuestaShouldBeFound("fechaFinalizar.lessThanOrEqual=" + DEFAULT_FECHA_FINALIZAR); + + // Get all the encuestaList where fechaFinalizar is less than or equal to SMALLER_FECHA_FINALIZAR + defaultEncuestaShouldNotBeFound("fechaFinalizar.lessThanOrEqual=" + SMALLER_FECHA_FINALIZAR); + } + + @Test + @Transactional + void getAllEncuestasByFechaFinalizarIsLessThanSomething() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where fechaFinalizar is less than DEFAULT_FECHA_FINALIZAR + defaultEncuestaShouldNotBeFound("fechaFinalizar.lessThan=" + DEFAULT_FECHA_FINALIZAR); + + // Get all the encuestaList where fechaFinalizar is less than UPDATED_FECHA_FINALIZAR + defaultEncuestaShouldBeFound("fechaFinalizar.lessThan=" + UPDATED_FECHA_FINALIZAR); + } + + @Test + @Transactional + void getAllEncuestasByFechaFinalizarIsGreaterThanSomething() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where fechaFinalizar is greater than DEFAULT_FECHA_FINALIZAR + defaultEncuestaShouldNotBeFound("fechaFinalizar.greaterThan=" + DEFAULT_FECHA_FINALIZAR); + + // Get all the encuestaList where fechaFinalizar is greater than SMALLER_FECHA_FINALIZAR + defaultEncuestaShouldBeFound("fechaFinalizar.greaterThan=" + SMALLER_FECHA_FINALIZAR); + } + + @Test + @Transactional + void getAllEncuestasByFechaFinalizadaIsEqualToSomething() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where fechaFinalizada equals to DEFAULT_FECHA_FINALIZADA + defaultEncuestaShouldBeFound("fechaFinalizada.equals=" + DEFAULT_FECHA_FINALIZADA); + + // Get all the encuestaList where fechaFinalizada equals to UPDATED_FECHA_FINALIZADA + defaultEncuestaShouldNotBeFound("fechaFinalizada.equals=" + UPDATED_FECHA_FINALIZADA); + } + + @Test + @Transactional + void getAllEncuestasByFechaFinalizadaIsNotEqualToSomething() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where fechaFinalizada not equals to DEFAULT_FECHA_FINALIZADA + defaultEncuestaShouldNotBeFound("fechaFinalizada.notEquals=" + DEFAULT_FECHA_FINALIZADA); + + // Get all the encuestaList where fechaFinalizada not equals to UPDATED_FECHA_FINALIZADA + defaultEncuestaShouldBeFound("fechaFinalizada.notEquals=" + UPDATED_FECHA_FINALIZADA); + } + + @Test + @Transactional + void getAllEncuestasByFechaFinalizadaIsInShouldWork() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where fechaFinalizada in DEFAULT_FECHA_FINALIZADA or UPDATED_FECHA_FINALIZADA + defaultEncuestaShouldBeFound("fechaFinalizada.in=" + DEFAULT_FECHA_FINALIZADA + "," + UPDATED_FECHA_FINALIZADA); + + // Get all the encuestaList where fechaFinalizada equals to UPDATED_FECHA_FINALIZADA + defaultEncuestaShouldNotBeFound("fechaFinalizada.in=" + UPDATED_FECHA_FINALIZADA); + } + + @Test + @Transactional + void getAllEncuestasByFechaFinalizadaIsNullOrNotNull() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where fechaFinalizada is not null + defaultEncuestaShouldBeFound("fechaFinalizada.specified=true"); + + // Get all the encuestaList where fechaFinalizada is null + defaultEncuestaShouldNotBeFound("fechaFinalizada.specified=false"); + } + + @Test + @Transactional + void getAllEncuestasByFechaFinalizadaIsGreaterThanOrEqualToSomething() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where fechaFinalizada is greater than or equal to DEFAULT_FECHA_FINALIZADA + defaultEncuestaShouldBeFound("fechaFinalizada.greaterThanOrEqual=" + DEFAULT_FECHA_FINALIZADA); + + // Get all the encuestaList where fechaFinalizada is greater than or equal to UPDATED_FECHA_FINALIZADA + defaultEncuestaShouldNotBeFound("fechaFinalizada.greaterThanOrEqual=" + UPDATED_FECHA_FINALIZADA); + } + + @Test + @Transactional + void getAllEncuestasByFechaFinalizadaIsLessThanOrEqualToSomething() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where fechaFinalizada is less than or equal to DEFAULT_FECHA_FINALIZADA + defaultEncuestaShouldBeFound("fechaFinalizada.lessThanOrEqual=" + DEFAULT_FECHA_FINALIZADA); + + // Get all the encuestaList where fechaFinalizada is less than or equal to SMALLER_FECHA_FINALIZADA + defaultEncuestaShouldNotBeFound("fechaFinalizada.lessThanOrEqual=" + SMALLER_FECHA_FINALIZADA); + } + + @Test + @Transactional + void getAllEncuestasByFechaFinalizadaIsLessThanSomething() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where fechaFinalizada is less than DEFAULT_FECHA_FINALIZADA + defaultEncuestaShouldNotBeFound("fechaFinalizada.lessThan=" + DEFAULT_FECHA_FINALIZADA); + + // Get all the encuestaList where fechaFinalizada is less than UPDATED_FECHA_FINALIZADA + defaultEncuestaShouldBeFound("fechaFinalizada.lessThan=" + UPDATED_FECHA_FINALIZADA); + } + + @Test + @Transactional + void getAllEncuestasByFechaFinalizadaIsGreaterThanSomething() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where fechaFinalizada is greater than DEFAULT_FECHA_FINALIZADA + defaultEncuestaShouldNotBeFound("fechaFinalizada.greaterThan=" + DEFAULT_FECHA_FINALIZADA); + + // Get all the encuestaList where fechaFinalizada is greater than SMALLER_FECHA_FINALIZADA + defaultEncuestaShouldBeFound("fechaFinalizada.greaterThan=" + SMALLER_FECHA_FINALIZADA); + } + + @Test + @Transactional + void getAllEncuestasByCalificacionIsEqualToSomething() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where calificacion equals to DEFAULT_CALIFICACION + defaultEncuestaShouldBeFound("calificacion.equals=" + DEFAULT_CALIFICACION); + + // Get all the encuestaList where calificacion equals to UPDATED_CALIFICACION + defaultEncuestaShouldNotBeFound("calificacion.equals=" + UPDATED_CALIFICACION); + } + + @Test + @Transactional + void getAllEncuestasByCalificacionIsNotEqualToSomething() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where calificacion not equals to DEFAULT_CALIFICACION + defaultEncuestaShouldNotBeFound("calificacion.notEquals=" + DEFAULT_CALIFICACION); + + // Get all the encuestaList where calificacion not equals to UPDATED_CALIFICACION + defaultEncuestaShouldBeFound("calificacion.notEquals=" + UPDATED_CALIFICACION); + } + + @Test + @Transactional + void getAllEncuestasByCalificacionIsInShouldWork() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where calificacion in DEFAULT_CALIFICACION or UPDATED_CALIFICACION + defaultEncuestaShouldBeFound("calificacion.in=" + DEFAULT_CALIFICACION + "," + UPDATED_CALIFICACION); + + // Get all the encuestaList where calificacion equals to UPDATED_CALIFICACION + defaultEncuestaShouldNotBeFound("calificacion.in=" + UPDATED_CALIFICACION); + } + + @Test + @Transactional + void getAllEncuestasByCalificacionIsNullOrNotNull() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where calificacion is not null + defaultEncuestaShouldBeFound("calificacion.specified=true"); + + // Get all the encuestaList where calificacion is null + defaultEncuestaShouldNotBeFound("calificacion.specified=false"); + } + + @Test + @Transactional + void getAllEncuestasByCalificacionIsGreaterThanOrEqualToSomething() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where calificacion is greater than or equal to DEFAULT_CALIFICACION + defaultEncuestaShouldBeFound("calificacion.greaterThanOrEqual=" + DEFAULT_CALIFICACION); + + // Get all the encuestaList where calificacion is greater than or equal to UPDATED_CALIFICACION + defaultEncuestaShouldNotBeFound("calificacion.greaterThanOrEqual=" + UPDATED_CALIFICACION); + } + + @Test + @Transactional + void getAllEncuestasByCalificacionIsLessThanOrEqualToSomething() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where calificacion is less than or equal to DEFAULT_CALIFICACION + defaultEncuestaShouldBeFound("calificacion.lessThanOrEqual=" + DEFAULT_CALIFICACION); + + // Get all the encuestaList where calificacion is less than or equal to SMALLER_CALIFICACION + defaultEncuestaShouldNotBeFound("calificacion.lessThanOrEqual=" + SMALLER_CALIFICACION); + } + + @Test + @Transactional + void getAllEncuestasByCalificacionIsLessThanSomething() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where calificacion is less than DEFAULT_CALIFICACION + defaultEncuestaShouldNotBeFound("calificacion.lessThan=" + DEFAULT_CALIFICACION); + + // Get all the encuestaList where calificacion is less than UPDATED_CALIFICACION + defaultEncuestaShouldBeFound("calificacion.lessThan=" + UPDATED_CALIFICACION); + } + + @Test + @Transactional + void getAllEncuestasByCalificacionIsGreaterThanSomething() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where calificacion is greater than DEFAULT_CALIFICACION + defaultEncuestaShouldNotBeFound("calificacion.greaterThan=" + DEFAULT_CALIFICACION); + + // Get all the encuestaList where calificacion is greater than SMALLER_CALIFICACION + defaultEncuestaShouldBeFound("calificacion.greaterThan=" + SMALLER_CALIFICACION); + } + + @Test + @Transactional + void getAllEncuestasByAccesoIsEqualToSomething() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where acceso equals to DEFAULT_ACCESO + defaultEncuestaShouldBeFound("acceso.equals=" + DEFAULT_ACCESO); + + // Get all the encuestaList where acceso equals to UPDATED_ACCESO + defaultEncuestaShouldNotBeFound("acceso.equals=" + UPDATED_ACCESO); + } + + @Test + @Transactional + void getAllEncuestasByAccesoIsNotEqualToSomething() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where acceso not equals to DEFAULT_ACCESO + defaultEncuestaShouldNotBeFound("acceso.notEquals=" + DEFAULT_ACCESO); + + // Get all the encuestaList where acceso not equals to UPDATED_ACCESO + defaultEncuestaShouldBeFound("acceso.notEquals=" + UPDATED_ACCESO); + } + + @Test + @Transactional + void getAllEncuestasByAccesoIsInShouldWork() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where acceso in DEFAULT_ACCESO or UPDATED_ACCESO + defaultEncuestaShouldBeFound("acceso.in=" + DEFAULT_ACCESO + "," + UPDATED_ACCESO); + + // Get all the encuestaList where acceso equals to UPDATED_ACCESO + defaultEncuestaShouldNotBeFound("acceso.in=" + UPDATED_ACCESO); + } + + @Test + @Transactional + void getAllEncuestasByAccesoIsNullOrNotNull() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where acceso is not null + defaultEncuestaShouldBeFound("acceso.specified=true"); + + // Get all the encuestaList where acceso is null + defaultEncuestaShouldNotBeFound("acceso.specified=false"); + } + + @Test + @Transactional + void getAllEncuestasByContrasennaIsEqualToSomething() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where contrasenna equals to DEFAULT_CONTRASENNA + defaultEncuestaShouldBeFound("contrasenna.equals=" + DEFAULT_CONTRASENNA); + + // Get all the encuestaList where contrasenna equals to UPDATED_CONTRASENNA + defaultEncuestaShouldNotBeFound("contrasenna.equals=" + UPDATED_CONTRASENNA); + } + + @Test + @Transactional + void getAllEncuestasByContrasennaIsNotEqualToSomething() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where contrasenna not equals to DEFAULT_CONTRASENNA + defaultEncuestaShouldNotBeFound("contrasenna.notEquals=" + DEFAULT_CONTRASENNA); + + // Get all the encuestaList where contrasenna not equals to UPDATED_CONTRASENNA + defaultEncuestaShouldBeFound("contrasenna.notEquals=" + UPDATED_CONTRASENNA); + } + + @Test + @Transactional + void getAllEncuestasByContrasennaIsInShouldWork() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where contrasenna in DEFAULT_CONTRASENNA or UPDATED_CONTRASENNA + defaultEncuestaShouldBeFound("contrasenna.in=" + DEFAULT_CONTRASENNA + "," + UPDATED_CONTRASENNA); + + // Get all the encuestaList where contrasenna equals to UPDATED_CONTRASENNA + defaultEncuestaShouldNotBeFound("contrasenna.in=" + UPDATED_CONTRASENNA); + } + + @Test + @Transactional + void getAllEncuestasByContrasennaIsNullOrNotNull() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where contrasenna is not null + defaultEncuestaShouldBeFound("contrasenna.specified=true"); + + // Get all the encuestaList where contrasenna is null + defaultEncuestaShouldNotBeFound("contrasenna.specified=false"); + } + + @Test + @Transactional + void getAllEncuestasByContrasennaContainsSomething() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where contrasenna contains DEFAULT_CONTRASENNA + defaultEncuestaShouldBeFound("contrasenna.contains=" + DEFAULT_CONTRASENNA); + + // Get all the encuestaList where contrasenna contains UPDATED_CONTRASENNA + defaultEncuestaShouldNotBeFound("contrasenna.contains=" + UPDATED_CONTRASENNA); + } + + @Test + @Transactional + void getAllEncuestasByContrasennaNotContainsSomething() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where contrasenna does not contain DEFAULT_CONTRASENNA + defaultEncuestaShouldNotBeFound("contrasenna.doesNotContain=" + DEFAULT_CONTRASENNA); + + // Get all the encuestaList where contrasenna does not contain UPDATED_CONTRASENNA + defaultEncuestaShouldBeFound("contrasenna.doesNotContain=" + UPDATED_CONTRASENNA); + } + + @Test + @Transactional + void getAllEncuestasByEstadoIsEqualToSomething() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where estado equals to DEFAULT_ESTADO + defaultEncuestaShouldBeFound("estado.equals=" + DEFAULT_ESTADO); + + // Get all the encuestaList where estado equals to UPDATED_ESTADO + defaultEncuestaShouldNotBeFound("estado.equals=" + UPDATED_ESTADO); + } + + @Test + @Transactional + void getAllEncuestasByEstadoIsNotEqualToSomething() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where estado not equals to DEFAULT_ESTADO + defaultEncuestaShouldNotBeFound("estado.notEquals=" + DEFAULT_ESTADO); + + // Get all the encuestaList where estado not equals to UPDATED_ESTADO + defaultEncuestaShouldBeFound("estado.notEquals=" + UPDATED_ESTADO); + } + + @Test + @Transactional + void getAllEncuestasByEstadoIsInShouldWork() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where estado in DEFAULT_ESTADO or UPDATED_ESTADO + defaultEncuestaShouldBeFound("estado.in=" + DEFAULT_ESTADO + "," + UPDATED_ESTADO); + + // Get all the encuestaList where estado equals to UPDATED_ESTADO + defaultEncuestaShouldNotBeFound("estado.in=" + UPDATED_ESTADO); + } + + @Test + @Transactional + void getAllEncuestasByEstadoIsNullOrNotNull() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + // Get all the encuestaList where estado is not null + defaultEncuestaShouldBeFound("estado.specified=true"); + + // Get all the encuestaList where estado is null + defaultEncuestaShouldNotBeFound("estado.specified=false"); + } + + @Test + @Transactional + void getAllEncuestasByUsuarioEncuestaIsEqualToSomething() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + UsuarioEncuesta usuarioEncuesta = UsuarioEncuestaResourceIT.createEntity(em); + em.persist(usuarioEncuesta); + em.flush(); + encuesta.addUsuarioEncuesta(usuarioEncuesta); + encuestaRepository.saveAndFlush(encuesta); + Long usuarioEncuestaId = usuarioEncuesta.getId(); + + // Get all the encuestaList where usuarioEncuesta equals to usuarioEncuestaId + defaultEncuestaShouldBeFound("usuarioEncuestaId.equals=" + usuarioEncuestaId); + + // Get all the encuestaList where usuarioEncuesta equals to (usuarioEncuestaId + 1) + defaultEncuestaShouldNotBeFound("usuarioEncuestaId.equals=" + (usuarioEncuestaId + 1)); + } + + @Test + @Transactional + void getAllEncuestasByEPreguntaAbiertaIsEqualToSomething() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + EPreguntaAbierta ePreguntaAbierta = EPreguntaAbiertaResourceIT.createEntity(em); + em.persist(ePreguntaAbierta); + em.flush(); + encuesta.addEPreguntaAbierta(ePreguntaAbierta); + encuestaRepository.saveAndFlush(encuesta); + Long ePreguntaAbiertaId = ePreguntaAbierta.getId(); + + // Get all the encuestaList where ePreguntaAbierta equals to ePreguntaAbiertaId + defaultEncuestaShouldBeFound("ePreguntaAbiertaId.equals=" + ePreguntaAbiertaId); + + // Get all the encuestaList where ePreguntaAbierta equals to (ePreguntaAbiertaId + 1) + defaultEncuestaShouldNotBeFound("ePreguntaAbiertaId.equals=" + (ePreguntaAbiertaId + 1)); + } + + @Test + @Transactional + void getAllEncuestasByEPreguntaCerradaIsEqualToSomething() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + EPreguntaCerrada ePreguntaCerrada = EPreguntaCerradaResourceIT.createEntity(em); + em.persist(ePreguntaCerrada); + em.flush(); + encuesta.addEPreguntaCerrada(ePreguntaCerrada); + encuestaRepository.saveAndFlush(encuesta); + Long ePreguntaCerradaId = ePreguntaCerrada.getId(); + + // Get all the encuestaList where ePreguntaCerrada equals to ePreguntaCerradaId + defaultEncuestaShouldBeFound("ePreguntaCerradaId.equals=" + ePreguntaCerradaId); + + // Get all the encuestaList where ePreguntaCerrada equals to (ePreguntaCerradaId + 1) + defaultEncuestaShouldNotBeFound("ePreguntaCerradaId.equals=" + (ePreguntaCerradaId + 1)); + } + + @Test + @Transactional + void getAllEncuestasByCategoriaIsEqualToSomething() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + Categoria categoria = CategoriaResourceIT.createEntity(em); + em.persist(categoria); + em.flush(); + encuesta.setCategoria(categoria); + encuestaRepository.saveAndFlush(encuesta); + Long categoriaId = categoria.getId(); + + // Get all the encuestaList where categoria equals to categoriaId + defaultEncuestaShouldBeFound("categoriaId.equals=" + categoriaId); + + // Get all the encuestaList where categoria equals to (categoriaId + 1) + defaultEncuestaShouldNotBeFound("categoriaId.equals=" + (categoriaId + 1)); + } + + @Test + @Transactional + void getAllEncuestasByUsuarioExtraIsEqualToSomething() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + UsuarioExtra usuarioExtra = UsuarioExtraResourceIT.createEntity(em); + em.persist(usuarioExtra); + em.flush(); + encuesta.setUsuarioExtra(usuarioExtra); + encuestaRepository.saveAndFlush(encuesta); + Long usuarioExtraId = usuarioExtra.getId(); + + // Get all the encuestaList where usuarioExtra equals to usuarioExtraId + defaultEncuestaShouldBeFound("usuarioExtraId.equals=" + usuarioExtraId); + + // Get all the encuestaList where usuarioExtra equals to (usuarioExtraId + 1) + defaultEncuestaShouldNotBeFound("usuarioExtraId.equals=" + (usuarioExtraId + 1)); + } + + /** + * Executes the search, and checks that the default entity is returned. + */ + private void defaultEncuestaShouldBeFound(String filter) throws Exception { + restEncuestaMockMvc + .perform(get(ENTITY_API_URL + "?sort=id,desc&" + filter)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.[*].id").value(hasItem(encuesta.getId().intValue()))) + .andExpect(jsonPath("$.[*].nombre").value(hasItem(DEFAULT_NOMBRE))) + .andExpect(jsonPath("$.[*].descripcion").value(hasItem(DEFAULT_DESCRIPCION))) + .andExpect(jsonPath("$.[*].fechaCreacion").value(hasItem(sameInstant(DEFAULT_FECHA_CREACION)))) + .andExpect(jsonPath("$.[*].fechaPublicacion").value(hasItem(sameInstant(DEFAULT_FECHA_PUBLICACION)))) + .andExpect(jsonPath("$.[*].fechaFinalizar").value(hasItem(sameInstant(DEFAULT_FECHA_FINALIZAR)))) + .andExpect(jsonPath("$.[*].fechaFinalizada").value(hasItem(sameInstant(DEFAULT_FECHA_FINALIZADA)))) + .andExpect(jsonPath("$.[*].calificacion").value(hasItem(DEFAULT_CALIFICACION.doubleValue()))) + .andExpect(jsonPath("$.[*].acceso").value(hasItem(DEFAULT_ACCESO.toString()))) + .andExpect(jsonPath("$.[*].contrasenna").value(hasItem(DEFAULT_CONTRASENNA))) + .andExpect(jsonPath("$.[*].estado").value(hasItem(DEFAULT_ESTADO.toString()))); + + // Check, that the count call also returns 1 + restEncuestaMockMvc + .perform(get(ENTITY_API_URL + "/count?sort=id,desc&" + filter)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(content().string("1")); + } + + /** + * Executes the search, and checks that the default entity is not returned. + */ + private void defaultEncuestaShouldNotBeFound(String filter) throws Exception { + restEncuestaMockMvc + .perform(get(ENTITY_API_URL + "?sort=id,desc&" + filter)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$").isArray()) + .andExpect(jsonPath("$").isEmpty()); + + // Check, that the count call also returns 0 + restEncuestaMockMvc + .perform(get(ENTITY_API_URL + "/count?sort=id,desc&" + filter)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(content().string("0")); + } + + @Test + @Transactional + void getNonExistingEncuesta() throws Exception { + // Get the encuesta + restEncuestaMockMvc.perform(get(ENTITY_API_URL_ID, Long.MAX_VALUE)).andExpect(status().isNotFound()); + } + + @Test + @Transactional + void putNewEncuesta() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + int databaseSizeBeforeUpdate = encuestaRepository.findAll().size(); + + // Update the encuesta + Encuesta updatedEncuesta = encuestaRepository.findById(encuesta.getId()).get(); + // Disconnect from session so that the updates on updatedEncuesta are not directly saved in db + em.detach(updatedEncuesta); + updatedEncuesta + .nombre(UPDATED_NOMBRE) + .descripcion(UPDATED_DESCRIPCION) + .fechaCreacion(UPDATED_FECHA_CREACION) + .fechaPublicacion(UPDATED_FECHA_PUBLICACION) + .fechaFinalizar(UPDATED_FECHA_FINALIZAR) + .fechaFinalizada(UPDATED_FECHA_FINALIZADA) + .calificacion(UPDATED_CALIFICACION) + .acceso(UPDATED_ACCESO) + .contrasenna(UPDATED_CONTRASENNA) + .estado(UPDATED_ESTADO); + + restEncuestaMockMvc + .perform( + put(ENTITY_API_URL_ID, updatedEncuesta.getId()) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(updatedEncuesta)) + ) + .andExpect(status().isOk()); + + // Validate the Encuesta in the database + List encuestaList = encuestaRepository.findAll(); + assertThat(encuestaList).hasSize(databaseSizeBeforeUpdate); + Encuesta testEncuesta = encuestaList.get(encuestaList.size() - 1); + assertThat(testEncuesta.getNombre()).isEqualTo(UPDATED_NOMBRE); + assertThat(testEncuesta.getDescripcion()).isEqualTo(UPDATED_DESCRIPCION); + assertThat(testEncuesta.getFechaCreacion()).isEqualTo(UPDATED_FECHA_CREACION); + assertThat(testEncuesta.getFechaPublicacion()).isEqualTo(UPDATED_FECHA_PUBLICACION); + assertThat(testEncuesta.getFechaFinalizar()).isEqualTo(UPDATED_FECHA_FINALIZAR); + assertThat(testEncuesta.getFechaFinalizada()).isEqualTo(UPDATED_FECHA_FINALIZADA); + assertThat(testEncuesta.getCalificacion()).isEqualTo(UPDATED_CALIFICACION); + assertThat(testEncuesta.getAcceso()).isEqualTo(UPDATED_ACCESO); + assertThat(testEncuesta.getContrasenna()).isEqualTo(UPDATED_CONTRASENNA); + assertThat(testEncuesta.getEstado()).isEqualTo(UPDATED_ESTADO); + } + + @Test + @Transactional + void putNonExistingEncuesta() throws Exception { + int databaseSizeBeforeUpdate = encuestaRepository.findAll().size(); + encuesta.setId(count.incrementAndGet()); + + // If the entity doesn't have an ID, it will throw BadRequestAlertException + restEncuestaMockMvc + .perform( + put(ENTITY_API_URL_ID, encuesta.getId()) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(encuesta)) + ) + .andExpect(status().isBadRequest()); + + // Validate the Encuesta in the database + List encuestaList = encuestaRepository.findAll(); + assertThat(encuestaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void putWithIdMismatchEncuesta() throws Exception { + int databaseSizeBeforeUpdate = encuestaRepository.findAll().size(); + encuesta.setId(count.incrementAndGet()); + + // If url ID doesn't match entity ID, it will throw BadRequestAlertException + restEncuestaMockMvc + .perform( + put(ENTITY_API_URL_ID, count.incrementAndGet()) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(encuesta)) + ) + .andExpect(status().isBadRequest()); + + // Validate the Encuesta in the database + List encuestaList = encuestaRepository.findAll(); + assertThat(encuestaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void putWithMissingIdPathParamEncuesta() throws Exception { + int databaseSizeBeforeUpdate = encuestaRepository.findAll().size(); + encuesta.setId(count.incrementAndGet()); + + // If url ID doesn't match entity ID, it will throw BadRequestAlertException + restEncuestaMockMvc + .perform(put(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(encuesta))) + .andExpect(status().isMethodNotAllowed()); + + // Validate the Encuesta in the database + List encuestaList = encuestaRepository.findAll(); + assertThat(encuestaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void partialUpdateEncuestaWithPatch() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + int databaseSizeBeforeUpdate = encuestaRepository.findAll().size(); + + // Update the encuesta using partial update + Encuesta partialUpdatedEncuesta = new Encuesta(); + partialUpdatedEncuesta.setId(encuesta.getId()); + + partialUpdatedEncuesta + .fechaPublicacion(UPDATED_FECHA_PUBLICACION) + .fechaFinalizar(UPDATED_FECHA_FINALIZAR) + .fechaFinalizada(UPDATED_FECHA_FINALIZADA); + + restEncuestaMockMvc + .perform( + patch(ENTITY_API_URL_ID, partialUpdatedEncuesta.getId()) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(partialUpdatedEncuesta)) + ) + .andExpect(status().isOk()); + + // Validate the Encuesta in the database + List encuestaList = encuestaRepository.findAll(); + assertThat(encuestaList).hasSize(databaseSizeBeforeUpdate); + Encuesta testEncuesta = encuestaList.get(encuestaList.size() - 1); + assertThat(testEncuesta.getNombre()).isEqualTo(DEFAULT_NOMBRE); + assertThat(testEncuesta.getDescripcion()).isEqualTo(DEFAULT_DESCRIPCION); + assertThat(testEncuesta.getFechaCreacion()).isEqualTo(DEFAULT_FECHA_CREACION); + assertThat(testEncuesta.getFechaPublicacion()).isEqualTo(UPDATED_FECHA_PUBLICACION); + assertThat(testEncuesta.getFechaFinalizar()).isEqualTo(UPDATED_FECHA_FINALIZAR); + assertThat(testEncuesta.getFechaFinalizada()).isEqualTo(UPDATED_FECHA_FINALIZADA); + assertThat(testEncuesta.getCalificacion()).isEqualTo(DEFAULT_CALIFICACION); + assertThat(testEncuesta.getAcceso()).isEqualTo(DEFAULT_ACCESO); + assertThat(testEncuesta.getContrasenna()).isEqualTo(DEFAULT_CONTRASENNA); + assertThat(testEncuesta.getEstado()).isEqualTo(DEFAULT_ESTADO); + } + + @Test + @Transactional + void fullUpdateEncuestaWithPatch() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + int databaseSizeBeforeUpdate = encuestaRepository.findAll().size(); + + // Update the encuesta using partial update + Encuesta partialUpdatedEncuesta = new Encuesta(); + partialUpdatedEncuesta.setId(encuesta.getId()); + + partialUpdatedEncuesta + .nombre(UPDATED_NOMBRE) + .descripcion(UPDATED_DESCRIPCION) + .fechaCreacion(UPDATED_FECHA_CREACION) + .fechaPublicacion(UPDATED_FECHA_PUBLICACION) + .fechaFinalizar(UPDATED_FECHA_FINALIZAR) + .fechaFinalizada(UPDATED_FECHA_FINALIZADA) + .calificacion(UPDATED_CALIFICACION) + .acceso(UPDATED_ACCESO) + .contrasenna(UPDATED_CONTRASENNA) + .estado(UPDATED_ESTADO); + + restEncuestaMockMvc + .perform( + patch(ENTITY_API_URL_ID, partialUpdatedEncuesta.getId()) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(partialUpdatedEncuesta)) + ) + .andExpect(status().isOk()); + + // Validate the Encuesta in the database + List encuestaList = encuestaRepository.findAll(); + assertThat(encuestaList).hasSize(databaseSizeBeforeUpdate); + Encuesta testEncuesta = encuestaList.get(encuestaList.size() - 1); + assertThat(testEncuesta.getNombre()).isEqualTo(UPDATED_NOMBRE); + assertThat(testEncuesta.getDescripcion()).isEqualTo(UPDATED_DESCRIPCION); + assertThat(testEncuesta.getFechaCreacion()).isEqualTo(UPDATED_FECHA_CREACION); + assertThat(testEncuesta.getFechaPublicacion()).isEqualTo(UPDATED_FECHA_PUBLICACION); + assertThat(testEncuesta.getFechaFinalizar()).isEqualTo(UPDATED_FECHA_FINALIZAR); + assertThat(testEncuesta.getFechaFinalizada()).isEqualTo(UPDATED_FECHA_FINALIZADA); + assertThat(testEncuesta.getCalificacion()).isEqualTo(UPDATED_CALIFICACION); + assertThat(testEncuesta.getAcceso()).isEqualTo(UPDATED_ACCESO); + assertThat(testEncuesta.getContrasenna()).isEqualTo(UPDATED_CONTRASENNA); + assertThat(testEncuesta.getEstado()).isEqualTo(UPDATED_ESTADO); + } + + @Test + @Transactional + void patchNonExistingEncuesta() throws Exception { + int databaseSizeBeforeUpdate = encuestaRepository.findAll().size(); + encuesta.setId(count.incrementAndGet()); + + // If the entity doesn't have an ID, it will throw BadRequestAlertException + restEncuestaMockMvc + .perform( + patch(ENTITY_API_URL_ID, encuesta.getId()) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(encuesta)) + ) + .andExpect(status().isBadRequest()); + + // Validate the Encuesta in the database + List encuestaList = encuestaRepository.findAll(); + assertThat(encuestaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void patchWithIdMismatchEncuesta() throws Exception { + int databaseSizeBeforeUpdate = encuestaRepository.findAll().size(); + encuesta.setId(count.incrementAndGet()); + + // If url ID doesn't match entity ID, it will throw BadRequestAlertException + restEncuestaMockMvc + .perform( + patch(ENTITY_API_URL_ID, count.incrementAndGet()) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(encuesta)) + ) + .andExpect(status().isBadRequest()); + + // Validate the Encuesta in the database + List encuestaList = encuestaRepository.findAll(); + assertThat(encuestaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void patchWithMissingIdPathParamEncuesta() throws Exception { + int databaseSizeBeforeUpdate = encuestaRepository.findAll().size(); + encuesta.setId(count.incrementAndGet()); + + // If url ID doesn't match entity ID, it will throw BadRequestAlertException + restEncuestaMockMvc + .perform(patch(ENTITY_API_URL).contentType("application/merge-patch+json").content(TestUtil.convertObjectToJsonBytes(encuesta))) + .andExpect(status().isMethodNotAllowed()); + + // Validate the Encuesta in the database + List encuestaList = encuestaRepository.findAll(); + assertThat(encuestaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void deleteEncuesta() throws Exception { + // Initialize the database + encuestaRepository.saveAndFlush(encuesta); + + int databaseSizeBeforeDelete = encuestaRepository.findAll().size(); + + // Delete the encuesta + restEncuestaMockMvc + .perform(delete(ENTITY_API_URL_ID, encuesta.getId()).accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isNoContent()); + + // Validate the database contains one less item + List encuestaList = encuestaRepository.findAll(); + assertThat(encuestaList).hasSize(databaseSizeBeforeDelete - 1); + } +} diff --git a/src/test/java/org/datasurvey/web/rest/FacturaResourceIT.java b/src/test/java/org/datasurvey/web/rest/FacturaResourceIT.java new file mode 100644 index 0000000..d7538fe --- /dev/null +++ b/src/test/java/org/datasurvey/web/rest/FacturaResourceIT.java @@ -0,0 +1,908 @@ +package org.datasurvey.web.rest; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.datasurvey.web.rest.TestUtil.sameInstant; +import static org.hamcrest.Matchers.hasItem; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +import java.time.Instant; +import java.time.ZoneId; +import java.time.ZoneOffset; +import java.time.ZonedDateTime; +import java.util.List; +import java.util.Random; +import java.util.concurrent.atomic.AtomicLong; +import javax.persistence.EntityManager; +import org.datasurvey.IntegrationTest; +import org.datasurvey.domain.Factura; +import org.datasurvey.repository.FacturaRepository; +import org.datasurvey.service.criteria.FacturaCriteria; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.http.MediaType; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.transaction.annotation.Transactional; + +/** + * Integration tests for the {@link FacturaResource} REST controller. + */ +@IntegrationTest +@AutoConfigureMockMvc +@WithMockUser +class FacturaResourceIT { + + private static final String DEFAULT_NOMBRE_USUARIO = "AAAAAAAAAA"; + private static final String UPDATED_NOMBRE_USUARIO = "BBBBBBBBBB"; + + private static final String DEFAULT_NOMBRE_PLANTILLA = "AAAAAAAAAA"; + private static final String UPDATED_NOMBRE_PLANTILLA = "BBBBBBBBBB"; + + private static final Double DEFAULT_COSTO = 1D; + private static final Double UPDATED_COSTO = 2D; + private static final Double SMALLER_COSTO = 1D - 1D; + + private static final ZonedDateTime DEFAULT_FECHA = ZonedDateTime.ofInstant(Instant.ofEpochMilli(0L), ZoneOffset.UTC); + private static final ZonedDateTime UPDATED_FECHA = ZonedDateTime.now(ZoneId.systemDefault()).withNano(0); + private static final ZonedDateTime SMALLER_FECHA = ZonedDateTime.ofInstant(Instant.ofEpochMilli(-1L), ZoneOffset.UTC); + + private static final String ENTITY_API_URL = "/api/facturas"; + private static final String ENTITY_API_URL_ID = ENTITY_API_URL + "/{id}"; + + private static Random random = new Random(); + private static AtomicLong count = new AtomicLong(random.nextInt() + (2 * Integer.MAX_VALUE)); + + @Autowired + private FacturaRepository facturaRepository; + + @Autowired + private EntityManager em; + + @Autowired + private MockMvc restFacturaMockMvc; + + private Factura factura; + + /** + * Create an entity for this test. + * + * This is a static method, as tests for other entities might also need it, + * if they test an entity which requires the current entity. + */ + public static Factura createEntity(EntityManager em) { + Factura factura = new Factura() + .nombreUsuario(DEFAULT_NOMBRE_USUARIO) + .nombrePlantilla(DEFAULT_NOMBRE_PLANTILLA) + .costo(DEFAULT_COSTO) + .fecha(DEFAULT_FECHA); + return factura; + } + + /** + * Create an updated entity for this test. + * + * This is a static method, as tests for other entities might also need it, + * if they test an entity which requires the current entity. + */ + public static Factura createUpdatedEntity(EntityManager em) { + Factura factura = new Factura() + .nombreUsuario(UPDATED_NOMBRE_USUARIO) + .nombrePlantilla(UPDATED_NOMBRE_PLANTILLA) + .costo(UPDATED_COSTO) + .fecha(UPDATED_FECHA); + return factura; + } + + @BeforeEach + public void initTest() { + factura = createEntity(em); + } + + @Test + @Transactional + void createFactura() throws Exception { + int databaseSizeBeforeCreate = facturaRepository.findAll().size(); + // Create the Factura + restFacturaMockMvc + .perform(post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(factura))) + .andExpect(status().isCreated()); + + // Validate the Factura in the database + List facturaList = facturaRepository.findAll(); + assertThat(facturaList).hasSize(databaseSizeBeforeCreate + 1); + Factura testFactura = facturaList.get(facturaList.size() - 1); + assertThat(testFactura.getNombreUsuario()).isEqualTo(DEFAULT_NOMBRE_USUARIO); + assertThat(testFactura.getNombrePlantilla()).isEqualTo(DEFAULT_NOMBRE_PLANTILLA); + assertThat(testFactura.getCosto()).isEqualTo(DEFAULT_COSTO); + assertThat(testFactura.getFecha()).isEqualTo(DEFAULT_FECHA); + } + + @Test + @Transactional + void createFacturaWithExistingId() throws Exception { + // Create the Factura with an existing ID + factura.setId(1L); + + int databaseSizeBeforeCreate = facturaRepository.findAll().size(); + + // An entity with an existing ID cannot be created, so this API call must fail + restFacturaMockMvc + .perform(post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(factura))) + .andExpect(status().isBadRequest()); + + // Validate the Factura in the database + List facturaList = facturaRepository.findAll(); + assertThat(facturaList).hasSize(databaseSizeBeforeCreate); + } + + @Test + @Transactional + void checkNombreUsuarioIsRequired() throws Exception { + int databaseSizeBeforeTest = facturaRepository.findAll().size(); + // set the field null + factura.setNombreUsuario(null); + + // Create the Factura, which fails. + + restFacturaMockMvc + .perform(post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(factura))) + .andExpect(status().isBadRequest()); + + List facturaList = facturaRepository.findAll(); + assertThat(facturaList).hasSize(databaseSizeBeforeTest); + } + + @Test + @Transactional + void checkNombrePlantillaIsRequired() throws Exception { + int databaseSizeBeforeTest = facturaRepository.findAll().size(); + // set the field null + factura.setNombrePlantilla(null); + + // Create the Factura, which fails. + + restFacturaMockMvc + .perform(post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(factura))) + .andExpect(status().isBadRequest()); + + List facturaList = facturaRepository.findAll(); + assertThat(facturaList).hasSize(databaseSizeBeforeTest); + } + + @Test + @Transactional + void checkCostoIsRequired() throws Exception { + int databaseSizeBeforeTest = facturaRepository.findAll().size(); + // set the field null + factura.setCosto(null); + + // Create the Factura, which fails. + + restFacturaMockMvc + .perform(post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(factura))) + .andExpect(status().isBadRequest()); + + List facturaList = facturaRepository.findAll(); + assertThat(facturaList).hasSize(databaseSizeBeforeTest); + } + + @Test + @Transactional + void checkFechaIsRequired() throws Exception { + int databaseSizeBeforeTest = facturaRepository.findAll().size(); + // set the field null + factura.setFecha(null); + + // Create the Factura, which fails. + + restFacturaMockMvc + .perform(post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(factura))) + .andExpect(status().isBadRequest()); + + List facturaList = facturaRepository.findAll(); + assertThat(facturaList).hasSize(databaseSizeBeforeTest); + } + + @Test + @Transactional + void getAllFacturas() throws Exception { + // Initialize the database + facturaRepository.saveAndFlush(factura); + + // Get all the facturaList + restFacturaMockMvc + .perform(get(ENTITY_API_URL + "?sort=id,desc")) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.[*].id").value(hasItem(factura.getId().intValue()))) + .andExpect(jsonPath("$.[*].nombreUsuario").value(hasItem(DEFAULT_NOMBRE_USUARIO))) + .andExpect(jsonPath("$.[*].nombrePlantilla").value(hasItem(DEFAULT_NOMBRE_PLANTILLA))) + .andExpect(jsonPath("$.[*].costo").value(hasItem(DEFAULT_COSTO.doubleValue()))) + .andExpect(jsonPath("$.[*].fecha").value(hasItem(sameInstant(DEFAULT_FECHA)))); + } + + @Test + @Transactional + void getFactura() throws Exception { + // Initialize the database + facturaRepository.saveAndFlush(factura); + + // Get the factura + restFacturaMockMvc + .perform(get(ENTITY_API_URL_ID, factura.getId())) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.id").value(factura.getId().intValue())) + .andExpect(jsonPath("$.nombreUsuario").value(DEFAULT_NOMBRE_USUARIO)) + .andExpect(jsonPath("$.nombrePlantilla").value(DEFAULT_NOMBRE_PLANTILLA)) + .andExpect(jsonPath("$.costo").value(DEFAULT_COSTO.doubleValue())) + .andExpect(jsonPath("$.fecha").value(sameInstant(DEFAULT_FECHA))); + } + + @Test + @Transactional + void getFacturasByIdFiltering() throws Exception { + // Initialize the database + facturaRepository.saveAndFlush(factura); + + Long id = factura.getId(); + + defaultFacturaShouldBeFound("id.equals=" + id); + defaultFacturaShouldNotBeFound("id.notEquals=" + id); + + defaultFacturaShouldBeFound("id.greaterThanOrEqual=" + id); + defaultFacturaShouldNotBeFound("id.greaterThan=" + id); + + defaultFacturaShouldBeFound("id.lessThanOrEqual=" + id); + defaultFacturaShouldNotBeFound("id.lessThan=" + id); + } + + @Test + @Transactional + void getAllFacturasByNombreUsuarioIsEqualToSomething() throws Exception { + // Initialize the database + facturaRepository.saveAndFlush(factura); + + // Get all the facturaList where nombreUsuario equals to DEFAULT_NOMBRE_USUARIO + defaultFacturaShouldBeFound("nombreUsuario.equals=" + DEFAULT_NOMBRE_USUARIO); + + // Get all the facturaList where nombreUsuario equals to UPDATED_NOMBRE_USUARIO + defaultFacturaShouldNotBeFound("nombreUsuario.equals=" + UPDATED_NOMBRE_USUARIO); + } + + @Test + @Transactional + void getAllFacturasByNombreUsuarioIsNotEqualToSomething() throws Exception { + // Initialize the database + facturaRepository.saveAndFlush(factura); + + // Get all the facturaList where nombreUsuario not equals to DEFAULT_NOMBRE_USUARIO + defaultFacturaShouldNotBeFound("nombreUsuario.notEquals=" + DEFAULT_NOMBRE_USUARIO); + + // Get all the facturaList where nombreUsuario not equals to UPDATED_NOMBRE_USUARIO + defaultFacturaShouldBeFound("nombreUsuario.notEquals=" + UPDATED_NOMBRE_USUARIO); + } + + @Test + @Transactional + void getAllFacturasByNombreUsuarioIsInShouldWork() throws Exception { + // Initialize the database + facturaRepository.saveAndFlush(factura); + + // Get all the facturaList where nombreUsuario in DEFAULT_NOMBRE_USUARIO or UPDATED_NOMBRE_USUARIO + defaultFacturaShouldBeFound("nombreUsuario.in=" + DEFAULT_NOMBRE_USUARIO + "," + UPDATED_NOMBRE_USUARIO); + + // Get all the facturaList where nombreUsuario equals to UPDATED_NOMBRE_USUARIO + defaultFacturaShouldNotBeFound("nombreUsuario.in=" + UPDATED_NOMBRE_USUARIO); + } + + @Test + @Transactional + void getAllFacturasByNombreUsuarioIsNullOrNotNull() throws Exception { + // Initialize the database + facturaRepository.saveAndFlush(factura); + + // Get all the facturaList where nombreUsuario is not null + defaultFacturaShouldBeFound("nombreUsuario.specified=true"); + + // Get all the facturaList where nombreUsuario is null + defaultFacturaShouldNotBeFound("nombreUsuario.specified=false"); + } + + @Test + @Transactional + void getAllFacturasByNombreUsuarioContainsSomething() throws Exception { + // Initialize the database + facturaRepository.saveAndFlush(factura); + + // Get all the facturaList where nombreUsuario contains DEFAULT_NOMBRE_USUARIO + defaultFacturaShouldBeFound("nombreUsuario.contains=" + DEFAULT_NOMBRE_USUARIO); + + // Get all the facturaList where nombreUsuario contains UPDATED_NOMBRE_USUARIO + defaultFacturaShouldNotBeFound("nombreUsuario.contains=" + UPDATED_NOMBRE_USUARIO); + } + + @Test + @Transactional + void getAllFacturasByNombreUsuarioNotContainsSomething() throws Exception { + // Initialize the database + facturaRepository.saveAndFlush(factura); + + // Get all the facturaList where nombreUsuario does not contain DEFAULT_NOMBRE_USUARIO + defaultFacturaShouldNotBeFound("nombreUsuario.doesNotContain=" + DEFAULT_NOMBRE_USUARIO); + + // Get all the facturaList where nombreUsuario does not contain UPDATED_NOMBRE_USUARIO + defaultFacturaShouldBeFound("nombreUsuario.doesNotContain=" + UPDATED_NOMBRE_USUARIO); + } + + @Test + @Transactional + void getAllFacturasByNombrePlantillaIsEqualToSomething() throws Exception { + // Initialize the database + facturaRepository.saveAndFlush(factura); + + // Get all the facturaList where nombrePlantilla equals to DEFAULT_NOMBRE_PLANTILLA + defaultFacturaShouldBeFound("nombrePlantilla.equals=" + DEFAULT_NOMBRE_PLANTILLA); + + // Get all the facturaList where nombrePlantilla equals to UPDATED_NOMBRE_PLANTILLA + defaultFacturaShouldNotBeFound("nombrePlantilla.equals=" + UPDATED_NOMBRE_PLANTILLA); + } + + @Test + @Transactional + void getAllFacturasByNombrePlantillaIsNotEqualToSomething() throws Exception { + // Initialize the database + facturaRepository.saveAndFlush(factura); + + // Get all the facturaList where nombrePlantilla not equals to DEFAULT_NOMBRE_PLANTILLA + defaultFacturaShouldNotBeFound("nombrePlantilla.notEquals=" + DEFAULT_NOMBRE_PLANTILLA); + + // Get all the facturaList where nombrePlantilla not equals to UPDATED_NOMBRE_PLANTILLA + defaultFacturaShouldBeFound("nombrePlantilla.notEquals=" + UPDATED_NOMBRE_PLANTILLA); + } + + @Test + @Transactional + void getAllFacturasByNombrePlantillaIsInShouldWork() throws Exception { + // Initialize the database + facturaRepository.saveAndFlush(factura); + + // Get all the facturaList where nombrePlantilla in DEFAULT_NOMBRE_PLANTILLA or UPDATED_NOMBRE_PLANTILLA + defaultFacturaShouldBeFound("nombrePlantilla.in=" + DEFAULT_NOMBRE_PLANTILLA + "," + UPDATED_NOMBRE_PLANTILLA); + + // Get all the facturaList where nombrePlantilla equals to UPDATED_NOMBRE_PLANTILLA + defaultFacturaShouldNotBeFound("nombrePlantilla.in=" + UPDATED_NOMBRE_PLANTILLA); + } + + @Test + @Transactional + void getAllFacturasByNombrePlantillaIsNullOrNotNull() throws Exception { + // Initialize the database + facturaRepository.saveAndFlush(factura); + + // Get all the facturaList where nombrePlantilla is not null + defaultFacturaShouldBeFound("nombrePlantilla.specified=true"); + + // Get all the facturaList where nombrePlantilla is null + defaultFacturaShouldNotBeFound("nombrePlantilla.specified=false"); + } + + @Test + @Transactional + void getAllFacturasByNombrePlantillaContainsSomething() throws Exception { + // Initialize the database + facturaRepository.saveAndFlush(factura); + + // Get all the facturaList where nombrePlantilla contains DEFAULT_NOMBRE_PLANTILLA + defaultFacturaShouldBeFound("nombrePlantilla.contains=" + DEFAULT_NOMBRE_PLANTILLA); + + // Get all the facturaList where nombrePlantilla contains UPDATED_NOMBRE_PLANTILLA + defaultFacturaShouldNotBeFound("nombrePlantilla.contains=" + UPDATED_NOMBRE_PLANTILLA); + } + + @Test + @Transactional + void getAllFacturasByNombrePlantillaNotContainsSomething() throws Exception { + // Initialize the database + facturaRepository.saveAndFlush(factura); + + // Get all the facturaList where nombrePlantilla does not contain DEFAULT_NOMBRE_PLANTILLA + defaultFacturaShouldNotBeFound("nombrePlantilla.doesNotContain=" + DEFAULT_NOMBRE_PLANTILLA); + + // Get all the facturaList where nombrePlantilla does not contain UPDATED_NOMBRE_PLANTILLA + defaultFacturaShouldBeFound("nombrePlantilla.doesNotContain=" + UPDATED_NOMBRE_PLANTILLA); + } + + @Test + @Transactional + void getAllFacturasByCostoIsEqualToSomething() throws Exception { + // Initialize the database + facturaRepository.saveAndFlush(factura); + + // Get all the facturaList where costo equals to DEFAULT_COSTO + defaultFacturaShouldBeFound("costo.equals=" + DEFAULT_COSTO); + + // Get all the facturaList where costo equals to UPDATED_COSTO + defaultFacturaShouldNotBeFound("costo.equals=" + UPDATED_COSTO); + } + + @Test + @Transactional + void getAllFacturasByCostoIsNotEqualToSomething() throws Exception { + // Initialize the database + facturaRepository.saveAndFlush(factura); + + // Get all the facturaList where costo not equals to DEFAULT_COSTO + defaultFacturaShouldNotBeFound("costo.notEquals=" + DEFAULT_COSTO); + + // Get all the facturaList where costo not equals to UPDATED_COSTO + defaultFacturaShouldBeFound("costo.notEquals=" + UPDATED_COSTO); + } + + @Test + @Transactional + void getAllFacturasByCostoIsInShouldWork() throws Exception { + // Initialize the database + facturaRepository.saveAndFlush(factura); + + // Get all the facturaList where costo in DEFAULT_COSTO or UPDATED_COSTO + defaultFacturaShouldBeFound("costo.in=" + DEFAULT_COSTO + "," + UPDATED_COSTO); + + // Get all the facturaList where costo equals to UPDATED_COSTO + defaultFacturaShouldNotBeFound("costo.in=" + UPDATED_COSTO); + } + + @Test + @Transactional + void getAllFacturasByCostoIsNullOrNotNull() throws Exception { + // Initialize the database + facturaRepository.saveAndFlush(factura); + + // Get all the facturaList where costo is not null + defaultFacturaShouldBeFound("costo.specified=true"); + + // Get all the facturaList where costo is null + defaultFacturaShouldNotBeFound("costo.specified=false"); + } + + @Test + @Transactional + void getAllFacturasByCostoIsGreaterThanOrEqualToSomething() throws Exception { + // Initialize the database + facturaRepository.saveAndFlush(factura); + + // Get all the facturaList where costo is greater than or equal to DEFAULT_COSTO + defaultFacturaShouldBeFound("costo.greaterThanOrEqual=" + DEFAULT_COSTO); + + // Get all the facturaList where costo is greater than or equal to UPDATED_COSTO + defaultFacturaShouldNotBeFound("costo.greaterThanOrEqual=" + UPDATED_COSTO); + } + + @Test + @Transactional + void getAllFacturasByCostoIsLessThanOrEqualToSomething() throws Exception { + // Initialize the database + facturaRepository.saveAndFlush(factura); + + // Get all the facturaList where costo is less than or equal to DEFAULT_COSTO + defaultFacturaShouldBeFound("costo.lessThanOrEqual=" + DEFAULT_COSTO); + + // Get all the facturaList where costo is less than or equal to SMALLER_COSTO + defaultFacturaShouldNotBeFound("costo.lessThanOrEqual=" + SMALLER_COSTO); + } + + @Test + @Transactional + void getAllFacturasByCostoIsLessThanSomething() throws Exception { + // Initialize the database + facturaRepository.saveAndFlush(factura); + + // Get all the facturaList where costo is less than DEFAULT_COSTO + defaultFacturaShouldNotBeFound("costo.lessThan=" + DEFAULT_COSTO); + + // Get all the facturaList where costo is less than UPDATED_COSTO + defaultFacturaShouldBeFound("costo.lessThan=" + UPDATED_COSTO); + } + + @Test + @Transactional + void getAllFacturasByCostoIsGreaterThanSomething() throws Exception { + // Initialize the database + facturaRepository.saveAndFlush(factura); + + // Get all the facturaList where costo is greater than DEFAULT_COSTO + defaultFacturaShouldNotBeFound("costo.greaterThan=" + DEFAULT_COSTO); + + // Get all the facturaList where costo is greater than SMALLER_COSTO + defaultFacturaShouldBeFound("costo.greaterThan=" + SMALLER_COSTO); + } + + @Test + @Transactional + void getAllFacturasByFechaIsEqualToSomething() throws Exception { + // Initialize the database + facturaRepository.saveAndFlush(factura); + + // Get all the facturaList where fecha equals to DEFAULT_FECHA + defaultFacturaShouldBeFound("fecha.equals=" + DEFAULT_FECHA); + + // Get all the facturaList where fecha equals to UPDATED_FECHA + defaultFacturaShouldNotBeFound("fecha.equals=" + UPDATED_FECHA); + } + + @Test + @Transactional + void getAllFacturasByFechaIsNotEqualToSomething() throws Exception { + // Initialize the database + facturaRepository.saveAndFlush(factura); + + // Get all the facturaList where fecha not equals to DEFAULT_FECHA + defaultFacturaShouldNotBeFound("fecha.notEquals=" + DEFAULT_FECHA); + + // Get all the facturaList where fecha not equals to UPDATED_FECHA + defaultFacturaShouldBeFound("fecha.notEquals=" + UPDATED_FECHA); + } + + @Test + @Transactional + void getAllFacturasByFechaIsInShouldWork() throws Exception { + // Initialize the database + facturaRepository.saveAndFlush(factura); + + // Get all the facturaList where fecha in DEFAULT_FECHA or UPDATED_FECHA + defaultFacturaShouldBeFound("fecha.in=" + DEFAULT_FECHA + "," + UPDATED_FECHA); + + // Get all the facturaList where fecha equals to UPDATED_FECHA + defaultFacturaShouldNotBeFound("fecha.in=" + UPDATED_FECHA); + } + + @Test + @Transactional + void getAllFacturasByFechaIsNullOrNotNull() throws Exception { + // Initialize the database + facturaRepository.saveAndFlush(factura); + + // Get all the facturaList where fecha is not null + defaultFacturaShouldBeFound("fecha.specified=true"); + + // Get all the facturaList where fecha is null + defaultFacturaShouldNotBeFound("fecha.specified=false"); + } + + @Test + @Transactional + void getAllFacturasByFechaIsGreaterThanOrEqualToSomething() throws Exception { + // Initialize the database + facturaRepository.saveAndFlush(factura); + + // Get all the facturaList where fecha is greater than or equal to DEFAULT_FECHA + defaultFacturaShouldBeFound("fecha.greaterThanOrEqual=" + DEFAULT_FECHA); + + // Get all the facturaList where fecha is greater than or equal to UPDATED_FECHA + defaultFacturaShouldNotBeFound("fecha.greaterThanOrEqual=" + UPDATED_FECHA); + } + + @Test + @Transactional + void getAllFacturasByFechaIsLessThanOrEqualToSomething() throws Exception { + // Initialize the database + facturaRepository.saveAndFlush(factura); + + // Get all the facturaList where fecha is less than or equal to DEFAULT_FECHA + defaultFacturaShouldBeFound("fecha.lessThanOrEqual=" + DEFAULT_FECHA); + + // Get all the facturaList where fecha is less than or equal to SMALLER_FECHA + defaultFacturaShouldNotBeFound("fecha.lessThanOrEqual=" + SMALLER_FECHA); + } + + @Test + @Transactional + void getAllFacturasByFechaIsLessThanSomething() throws Exception { + // Initialize the database + facturaRepository.saveAndFlush(factura); + + // Get all the facturaList where fecha is less than DEFAULT_FECHA + defaultFacturaShouldNotBeFound("fecha.lessThan=" + DEFAULT_FECHA); + + // Get all the facturaList where fecha is less than UPDATED_FECHA + defaultFacturaShouldBeFound("fecha.lessThan=" + UPDATED_FECHA); + } + + @Test + @Transactional + void getAllFacturasByFechaIsGreaterThanSomething() throws Exception { + // Initialize the database + facturaRepository.saveAndFlush(factura); + + // Get all the facturaList where fecha is greater than DEFAULT_FECHA + defaultFacturaShouldNotBeFound("fecha.greaterThan=" + DEFAULT_FECHA); + + // Get all the facturaList where fecha is greater than SMALLER_FECHA + defaultFacturaShouldBeFound("fecha.greaterThan=" + SMALLER_FECHA); + } + + /** + * Executes the search, and checks that the default entity is returned. + */ + private void defaultFacturaShouldBeFound(String filter) throws Exception { + restFacturaMockMvc + .perform(get(ENTITY_API_URL + "?sort=id,desc&" + filter)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.[*].id").value(hasItem(factura.getId().intValue()))) + .andExpect(jsonPath("$.[*].nombreUsuario").value(hasItem(DEFAULT_NOMBRE_USUARIO))) + .andExpect(jsonPath("$.[*].nombrePlantilla").value(hasItem(DEFAULT_NOMBRE_PLANTILLA))) + .andExpect(jsonPath("$.[*].costo").value(hasItem(DEFAULT_COSTO.doubleValue()))) + .andExpect(jsonPath("$.[*].fecha").value(hasItem(sameInstant(DEFAULT_FECHA)))); + + // Check, that the count call also returns 1 + restFacturaMockMvc + .perform(get(ENTITY_API_URL + "/count?sort=id,desc&" + filter)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(content().string("1")); + } + + /** + * Executes the search, and checks that the default entity is not returned. + */ + private void defaultFacturaShouldNotBeFound(String filter) throws Exception { + restFacturaMockMvc + .perform(get(ENTITY_API_URL + "?sort=id,desc&" + filter)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$").isArray()) + .andExpect(jsonPath("$").isEmpty()); + + // Check, that the count call also returns 0 + restFacturaMockMvc + .perform(get(ENTITY_API_URL + "/count?sort=id,desc&" + filter)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(content().string("0")); + } + + @Test + @Transactional + void getNonExistingFactura() throws Exception { + // Get the factura + restFacturaMockMvc.perform(get(ENTITY_API_URL_ID, Long.MAX_VALUE)).andExpect(status().isNotFound()); + } + + @Test + @Transactional + void putNewFactura() throws Exception { + // Initialize the database + facturaRepository.saveAndFlush(factura); + + int databaseSizeBeforeUpdate = facturaRepository.findAll().size(); + + // Update the factura + Factura updatedFactura = facturaRepository.findById(factura.getId()).get(); + // Disconnect from session so that the updates on updatedFactura are not directly saved in db + em.detach(updatedFactura); + updatedFactura + .nombreUsuario(UPDATED_NOMBRE_USUARIO) + .nombrePlantilla(UPDATED_NOMBRE_PLANTILLA) + .costo(UPDATED_COSTO) + .fecha(UPDATED_FECHA); + + restFacturaMockMvc + .perform( + put(ENTITY_API_URL_ID, updatedFactura.getId()) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(updatedFactura)) + ) + .andExpect(status().isOk()); + + // Validate the Factura in the database + List facturaList = facturaRepository.findAll(); + assertThat(facturaList).hasSize(databaseSizeBeforeUpdate); + Factura testFactura = facturaList.get(facturaList.size() - 1); + assertThat(testFactura.getNombreUsuario()).isEqualTo(UPDATED_NOMBRE_USUARIO); + assertThat(testFactura.getNombrePlantilla()).isEqualTo(UPDATED_NOMBRE_PLANTILLA); + assertThat(testFactura.getCosto()).isEqualTo(UPDATED_COSTO); + assertThat(testFactura.getFecha()).isEqualTo(UPDATED_FECHA); + } + + @Test + @Transactional + void putNonExistingFactura() throws Exception { + int databaseSizeBeforeUpdate = facturaRepository.findAll().size(); + factura.setId(count.incrementAndGet()); + + // If the entity doesn't have an ID, it will throw BadRequestAlertException + restFacturaMockMvc + .perform( + put(ENTITY_API_URL_ID, factura.getId()) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(factura)) + ) + .andExpect(status().isBadRequest()); + + // Validate the Factura in the database + List facturaList = facturaRepository.findAll(); + assertThat(facturaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void putWithIdMismatchFactura() throws Exception { + int databaseSizeBeforeUpdate = facturaRepository.findAll().size(); + factura.setId(count.incrementAndGet()); + + // If url ID doesn't match entity ID, it will throw BadRequestAlertException + restFacturaMockMvc + .perform( + put(ENTITY_API_URL_ID, count.incrementAndGet()) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(factura)) + ) + .andExpect(status().isBadRequest()); + + // Validate the Factura in the database + List facturaList = facturaRepository.findAll(); + assertThat(facturaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void putWithMissingIdPathParamFactura() throws Exception { + int databaseSizeBeforeUpdate = facturaRepository.findAll().size(); + factura.setId(count.incrementAndGet()); + + // If url ID doesn't match entity ID, it will throw BadRequestAlertException + restFacturaMockMvc + .perform(put(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(factura))) + .andExpect(status().isMethodNotAllowed()); + + // Validate the Factura in the database + List facturaList = facturaRepository.findAll(); + assertThat(facturaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void partialUpdateFacturaWithPatch() throws Exception { + // Initialize the database + facturaRepository.saveAndFlush(factura); + + int databaseSizeBeforeUpdate = facturaRepository.findAll().size(); + + // Update the factura using partial update + Factura partialUpdatedFactura = new Factura(); + partialUpdatedFactura.setId(factura.getId()); + + partialUpdatedFactura.costo(UPDATED_COSTO).fecha(UPDATED_FECHA); + + restFacturaMockMvc + .perform( + patch(ENTITY_API_URL_ID, partialUpdatedFactura.getId()) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(partialUpdatedFactura)) + ) + .andExpect(status().isOk()); + + // Validate the Factura in the database + List facturaList = facturaRepository.findAll(); + assertThat(facturaList).hasSize(databaseSizeBeforeUpdate); + Factura testFactura = facturaList.get(facturaList.size() - 1); + assertThat(testFactura.getNombreUsuario()).isEqualTo(DEFAULT_NOMBRE_USUARIO); + assertThat(testFactura.getNombrePlantilla()).isEqualTo(DEFAULT_NOMBRE_PLANTILLA); + assertThat(testFactura.getCosto()).isEqualTo(UPDATED_COSTO); + assertThat(testFactura.getFecha()).isEqualTo(UPDATED_FECHA); + } + + @Test + @Transactional + void fullUpdateFacturaWithPatch() throws Exception { + // Initialize the database + facturaRepository.saveAndFlush(factura); + + int databaseSizeBeforeUpdate = facturaRepository.findAll().size(); + + // Update the factura using partial update + Factura partialUpdatedFactura = new Factura(); + partialUpdatedFactura.setId(factura.getId()); + + partialUpdatedFactura + .nombreUsuario(UPDATED_NOMBRE_USUARIO) + .nombrePlantilla(UPDATED_NOMBRE_PLANTILLA) + .costo(UPDATED_COSTO) + .fecha(UPDATED_FECHA); + + restFacturaMockMvc + .perform( + patch(ENTITY_API_URL_ID, partialUpdatedFactura.getId()) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(partialUpdatedFactura)) + ) + .andExpect(status().isOk()); + + // Validate the Factura in the database + List facturaList = facturaRepository.findAll(); + assertThat(facturaList).hasSize(databaseSizeBeforeUpdate); + Factura testFactura = facturaList.get(facturaList.size() - 1); + assertThat(testFactura.getNombreUsuario()).isEqualTo(UPDATED_NOMBRE_USUARIO); + assertThat(testFactura.getNombrePlantilla()).isEqualTo(UPDATED_NOMBRE_PLANTILLA); + assertThat(testFactura.getCosto()).isEqualTo(UPDATED_COSTO); + assertThat(testFactura.getFecha()).isEqualTo(UPDATED_FECHA); + } + + @Test + @Transactional + void patchNonExistingFactura() throws Exception { + int databaseSizeBeforeUpdate = facturaRepository.findAll().size(); + factura.setId(count.incrementAndGet()); + + // If the entity doesn't have an ID, it will throw BadRequestAlertException + restFacturaMockMvc + .perform( + patch(ENTITY_API_URL_ID, factura.getId()) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(factura)) + ) + .andExpect(status().isBadRequest()); + + // Validate the Factura in the database + List facturaList = facturaRepository.findAll(); + assertThat(facturaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void patchWithIdMismatchFactura() throws Exception { + int databaseSizeBeforeUpdate = facturaRepository.findAll().size(); + factura.setId(count.incrementAndGet()); + + // If url ID doesn't match entity ID, it will throw BadRequestAlertException + restFacturaMockMvc + .perform( + patch(ENTITY_API_URL_ID, count.incrementAndGet()) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(factura)) + ) + .andExpect(status().isBadRequest()); + + // Validate the Factura in the database + List facturaList = facturaRepository.findAll(); + assertThat(facturaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void patchWithMissingIdPathParamFactura() throws Exception { + int databaseSizeBeforeUpdate = facturaRepository.findAll().size(); + factura.setId(count.incrementAndGet()); + + // If url ID doesn't match entity ID, it will throw BadRequestAlertException + restFacturaMockMvc + .perform(patch(ENTITY_API_URL).contentType("application/merge-patch+json").content(TestUtil.convertObjectToJsonBytes(factura))) + .andExpect(status().isMethodNotAllowed()); + + // Validate the Factura in the database + List facturaList = facturaRepository.findAll(); + assertThat(facturaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void deleteFactura() throws Exception { + // Initialize the database + facturaRepository.saveAndFlush(factura); + + int databaseSizeBeforeDelete = facturaRepository.findAll().size(); + + // Delete the factura + restFacturaMockMvc + .perform(delete(ENTITY_API_URL_ID, factura.getId()).accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isNoContent()); + + // Validate the database contains one less item + List facturaList = facturaRepository.findAll(); + assertThat(facturaList).hasSize(databaseSizeBeforeDelete - 1); + } +} diff --git a/src/test/java/org/datasurvey/web/rest/PPreguntaAbiertaResourceIT.java b/src/test/java/org/datasurvey/web/rest/PPreguntaAbiertaResourceIT.java new file mode 100644 index 0000000..2eba770 --- /dev/null +++ b/src/test/java/org/datasurvey/web/rest/PPreguntaAbiertaResourceIT.java @@ -0,0 +1,763 @@ +package org.datasurvey.web.rest; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.hamcrest.Matchers.hasItem; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +import java.util.List; +import java.util.Random; +import java.util.concurrent.atomic.AtomicLong; +import javax.persistence.EntityManager; +import org.datasurvey.IntegrationTest; +import org.datasurvey.domain.PPreguntaAbierta; +import org.datasurvey.domain.Plantilla; +import org.datasurvey.repository.PPreguntaAbiertaRepository; +import org.datasurvey.service.criteria.PPreguntaAbiertaCriteria; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.http.MediaType; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.transaction.annotation.Transactional; + +/** + * Integration tests for the {@link PPreguntaAbiertaResource} REST controller. + */ +@IntegrationTest +@AutoConfigureMockMvc +@WithMockUser +class PPreguntaAbiertaResourceIT { + + private static final String DEFAULT_NOMBRE = "AAAAAAAAAA"; + private static final String UPDATED_NOMBRE = "BBBBBBBBBB"; + + private static final Boolean DEFAULT_OPCIONAL = false; + private static final Boolean UPDATED_OPCIONAL = true; + + private static final Integer DEFAULT_ORDEN = 1; + private static final Integer UPDATED_ORDEN = 2; + private static final Integer SMALLER_ORDEN = 1 - 1; + + private static final String ENTITY_API_URL = "/api/p-pregunta-abiertas"; + private static final String ENTITY_API_URL_ID = ENTITY_API_URL + "/{id}"; + + private static Random random = new Random(); + private static AtomicLong count = new AtomicLong(random.nextInt() + (2 * Integer.MAX_VALUE)); + + @Autowired + private PPreguntaAbiertaRepository pPreguntaAbiertaRepository; + + @Autowired + private EntityManager em; + + @Autowired + private MockMvc restPPreguntaAbiertaMockMvc; + + private PPreguntaAbierta pPreguntaAbierta; + + /** + * Create an entity for this test. + * + * This is a static method, as tests for other entities might also need it, + * if they test an entity which requires the current entity. + */ + public static PPreguntaAbierta createEntity(EntityManager em) { + PPreguntaAbierta pPreguntaAbierta = new PPreguntaAbierta().nombre(DEFAULT_NOMBRE).opcional(DEFAULT_OPCIONAL).orden(DEFAULT_ORDEN); + return pPreguntaAbierta; + } + + /** + * Create an updated entity for this test. + * + * This is a static method, as tests for other entities might also need it, + * if they test an entity which requires the current entity. + */ + public static PPreguntaAbierta createUpdatedEntity(EntityManager em) { + PPreguntaAbierta pPreguntaAbierta = new PPreguntaAbierta().nombre(UPDATED_NOMBRE).opcional(UPDATED_OPCIONAL).orden(UPDATED_ORDEN); + return pPreguntaAbierta; + } + + @BeforeEach + public void initTest() { + pPreguntaAbierta = createEntity(em); + } + + @Test + @Transactional + void createPPreguntaAbierta() throws Exception { + int databaseSizeBeforeCreate = pPreguntaAbiertaRepository.findAll().size(); + // Create the PPreguntaAbierta + restPPreguntaAbiertaMockMvc + .perform( + post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(pPreguntaAbierta)) + ) + .andExpect(status().isCreated()); + + // Validate the PPreguntaAbierta in the database + List pPreguntaAbiertaList = pPreguntaAbiertaRepository.findAll(); + assertThat(pPreguntaAbiertaList).hasSize(databaseSizeBeforeCreate + 1); + PPreguntaAbierta testPPreguntaAbierta = pPreguntaAbiertaList.get(pPreguntaAbiertaList.size() - 1); + assertThat(testPPreguntaAbierta.getNombre()).isEqualTo(DEFAULT_NOMBRE); + assertThat(testPPreguntaAbierta.getOpcional()).isEqualTo(DEFAULT_OPCIONAL); + assertThat(testPPreguntaAbierta.getOrden()).isEqualTo(DEFAULT_ORDEN); + } + + @Test + @Transactional + void createPPreguntaAbiertaWithExistingId() throws Exception { + // Create the PPreguntaAbierta with an existing ID + pPreguntaAbierta.setId(1L); + + int databaseSizeBeforeCreate = pPreguntaAbiertaRepository.findAll().size(); + + // An entity with an existing ID cannot be created, so this API call must fail + restPPreguntaAbiertaMockMvc + .perform( + post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(pPreguntaAbierta)) + ) + .andExpect(status().isBadRequest()); + + // Validate the PPreguntaAbierta in the database + List pPreguntaAbiertaList = pPreguntaAbiertaRepository.findAll(); + assertThat(pPreguntaAbiertaList).hasSize(databaseSizeBeforeCreate); + } + + @Test + @Transactional + void checkNombreIsRequired() throws Exception { + int databaseSizeBeforeTest = pPreguntaAbiertaRepository.findAll().size(); + // set the field null + pPreguntaAbierta.setNombre(null); + + // Create the PPreguntaAbierta, which fails. + + restPPreguntaAbiertaMockMvc + .perform( + post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(pPreguntaAbierta)) + ) + .andExpect(status().isBadRequest()); + + List pPreguntaAbiertaList = pPreguntaAbiertaRepository.findAll(); + assertThat(pPreguntaAbiertaList).hasSize(databaseSizeBeforeTest); + } + + @Test + @Transactional + void checkOpcionalIsRequired() throws Exception { + int databaseSizeBeforeTest = pPreguntaAbiertaRepository.findAll().size(); + // set the field null + pPreguntaAbierta.setOpcional(null); + + // Create the PPreguntaAbierta, which fails. + + restPPreguntaAbiertaMockMvc + .perform( + post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(pPreguntaAbierta)) + ) + .andExpect(status().isBadRequest()); + + List pPreguntaAbiertaList = pPreguntaAbiertaRepository.findAll(); + assertThat(pPreguntaAbiertaList).hasSize(databaseSizeBeforeTest); + } + + @Test + @Transactional + void checkOrdenIsRequired() throws Exception { + int databaseSizeBeforeTest = pPreguntaAbiertaRepository.findAll().size(); + // set the field null + pPreguntaAbierta.setOrden(null); + + // Create the PPreguntaAbierta, which fails. + + restPPreguntaAbiertaMockMvc + .perform( + post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(pPreguntaAbierta)) + ) + .andExpect(status().isBadRequest()); + + List pPreguntaAbiertaList = pPreguntaAbiertaRepository.findAll(); + assertThat(pPreguntaAbiertaList).hasSize(databaseSizeBeforeTest); + } + + @Test + @Transactional + void getAllPPreguntaAbiertas() throws Exception { + // Initialize the database + pPreguntaAbiertaRepository.saveAndFlush(pPreguntaAbierta); + + // Get all the pPreguntaAbiertaList + restPPreguntaAbiertaMockMvc + .perform(get(ENTITY_API_URL + "?sort=id,desc")) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.[*].id").value(hasItem(pPreguntaAbierta.getId().intValue()))) + .andExpect(jsonPath("$.[*].nombre").value(hasItem(DEFAULT_NOMBRE))) + .andExpect(jsonPath("$.[*].opcional").value(hasItem(DEFAULT_OPCIONAL.booleanValue()))) + .andExpect(jsonPath("$.[*].orden").value(hasItem(DEFAULT_ORDEN))); + } + + @Test + @Transactional + void getPPreguntaAbierta() throws Exception { + // Initialize the database + pPreguntaAbiertaRepository.saveAndFlush(pPreguntaAbierta); + + // Get the pPreguntaAbierta + restPPreguntaAbiertaMockMvc + .perform(get(ENTITY_API_URL_ID, pPreguntaAbierta.getId())) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.id").value(pPreguntaAbierta.getId().intValue())) + .andExpect(jsonPath("$.nombre").value(DEFAULT_NOMBRE)) + .andExpect(jsonPath("$.opcional").value(DEFAULT_OPCIONAL.booleanValue())) + .andExpect(jsonPath("$.orden").value(DEFAULT_ORDEN)); + } + + @Test + @Transactional + void getPPreguntaAbiertasByIdFiltering() throws Exception { + // Initialize the database + pPreguntaAbiertaRepository.saveAndFlush(pPreguntaAbierta); + + Long id = pPreguntaAbierta.getId(); + + defaultPPreguntaAbiertaShouldBeFound("id.equals=" + id); + defaultPPreguntaAbiertaShouldNotBeFound("id.notEquals=" + id); + + defaultPPreguntaAbiertaShouldBeFound("id.greaterThanOrEqual=" + id); + defaultPPreguntaAbiertaShouldNotBeFound("id.greaterThan=" + id); + + defaultPPreguntaAbiertaShouldBeFound("id.lessThanOrEqual=" + id); + defaultPPreguntaAbiertaShouldNotBeFound("id.lessThan=" + id); + } + + @Test + @Transactional + void getAllPPreguntaAbiertasByNombreIsEqualToSomething() throws Exception { + // Initialize the database + pPreguntaAbiertaRepository.saveAndFlush(pPreguntaAbierta); + + // Get all the pPreguntaAbiertaList where nombre equals to DEFAULT_NOMBRE + defaultPPreguntaAbiertaShouldBeFound("nombre.equals=" + DEFAULT_NOMBRE); + + // Get all the pPreguntaAbiertaList where nombre equals to UPDATED_NOMBRE + defaultPPreguntaAbiertaShouldNotBeFound("nombre.equals=" + UPDATED_NOMBRE); + } + + @Test + @Transactional + void getAllPPreguntaAbiertasByNombreIsNotEqualToSomething() throws Exception { + // Initialize the database + pPreguntaAbiertaRepository.saveAndFlush(pPreguntaAbierta); + + // Get all the pPreguntaAbiertaList where nombre not equals to DEFAULT_NOMBRE + defaultPPreguntaAbiertaShouldNotBeFound("nombre.notEquals=" + DEFAULT_NOMBRE); + + // Get all the pPreguntaAbiertaList where nombre not equals to UPDATED_NOMBRE + defaultPPreguntaAbiertaShouldBeFound("nombre.notEquals=" + UPDATED_NOMBRE); + } + + @Test + @Transactional + void getAllPPreguntaAbiertasByNombreIsInShouldWork() throws Exception { + // Initialize the database + pPreguntaAbiertaRepository.saveAndFlush(pPreguntaAbierta); + + // Get all the pPreguntaAbiertaList where nombre in DEFAULT_NOMBRE or UPDATED_NOMBRE + defaultPPreguntaAbiertaShouldBeFound("nombre.in=" + DEFAULT_NOMBRE + "," + UPDATED_NOMBRE); + + // Get all the pPreguntaAbiertaList where nombre equals to UPDATED_NOMBRE + defaultPPreguntaAbiertaShouldNotBeFound("nombre.in=" + UPDATED_NOMBRE); + } + + @Test + @Transactional + void getAllPPreguntaAbiertasByNombreIsNullOrNotNull() throws Exception { + // Initialize the database + pPreguntaAbiertaRepository.saveAndFlush(pPreguntaAbierta); + + // Get all the pPreguntaAbiertaList where nombre is not null + defaultPPreguntaAbiertaShouldBeFound("nombre.specified=true"); + + // Get all the pPreguntaAbiertaList where nombre is null + defaultPPreguntaAbiertaShouldNotBeFound("nombre.specified=false"); + } + + @Test + @Transactional + void getAllPPreguntaAbiertasByNombreContainsSomething() throws Exception { + // Initialize the database + pPreguntaAbiertaRepository.saveAndFlush(pPreguntaAbierta); + + // Get all the pPreguntaAbiertaList where nombre contains DEFAULT_NOMBRE + defaultPPreguntaAbiertaShouldBeFound("nombre.contains=" + DEFAULT_NOMBRE); + + // Get all the pPreguntaAbiertaList where nombre contains UPDATED_NOMBRE + defaultPPreguntaAbiertaShouldNotBeFound("nombre.contains=" + UPDATED_NOMBRE); + } + + @Test + @Transactional + void getAllPPreguntaAbiertasByNombreNotContainsSomething() throws Exception { + // Initialize the database + pPreguntaAbiertaRepository.saveAndFlush(pPreguntaAbierta); + + // Get all the pPreguntaAbiertaList where nombre does not contain DEFAULT_NOMBRE + defaultPPreguntaAbiertaShouldNotBeFound("nombre.doesNotContain=" + DEFAULT_NOMBRE); + + // Get all the pPreguntaAbiertaList where nombre does not contain UPDATED_NOMBRE + defaultPPreguntaAbiertaShouldBeFound("nombre.doesNotContain=" + UPDATED_NOMBRE); + } + + @Test + @Transactional + void getAllPPreguntaAbiertasByOpcionalIsEqualToSomething() throws Exception { + // Initialize the database + pPreguntaAbiertaRepository.saveAndFlush(pPreguntaAbierta); + + // Get all the pPreguntaAbiertaList where opcional equals to DEFAULT_OPCIONAL + defaultPPreguntaAbiertaShouldBeFound("opcional.equals=" + DEFAULT_OPCIONAL); + + // Get all the pPreguntaAbiertaList where opcional equals to UPDATED_OPCIONAL + defaultPPreguntaAbiertaShouldNotBeFound("opcional.equals=" + UPDATED_OPCIONAL); + } + + @Test + @Transactional + void getAllPPreguntaAbiertasByOpcionalIsNotEqualToSomething() throws Exception { + // Initialize the database + pPreguntaAbiertaRepository.saveAndFlush(pPreguntaAbierta); + + // Get all the pPreguntaAbiertaList where opcional not equals to DEFAULT_OPCIONAL + defaultPPreguntaAbiertaShouldNotBeFound("opcional.notEquals=" + DEFAULT_OPCIONAL); + + // Get all the pPreguntaAbiertaList where opcional not equals to UPDATED_OPCIONAL + defaultPPreguntaAbiertaShouldBeFound("opcional.notEquals=" + UPDATED_OPCIONAL); + } + + @Test + @Transactional + void getAllPPreguntaAbiertasByOpcionalIsInShouldWork() throws Exception { + // Initialize the database + pPreguntaAbiertaRepository.saveAndFlush(pPreguntaAbierta); + + // Get all the pPreguntaAbiertaList where opcional in DEFAULT_OPCIONAL or UPDATED_OPCIONAL + defaultPPreguntaAbiertaShouldBeFound("opcional.in=" + DEFAULT_OPCIONAL + "," + UPDATED_OPCIONAL); + + // Get all the pPreguntaAbiertaList where opcional equals to UPDATED_OPCIONAL + defaultPPreguntaAbiertaShouldNotBeFound("opcional.in=" + UPDATED_OPCIONAL); + } + + @Test + @Transactional + void getAllPPreguntaAbiertasByOpcionalIsNullOrNotNull() throws Exception { + // Initialize the database + pPreguntaAbiertaRepository.saveAndFlush(pPreguntaAbierta); + + // Get all the pPreguntaAbiertaList where opcional is not null + defaultPPreguntaAbiertaShouldBeFound("opcional.specified=true"); + + // Get all the pPreguntaAbiertaList where opcional is null + defaultPPreguntaAbiertaShouldNotBeFound("opcional.specified=false"); + } + + @Test + @Transactional + void getAllPPreguntaAbiertasByOrdenIsEqualToSomething() throws Exception { + // Initialize the database + pPreguntaAbiertaRepository.saveAndFlush(pPreguntaAbierta); + + // Get all the pPreguntaAbiertaList where orden equals to DEFAULT_ORDEN + defaultPPreguntaAbiertaShouldBeFound("orden.equals=" + DEFAULT_ORDEN); + + // Get all the pPreguntaAbiertaList where orden equals to UPDATED_ORDEN + defaultPPreguntaAbiertaShouldNotBeFound("orden.equals=" + UPDATED_ORDEN); + } + + @Test + @Transactional + void getAllPPreguntaAbiertasByOrdenIsNotEqualToSomething() throws Exception { + // Initialize the database + pPreguntaAbiertaRepository.saveAndFlush(pPreguntaAbierta); + + // Get all the pPreguntaAbiertaList where orden not equals to DEFAULT_ORDEN + defaultPPreguntaAbiertaShouldNotBeFound("orden.notEquals=" + DEFAULT_ORDEN); + + // Get all the pPreguntaAbiertaList where orden not equals to UPDATED_ORDEN + defaultPPreguntaAbiertaShouldBeFound("orden.notEquals=" + UPDATED_ORDEN); + } + + @Test + @Transactional + void getAllPPreguntaAbiertasByOrdenIsInShouldWork() throws Exception { + // Initialize the database + pPreguntaAbiertaRepository.saveAndFlush(pPreguntaAbierta); + + // Get all the pPreguntaAbiertaList where orden in DEFAULT_ORDEN or UPDATED_ORDEN + defaultPPreguntaAbiertaShouldBeFound("orden.in=" + DEFAULT_ORDEN + "," + UPDATED_ORDEN); + + // Get all the pPreguntaAbiertaList where orden equals to UPDATED_ORDEN + defaultPPreguntaAbiertaShouldNotBeFound("orden.in=" + UPDATED_ORDEN); + } + + @Test + @Transactional + void getAllPPreguntaAbiertasByOrdenIsNullOrNotNull() throws Exception { + // Initialize the database + pPreguntaAbiertaRepository.saveAndFlush(pPreguntaAbierta); + + // Get all the pPreguntaAbiertaList where orden is not null + defaultPPreguntaAbiertaShouldBeFound("orden.specified=true"); + + // Get all the pPreguntaAbiertaList where orden is null + defaultPPreguntaAbiertaShouldNotBeFound("orden.specified=false"); + } + + @Test + @Transactional + void getAllPPreguntaAbiertasByOrdenIsGreaterThanOrEqualToSomething() throws Exception { + // Initialize the database + pPreguntaAbiertaRepository.saveAndFlush(pPreguntaAbierta); + + // Get all the pPreguntaAbiertaList where orden is greater than or equal to DEFAULT_ORDEN + defaultPPreguntaAbiertaShouldBeFound("orden.greaterThanOrEqual=" + DEFAULT_ORDEN); + + // Get all the pPreguntaAbiertaList where orden is greater than or equal to UPDATED_ORDEN + defaultPPreguntaAbiertaShouldNotBeFound("orden.greaterThanOrEqual=" + UPDATED_ORDEN); + } + + @Test + @Transactional + void getAllPPreguntaAbiertasByOrdenIsLessThanOrEqualToSomething() throws Exception { + // Initialize the database + pPreguntaAbiertaRepository.saveAndFlush(pPreguntaAbierta); + + // Get all the pPreguntaAbiertaList where orden is less than or equal to DEFAULT_ORDEN + defaultPPreguntaAbiertaShouldBeFound("orden.lessThanOrEqual=" + DEFAULT_ORDEN); + + // Get all the pPreguntaAbiertaList where orden is less than or equal to SMALLER_ORDEN + defaultPPreguntaAbiertaShouldNotBeFound("orden.lessThanOrEqual=" + SMALLER_ORDEN); + } + + @Test + @Transactional + void getAllPPreguntaAbiertasByOrdenIsLessThanSomething() throws Exception { + // Initialize the database + pPreguntaAbiertaRepository.saveAndFlush(pPreguntaAbierta); + + // Get all the pPreguntaAbiertaList where orden is less than DEFAULT_ORDEN + defaultPPreguntaAbiertaShouldNotBeFound("orden.lessThan=" + DEFAULT_ORDEN); + + // Get all the pPreguntaAbiertaList where orden is less than UPDATED_ORDEN + defaultPPreguntaAbiertaShouldBeFound("orden.lessThan=" + UPDATED_ORDEN); + } + + @Test + @Transactional + void getAllPPreguntaAbiertasByOrdenIsGreaterThanSomething() throws Exception { + // Initialize the database + pPreguntaAbiertaRepository.saveAndFlush(pPreguntaAbierta); + + // Get all the pPreguntaAbiertaList where orden is greater than DEFAULT_ORDEN + defaultPPreguntaAbiertaShouldNotBeFound("orden.greaterThan=" + DEFAULT_ORDEN); + + // Get all the pPreguntaAbiertaList where orden is greater than SMALLER_ORDEN + defaultPPreguntaAbiertaShouldBeFound("orden.greaterThan=" + SMALLER_ORDEN); + } + + @Test + @Transactional + void getAllPPreguntaAbiertasByPlantillaIsEqualToSomething() throws Exception { + // Initialize the database + pPreguntaAbiertaRepository.saveAndFlush(pPreguntaAbierta); + Plantilla plantilla = PlantillaResourceIT.createEntity(em); + em.persist(plantilla); + em.flush(); + pPreguntaAbierta.setPlantilla(plantilla); + pPreguntaAbiertaRepository.saveAndFlush(pPreguntaAbierta); + Long plantillaId = plantilla.getId(); + + // Get all the pPreguntaAbiertaList where plantilla equals to plantillaId + defaultPPreguntaAbiertaShouldBeFound("plantillaId.equals=" + plantillaId); + + // Get all the pPreguntaAbiertaList where plantilla equals to (plantillaId + 1) + defaultPPreguntaAbiertaShouldNotBeFound("plantillaId.equals=" + (plantillaId + 1)); + } + + /** + * Executes the search, and checks that the default entity is returned. + */ + private void defaultPPreguntaAbiertaShouldBeFound(String filter) throws Exception { + restPPreguntaAbiertaMockMvc + .perform(get(ENTITY_API_URL + "?sort=id,desc&" + filter)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.[*].id").value(hasItem(pPreguntaAbierta.getId().intValue()))) + .andExpect(jsonPath("$.[*].nombre").value(hasItem(DEFAULT_NOMBRE))) + .andExpect(jsonPath("$.[*].opcional").value(hasItem(DEFAULT_OPCIONAL.booleanValue()))) + .andExpect(jsonPath("$.[*].orden").value(hasItem(DEFAULT_ORDEN))); + + // Check, that the count call also returns 1 + restPPreguntaAbiertaMockMvc + .perform(get(ENTITY_API_URL + "/count?sort=id,desc&" + filter)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(content().string("1")); + } + + /** + * Executes the search, and checks that the default entity is not returned. + */ + private void defaultPPreguntaAbiertaShouldNotBeFound(String filter) throws Exception { + restPPreguntaAbiertaMockMvc + .perform(get(ENTITY_API_URL + "?sort=id,desc&" + filter)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$").isArray()) + .andExpect(jsonPath("$").isEmpty()); + + // Check, that the count call also returns 0 + restPPreguntaAbiertaMockMvc + .perform(get(ENTITY_API_URL + "/count?sort=id,desc&" + filter)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(content().string("0")); + } + + @Test + @Transactional + void getNonExistingPPreguntaAbierta() throws Exception { + // Get the pPreguntaAbierta + restPPreguntaAbiertaMockMvc.perform(get(ENTITY_API_URL_ID, Long.MAX_VALUE)).andExpect(status().isNotFound()); + } + + @Test + @Transactional + void putNewPPreguntaAbierta() throws Exception { + // Initialize the database + pPreguntaAbiertaRepository.saveAndFlush(pPreguntaAbierta); + + int databaseSizeBeforeUpdate = pPreguntaAbiertaRepository.findAll().size(); + + // Update the pPreguntaAbierta + PPreguntaAbierta updatedPPreguntaAbierta = pPreguntaAbiertaRepository.findById(pPreguntaAbierta.getId()).get(); + // Disconnect from session so that the updates on updatedPPreguntaAbierta are not directly saved in db + em.detach(updatedPPreguntaAbierta); + updatedPPreguntaAbierta.nombre(UPDATED_NOMBRE).opcional(UPDATED_OPCIONAL).orden(UPDATED_ORDEN); + + restPPreguntaAbiertaMockMvc + .perform( + put(ENTITY_API_URL_ID, updatedPPreguntaAbierta.getId()) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(updatedPPreguntaAbierta)) + ) + .andExpect(status().isOk()); + + // Validate the PPreguntaAbierta in the database + List pPreguntaAbiertaList = pPreguntaAbiertaRepository.findAll(); + assertThat(pPreguntaAbiertaList).hasSize(databaseSizeBeforeUpdate); + PPreguntaAbierta testPPreguntaAbierta = pPreguntaAbiertaList.get(pPreguntaAbiertaList.size() - 1); + assertThat(testPPreguntaAbierta.getNombre()).isEqualTo(UPDATED_NOMBRE); + assertThat(testPPreguntaAbierta.getOpcional()).isEqualTo(UPDATED_OPCIONAL); + assertThat(testPPreguntaAbierta.getOrden()).isEqualTo(UPDATED_ORDEN); + } + + @Test + @Transactional + void putNonExistingPPreguntaAbierta() throws Exception { + int databaseSizeBeforeUpdate = pPreguntaAbiertaRepository.findAll().size(); + pPreguntaAbierta.setId(count.incrementAndGet()); + + // If the entity doesn't have an ID, it will throw BadRequestAlertException + restPPreguntaAbiertaMockMvc + .perform( + put(ENTITY_API_URL_ID, pPreguntaAbierta.getId()) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(pPreguntaAbierta)) + ) + .andExpect(status().isBadRequest()); + + // Validate the PPreguntaAbierta in the database + List pPreguntaAbiertaList = pPreguntaAbiertaRepository.findAll(); + assertThat(pPreguntaAbiertaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void putWithIdMismatchPPreguntaAbierta() throws Exception { + int databaseSizeBeforeUpdate = pPreguntaAbiertaRepository.findAll().size(); + pPreguntaAbierta.setId(count.incrementAndGet()); + + // If url ID doesn't match entity ID, it will throw BadRequestAlertException + restPPreguntaAbiertaMockMvc + .perform( + put(ENTITY_API_URL_ID, count.incrementAndGet()) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(pPreguntaAbierta)) + ) + .andExpect(status().isBadRequest()); + + // Validate the PPreguntaAbierta in the database + List pPreguntaAbiertaList = pPreguntaAbiertaRepository.findAll(); + assertThat(pPreguntaAbiertaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void putWithMissingIdPathParamPPreguntaAbierta() throws Exception { + int databaseSizeBeforeUpdate = pPreguntaAbiertaRepository.findAll().size(); + pPreguntaAbierta.setId(count.incrementAndGet()); + + // If url ID doesn't match entity ID, it will throw BadRequestAlertException + restPPreguntaAbiertaMockMvc + .perform( + put(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(pPreguntaAbierta)) + ) + .andExpect(status().isMethodNotAllowed()); + + // Validate the PPreguntaAbierta in the database + List pPreguntaAbiertaList = pPreguntaAbiertaRepository.findAll(); + assertThat(pPreguntaAbiertaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void partialUpdatePPreguntaAbiertaWithPatch() throws Exception { + // Initialize the database + pPreguntaAbiertaRepository.saveAndFlush(pPreguntaAbierta); + + int databaseSizeBeforeUpdate = pPreguntaAbiertaRepository.findAll().size(); + + // Update the pPreguntaAbierta using partial update + PPreguntaAbierta partialUpdatedPPreguntaAbierta = new PPreguntaAbierta(); + partialUpdatedPPreguntaAbierta.setId(pPreguntaAbierta.getId()); + + restPPreguntaAbiertaMockMvc + .perform( + patch(ENTITY_API_URL_ID, partialUpdatedPPreguntaAbierta.getId()) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(partialUpdatedPPreguntaAbierta)) + ) + .andExpect(status().isOk()); + + // Validate the PPreguntaAbierta in the database + List pPreguntaAbiertaList = pPreguntaAbiertaRepository.findAll(); + assertThat(pPreguntaAbiertaList).hasSize(databaseSizeBeforeUpdate); + PPreguntaAbierta testPPreguntaAbierta = pPreguntaAbiertaList.get(pPreguntaAbiertaList.size() - 1); + assertThat(testPPreguntaAbierta.getNombre()).isEqualTo(DEFAULT_NOMBRE); + assertThat(testPPreguntaAbierta.getOpcional()).isEqualTo(DEFAULT_OPCIONAL); + assertThat(testPPreguntaAbierta.getOrden()).isEqualTo(DEFAULT_ORDEN); + } + + @Test + @Transactional + void fullUpdatePPreguntaAbiertaWithPatch() throws Exception { + // Initialize the database + pPreguntaAbiertaRepository.saveAndFlush(pPreguntaAbierta); + + int databaseSizeBeforeUpdate = pPreguntaAbiertaRepository.findAll().size(); + + // Update the pPreguntaAbierta using partial update + PPreguntaAbierta partialUpdatedPPreguntaAbierta = new PPreguntaAbierta(); + partialUpdatedPPreguntaAbierta.setId(pPreguntaAbierta.getId()); + + partialUpdatedPPreguntaAbierta.nombre(UPDATED_NOMBRE).opcional(UPDATED_OPCIONAL).orden(UPDATED_ORDEN); + + restPPreguntaAbiertaMockMvc + .perform( + patch(ENTITY_API_URL_ID, partialUpdatedPPreguntaAbierta.getId()) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(partialUpdatedPPreguntaAbierta)) + ) + .andExpect(status().isOk()); + + // Validate the PPreguntaAbierta in the database + List pPreguntaAbiertaList = pPreguntaAbiertaRepository.findAll(); + assertThat(pPreguntaAbiertaList).hasSize(databaseSizeBeforeUpdate); + PPreguntaAbierta testPPreguntaAbierta = pPreguntaAbiertaList.get(pPreguntaAbiertaList.size() - 1); + assertThat(testPPreguntaAbierta.getNombre()).isEqualTo(UPDATED_NOMBRE); + assertThat(testPPreguntaAbierta.getOpcional()).isEqualTo(UPDATED_OPCIONAL); + assertThat(testPPreguntaAbierta.getOrden()).isEqualTo(UPDATED_ORDEN); + } + + @Test + @Transactional + void patchNonExistingPPreguntaAbierta() throws Exception { + int databaseSizeBeforeUpdate = pPreguntaAbiertaRepository.findAll().size(); + pPreguntaAbierta.setId(count.incrementAndGet()); + + // If the entity doesn't have an ID, it will throw BadRequestAlertException + restPPreguntaAbiertaMockMvc + .perform( + patch(ENTITY_API_URL_ID, pPreguntaAbierta.getId()) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(pPreguntaAbierta)) + ) + .andExpect(status().isBadRequest()); + + // Validate the PPreguntaAbierta in the database + List pPreguntaAbiertaList = pPreguntaAbiertaRepository.findAll(); + assertThat(pPreguntaAbiertaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void patchWithIdMismatchPPreguntaAbierta() throws Exception { + int databaseSizeBeforeUpdate = pPreguntaAbiertaRepository.findAll().size(); + pPreguntaAbierta.setId(count.incrementAndGet()); + + // If url ID doesn't match entity ID, it will throw BadRequestAlertException + restPPreguntaAbiertaMockMvc + .perform( + patch(ENTITY_API_URL_ID, count.incrementAndGet()) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(pPreguntaAbierta)) + ) + .andExpect(status().isBadRequest()); + + // Validate the PPreguntaAbierta in the database + List pPreguntaAbiertaList = pPreguntaAbiertaRepository.findAll(); + assertThat(pPreguntaAbiertaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void patchWithMissingIdPathParamPPreguntaAbierta() throws Exception { + int databaseSizeBeforeUpdate = pPreguntaAbiertaRepository.findAll().size(); + pPreguntaAbierta.setId(count.incrementAndGet()); + + // If url ID doesn't match entity ID, it will throw BadRequestAlertException + restPPreguntaAbiertaMockMvc + .perform( + patch(ENTITY_API_URL) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(pPreguntaAbierta)) + ) + .andExpect(status().isMethodNotAllowed()); + + // Validate the PPreguntaAbierta in the database + List pPreguntaAbiertaList = pPreguntaAbiertaRepository.findAll(); + assertThat(pPreguntaAbiertaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void deletePPreguntaAbierta() throws Exception { + // Initialize the database + pPreguntaAbiertaRepository.saveAndFlush(pPreguntaAbierta); + + int databaseSizeBeforeDelete = pPreguntaAbiertaRepository.findAll().size(); + + // Delete the pPreguntaAbierta + restPPreguntaAbiertaMockMvc + .perform(delete(ENTITY_API_URL_ID, pPreguntaAbierta.getId()).accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isNoContent()); + + // Validate the database contains one less item + List pPreguntaAbiertaList = pPreguntaAbiertaRepository.findAll(); + assertThat(pPreguntaAbiertaList).hasSize(databaseSizeBeforeDelete - 1); + } +} diff --git a/src/test/java/org/datasurvey/web/rest/PPreguntaCerradaOpcionResourceIT.java b/src/test/java/org/datasurvey/web/rest/PPreguntaCerradaOpcionResourceIT.java new file mode 100644 index 0000000..cec4ab2 --- /dev/null +++ b/src/test/java/org/datasurvey/web/rest/PPreguntaCerradaOpcionResourceIT.java @@ -0,0 +1,696 @@ +package org.datasurvey.web.rest; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.hamcrest.Matchers.hasItem; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +import java.util.List; +import java.util.Random; +import java.util.concurrent.atomic.AtomicLong; +import javax.persistence.EntityManager; +import org.datasurvey.IntegrationTest; +import org.datasurvey.domain.PPreguntaCerrada; +import org.datasurvey.domain.PPreguntaCerradaOpcion; +import org.datasurvey.repository.PPreguntaCerradaOpcionRepository; +import org.datasurvey.service.criteria.PPreguntaCerradaOpcionCriteria; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.http.MediaType; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.transaction.annotation.Transactional; + +/** + * Integration tests for the {@link PPreguntaCerradaOpcionResource} REST controller. + */ +@IntegrationTest +@AutoConfigureMockMvc +@WithMockUser +class PPreguntaCerradaOpcionResourceIT { + + private static final String DEFAULT_NOMBRE = "AAAAAAAAAA"; + private static final String UPDATED_NOMBRE = "BBBBBBBBBB"; + + private static final Integer DEFAULT_ORDEN = 1; + private static final Integer UPDATED_ORDEN = 2; + private static final Integer SMALLER_ORDEN = 1 - 1; + + private static final String ENTITY_API_URL = "/api/p-pregunta-cerrada-opcions"; + private static final String ENTITY_API_URL_ID = ENTITY_API_URL + "/{id}"; + + private static Random random = new Random(); + private static AtomicLong count = new AtomicLong(random.nextInt() + (2 * Integer.MAX_VALUE)); + + @Autowired + private PPreguntaCerradaOpcionRepository pPreguntaCerradaOpcionRepository; + + @Autowired + private EntityManager em; + + @Autowired + private MockMvc restPPreguntaCerradaOpcionMockMvc; + + private PPreguntaCerradaOpcion pPreguntaCerradaOpcion; + + /** + * Create an entity for this test. + * + * This is a static method, as tests for other entities might also need it, + * if they test an entity which requires the current entity. + */ + public static PPreguntaCerradaOpcion createEntity(EntityManager em) { + PPreguntaCerradaOpcion pPreguntaCerradaOpcion = new PPreguntaCerradaOpcion().nombre(DEFAULT_NOMBRE).orden(DEFAULT_ORDEN); + return pPreguntaCerradaOpcion; + } + + /** + * Create an updated entity for this test. + * + * This is a static method, as tests for other entities might also need it, + * if they test an entity which requires the current entity. + */ + public static PPreguntaCerradaOpcion createUpdatedEntity(EntityManager em) { + PPreguntaCerradaOpcion pPreguntaCerradaOpcion = new PPreguntaCerradaOpcion().nombre(UPDATED_NOMBRE).orden(UPDATED_ORDEN); + return pPreguntaCerradaOpcion; + } + + @BeforeEach + public void initTest() { + pPreguntaCerradaOpcion = createEntity(em); + } + + @Test + @Transactional + void createPPreguntaCerradaOpcion() throws Exception { + int databaseSizeBeforeCreate = pPreguntaCerradaOpcionRepository.findAll().size(); + // Create the PPreguntaCerradaOpcion + restPPreguntaCerradaOpcionMockMvc + .perform( + post(ENTITY_API_URL) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(pPreguntaCerradaOpcion)) + ) + .andExpect(status().isCreated()); + + // Validate the PPreguntaCerradaOpcion in the database + List pPreguntaCerradaOpcionList = pPreguntaCerradaOpcionRepository.findAll(); + assertThat(pPreguntaCerradaOpcionList).hasSize(databaseSizeBeforeCreate + 1); + PPreguntaCerradaOpcion testPPreguntaCerradaOpcion = pPreguntaCerradaOpcionList.get(pPreguntaCerradaOpcionList.size() - 1); + assertThat(testPPreguntaCerradaOpcion.getNombre()).isEqualTo(DEFAULT_NOMBRE); + assertThat(testPPreguntaCerradaOpcion.getOrden()).isEqualTo(DEFAULT_ORDEN); + } + + @Test + @Transactional + void createPPreguntaCerradaOpcionWithExistingId() throws Exception { + // Create the PPreguntaCerradaOpcion with an existing ID + pPreguntaCerradaOpcion.setId(1L); + + int databaseSizeBeforeCreate = pPreguntaCerradaOpcionRepository.findAll().size(); + + // An entity with an existing ID cannot be created, so this API call must fail + restPPreguntaCerradaOpcionMockMvc + .perform( + post(ENTITY_API_URL) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(pPreguntaCerradaOpcion)) + ) + .andExpect(status().isBadRequest()); + + // Validate the PPreguntaCerradaOpcion in the database + List pPreguntaCerradaOpcionList = pPreguntaCerradaOpcionRepository.findAll(); + assertThat(pPreguntaCerradaOpcionList).hasSize(databaseSizeBeforeCreate); + } + + @Test + @Transactional + void checkNombreIsRequired() throws Exception { + int databaseSizeBeforeTest = pPreguntaCerradaOpcionRepository.findAll().size(); + // set the field null + pPreguntaCerradaOpcion.setNombre(null); + + // Create the PPreguntaCerradaOpcion, which fails. + + restPPreguntaCerradaOpcionMockMvc + .perform( + post(ENTITY_API_URL) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(pPreguntaCerradaOpcion)) + ) + .andExpect(status().isBadRequest()); + + List pPreguntaCerradaOpcionList = pPreguntaCerradaOpcionRepository.findAll(); + assertThat(pPreguntaCerradaOpcionList).hasSize(databaseSizeBeforeTest); + } + + @Test + @Transactional + void checkOrdenIsRequired() throws Exception { + int databaseSizeBeforeTest = pPreguntaCerradaOpcionRepository.findAll().size(); + // set the field null + pPreguntaCerradaOpcion.setOrden(null); + + // Create the PPreguntaCerradaOpcion, which fails. + + restPPreguntaCerradaOpcionMockMvc + .perform( + post(ENTITY_API_URL) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(pPreguntaCerradaOpcion)) + ) + .andExpect(status().isBadRequest()); + + List pPreguntaCerradaOpcionList = pPreguntaCerradaOpcionRepository.findAll(); + assertThat(pPreguntaCerradaOpcionList).hasSize(databaseSizeBeforeTest); + } + + @Test + @Transactional + void getAllPPreguntaCerradaOpcions() throws Exception { + // Initialize the database + pPreguntaCerradaOpcionRepository.saveAndFlush(pPreguntaCerradaOpcion); + + // Get all the pPreguntaCerradaOpcionList + restPPreguntaCerradaOpcionMockMvc + .perform(get(ENTITY_API_URL + "?sort=id,desc")) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.[*].id").value(hasItem(pPreguntaCerradaOpcion.getId().intValue()))) + .andExpect(jsonPath("$.[*].nombre").value(hasItem(DEFAULT_NOMBRE))) + .andExpect(jsonPath("$.[*].orden").value(hasItem(DEFAULT_ORDEN))); + } + + @Test + @Transactional + void getPPreguntaCerradaOpcion() throws Exception { + // Initialize the database + pPreguntaCerradaOpcionRepository.saveAndFlush(pPreguntaCerradaOpcion); + + // Get the pPreguntaCerradaOpcion + restPPreguntaCerradaOpcionMockMvc + .perform(get(ENTITY_API_URL_ID, pPreguntaCerradaOpcion.getId())) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.id").value(pPreguntaCerradaOpcion.getId().intValue())) + .andExpect(jsonPath("$.nombre").value(DEFAULT_NOMBRE)) + .andExpect(jsonPath("$.orden").value(DEFAULT_ORDEN)); + } + + @Test + @Transactional + void getPPreguntaCerradaOpcionsByIdFiltering() throws Exception { + // Initialize the database + pPreguntaCerradaOpcionRepository.saveAndFlush(pPreguntaCerradaOpcion); + + Long id = pPreguntaCerradaOpcion.getId(); + + defaultPPreguntaCerradaOpcionShouldBeFound("id.equals=" + id); + defaultPPreguntaCerradaOpcionShouldNotBeFound("id.notEquals=" + id); + + defaultPPreguntaCerradaOpcionShouldBeFound("id.greaterThanOrEqual=" + id); + defaultPPreguntaCerradaOpcionShouldNotBeFound("id.greaterThan=" + id); + + defaultPPreguntaCerradaOpcionShouldBeFound("id.lessThanOrEqual=" + id); + defaultPPreguntaCerradaOpcionShouldNotBeFound("id.lessThan=" + id); + } + + @Test + @Transactional + void getAllPPreguntaCerradaOpcionsByNombreIsEqualToSomething() throws Exception { + // Initialize the database + pPreguntaCerradaOpcionRepository.saveAndFlush(pPreguntaCerradaOpcion); + + // Get all the pPreguntaCerradaOpcionList where nombre equals to DEFAULT_NOMBRE + defaultPPreguntaCerradaOpcionShouldBeFound("nombre.equals=" + DEFAULT_NOMBRE); + + // Get all the pPreguntaCerradaOpcionList where nombre equals to UPDATED_NOMBRE + defaultPPreguntaCerradaOpcionShouldNotBeFound("nombre.equals=" + UPDATED_NOMBRE); + } + + @Test + @Transactional + void getAllPPreguntaCerradaOpcionsByNombreIsNotEqualToSomething() throws Exception { + // Initialize the database + pPreguntaCerradaOpcionRepository.saveAndFlush(pPreguntaCerradaOpcion); + + // Get all the pPreguntaCerradaOpcionList where nombre not equals to DEFAULT_NOMBRE + defaultPPreguntaCerradaOpcionShouldNotBeFound("nombre.notEquals=" + DEFAULT_NOMBRE); + + // Get all the pPreguntaCerradaOpcionList where nombre not equals to UPDATED_NOMBRE + defaultPPreguntaCerradaOpcionShouldBeFound("nombre.notEquals=" + UPDATED_NOMBRE); + } + + @Test + @Transactional + void getAllPPreguntaCerradaOpcionsByNombreIsInShouldWork() throws Exception { + // Initialize the database + pPreguntaCerradaOpcionRepository.saveAndFlush(pPreguntaCerradaOpcion); + + // Get all the pPreguntaCerradaOpcionList where nombre in DEFAULT_NOMBRE or UPDATED_NOMBRE + defaultPPreguntaCerradaOpcionShouldBeFound("nombre.in=" + DEFAULT_NOMBRE + "," + UPDATED_NOMBRE); + + // Get all the pPreguntaCerradaOpcionList where nombre equals to UPDATED_NOMBRE + defaultPPreguntaCerradaOpcionShouldNotBeFound("nombre.in=" + UPDATED_NOMBRE); + } + + @Test + @Transactional + void getAllPPreguntaCerradaOpcionsByNombreIsNullOrNotNull() throws Exception { + // Initialize the database + pPreguntaCerradaOpcionRepository.saveAndFlush(pPreguntaCerradaOpcion); + + // Get all the pPreguntaCerradaOpcionList where nombre is not null + defaultPPreguntaCerradaOpcionShouldBeFound("nombre.specified=true"); + + // Get all the pPreguntaCerradaOpcionList where nombre is null + defaultPPreguntaCerradaOpcionShouldNotBeFound("nombre.specified=false"); + } + + @Test + @Transactional + void getAllPPreguntaCerradaOpcionsByNombreContainsSomething() throws Exception { + // Initialize the database + pPreguntaCerradaOpcionRepository.saveAndFlush(pPreguntaCerradaOpcion); + + // Get all the pPreguntaCerradaOpcionList where nombre contains DEFAULT_NOMBRE + defaultPPreguntaCerradaOpcionShouldBeFound("nombre.contains=" + DEFAULT_NOMBRE); + + // Get all the pPreguntaCerradaOpcionList where nombre contains UPDATED_NOMBRE + defaultPPreguntaCerradaOpcionShouldNotBeFound("nombre.contains=" + UPDATED_NOMBRE); + } + + @Test + @Transactional + void getAllPPreguntaCerradaOpcionsByNombreNotContainsSomething() throws Exception { + // Initialize the database + pPreguntaCerradaOpcionRepository.saveAndFlush(pPreguntaCerradaOpcion); + + // Get all the pPreguntaCerradaOpcionList where nombre does not contain DEFAULT_NOMBRE + defaultPPreguntaCerradaOpcionShouldNotBeFound("nombre.doesNotContain=" + DEFAULT_NOMBRE); + + // Get all the pPreguntaCerradaOpcionList where nombre does not contain UPDATED_NOMBRE + defaultPPreguntaCerradaOpcionShouldBeFound("nombre.doesNotContain=" + UPDATED_NOMBRE); + } + + @Test + @Transactional + void getAllPPreguntaCerradaOpcionsByOrdenIsEqualToSomething() throws Exception { + // Initialize the database + pPreguntaCerradaOpcionRepository.saveAndFlush(pPreguntaCerradaOpcion); + + // Get all the pPreguntaCerradaOpcionList where orden equals to DEFAULT_ORDEN + defaultPPreguntaCerradaOpcionShouldBeFound("orden.equals=" + DEFAULT_ORDEN); + + // Get all the pPreguntaCerradaOpcionList where orden equals to UPDATED_ORDEN + defaultPPreguntaCerradaOpcionShouldNotBeFound("orden.equals=" + UPDATED_ORDEN); + } + + @Test + @Transactional + void getAllPPreguntaCerradaOpcionsByOrdenIsNotEqualToSomething() throws Exception { + // Initialize the database + pPreguntaCerradaOpcionRepository.saveAndFlush(pPreguntaCerradaOpcion); + + // Get all the pPreguntaCerradaOpcionList where orden not equals to DEFAULT_ORDEN + defaultPPreguntaCerradaOpcionShouldNotBeFound("orden.notEquals=" + DEFAULT_ORDEN); + + // Get all the pPreguntaCerradaOpcionList where orden not equals to UPDATED_ORDEN + defaultPPreguntaCerradaOpcionShouldBeFound("orden.notEquals=" + UPDATED_ORDEN); + } + + @Test + @Transactional + void getAllPPreguntaCerradaOpcionsByOrdenIsInShouldWork() throws Exception { + // Initialize the database + pPreguntaCerradaOpcionRepository.saveAndFlush(pPreguntaCerradaOpcion); + + // Get all the pPreguntaCerradaOpcionList where orden in DEFAULT_ORDEN or UPDATED_ORDEN + defaultPPreguntaCerradaOpcionShouldBeFound("orden.in=" + DEFAULT_ORDEN + "," + UPDATED_ORDEN); + + // Get all the pPreguntaCerradaOpcionList where orden equals to UPDATED_ORDEN + defaultPPreguntaCerradaOpcionShouldNotBeFound("orden.in=" + UPDATED_ORDEN); + } + + @Test + @Transactional + void getAllPPreguntaCerradaOpcionsByOrdenIsNullOrNotNull() throws Exception { + // Initialize the database + pPreguntaCerradaOpcionRepository.saveAndFlush(pPreguntaCerradaOpcion); + + // Get all the pPreguntaCerradaOpcionList where orden is not null + defaultPPreguntaCerradaOpcionShouldBeFound("orden.specified=true"); + + // Get all the pPreguntaCerradaOpcionList where orden is null + defaultPPreguntaCerradaOpcionShouldNotBeFound("orden.specified=false"); + } + + @Test + @Transactional + void getAllPPreguntaCerradaOpcionsByOrdenIsGreaterThanOrEqualToSomething() throws Exception { + // Initialize the database + pPreguntaCerradaOpcionRepository.saveAndFlush(pPreguntaCerradaOpcion); + + // Get all the pPreguntaCerradaOpcionList where orden is greater than or equal to DEFAULT_ORDEN + defaultPPreguntaCerradaOpcionShouldBeFound("orden.greaterThanOrEqual=" + DEFAULT_ORDEN); + + // Get all the pPreguntaCerradaOpcionList where orden is greater than or equal to UPDATED_ORDEN + defaultPPreguntaCerradaOpcionShouldNotBeFound("orden.greaterThanOrEqual=" + UPDATED_ORDEN); + } + + @Test + @Transactional + void getAllPPreguntaCerradaOpcionsByOrdenIsLessThanOrEqualToSomething() throws Exception { + // Initialize the database + pPreguntaCerradaOpcionRepository.saveAndFlush(pPreguntaCerradaOpcion); + + // Get all the pPreguntaCerradaOpcionList where orden is less than or equal to DEFAULT_ORDEN + defaultPPreguntaCerradaOpcionShouldBeFound("orden.lessThanOrEqual=" + DEFAULT_ORDEN); + + // Get all the pPreguntaCerradaOpcionList where orden is less than or equal to SMALLER_ORDEN + defaultPPreguntaCerradaOpcionShouldNotBeFound("orden.lessThanOrEqual=" + SMALLER_ORDEN); + } + + @Test + @Transactional + void getAllPPreguntaCerradaOpcionsByOrdenIsLessThanSomething() throws Exception { + // Initialize the database + pPreguntaCerradaOpcionRepository.saveAndFlush(pPreguntaCerradaOpcion); + + // Get all the pPreguntaCerradaOpcionList where orden is less than DEFAULT_ORDEN + defaultPPreguntaCerradaOpcionShouldNotBeFound("orden.lessThan=" + DEFAULT_ORDEN); + + // Get all the pPreguntaCerradaOpcionList where orden is less than UPDATED_ORDEN + defaultPPreguntaCerradaOpcionShouldBeFound("orden.lessThan=" + UPDATED_ORDEN); + } + + @Test + @Transactional + void getAllPPreguntaCerradaOpcionsByOrdenIsGreaterThanSomething() throws Exception { + // Initialize the database + pPreguntaCerradaOpcionRepository.saveAndFlush(pPreguntaCerradaOpcion); + + // Get all the pPreguntaCerradaOpcionList where orden is greater than DEFAULT_ORDEN + defaultPPreguntaCerradaOpcionShouldNotBeFound("orden.greaterThan=" + DEFAULT_ORDEN); + + // Get all the pPreguntaCerradaOpcionList where orden is greater than SMALLER_ORDEN + defaultPPreguntaCerradaOpcionShouldBeFound("orden.greaterThan=" + SMALLER_ORDEN); + } + + @Test + @Transactional + void getAllPPreguntaCerradaOpcionsByPPreguntaCerradaIsEqualToSomething() throws Exception { + // Initialize the database + pPreguntaCerradaOpcionRepository.saveAndFlush(pPreguntaCerradaOpcion); + PPreguntaCerrada pPreguntaCerrada = PPreguntaCerradaResourceIT.createEntity(em); + em.persist(pPreguntaCerrada); + em.flush(); + pPreguntaCerradaOpcion.setPPreguntaCerrada(pPreguntaCerrada); + pPreguntaCerradaOpcionRepository.saveAndFlush(pPreguntaCerradaOpcion); + Long pPreguntaCerradaId = pPreguntaCerrada.getId(); + + // Get all the pPreguntaCerradaOpcionList where pPreguntaCerrada equals to pPreguntaCerradaId + defaultPPreguntaCerradaOpcionShouldBeFound("pPreguntaCerradaId.equals=" + pPreguntaCerradaId); + + // Get all the pPreguntaCerradaOpcionList where pPreguntaCerrada equals to (pPreguntaCerradaId + 1) + defaultPPreguntaCerradaOpcionShouldNotBeFound("pPreguntaCerradaId.equals=" + (pPreguntaCerradaId + 1)); + } + + /** + * Executes the search, and checks that the default entity is returned. + */ + private void defaultPPreguntaCerradaOpcionShouldBeFound(String filter) throws Exception { + restPPreguntaCerradaOpcionMockMvc + .perform(get(ENTITY_API_URL + "?sort=id,desc&" + filter)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.[*].id").value(hasItem(pPreguntaCerradaOpcion.getId().intValue()))) + .andExpect(jsonPath("$.[*].nombre").value(hasItem(DEFAULT_NOMBRE))) + .andExpect(jsonPath("$.[*].orden").value(hasItem(DEFAULT_ORDEN))); + + // Check, that the count call also returns 1 + restPPreguntaCerradaOpcionMockMvc + .perform(get(ENTITY_API_URL + "/count?sort=id,desc&" + filter)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(content().string("1")); + } + + /** + * Executes the search, and checks that the default entity is not returned. + */ + private void defaultPPreguntaCerradaOpcionShouldNotBeFound(String filter) throws Exception { + restPPreguntaCerradaOpcionMockMvc + .perform(get(ENTITY_API_URL + "?sort=id,desc&" + filter)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$").isArray()) + .andExpect(jsonPath("$").isEmpty()); + + // Check, that the count call also returns 0 + restPPreguntaCerradaOpcionMockMvc + .perform(get(ENTITY_API_URL + "/count?sort=id,desc&" + filter)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(content().string("0")); + } + + @Test + @Transactional + void getNonExistingPPreguntaCerradaOpcion() throws Exception { + // Get the pPreguntaCerradaOpcion + restPPreguntaCerradaOpcionMockMvc.perform(get(ENTITY_API_URL_ID, Long.MAX_VALUE)).andExpect(status().isNotFound()); + } + + @Test + @Transactional + void putNewPPreguntaCerradaOpcion() throws Exception { + // Initialize the database + pPreguntaCerradaOpcionRepository.saveAndFlush(pPreguntaCerradaOpcion); + + int databaseSizeBeforeUpdate = pPreguntaCerradaOpcionRepository.findAll().size(); + + // Update the pPreguntaCerradaOpcion + PPreguntaCerradaOpcion updatedPPreguntaCerradaOpcion = pPreguntaCerradaOpcionRepository + .findById(pPreguntaCerradaOpcion.getId()) + .get(); + // Disconnect from session so that the updates on updatedPPreguntaCerradaOpcion are not directly saved in db + em.detach(updatedPPreguntaCerradaOpcion); + updatedPPreguntaCerradaOpcion.nombre(UPDATED_NOMBRE).orden(UPDATED_ORDEN); + + restPPreguntaCerradaOpcionMockMvc + .perform( + put(ENTITY_API_URL_ID, updatedPPreguntaCerradaOpcion.getId()) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(updatedPPreguntaCerradaOpcion)) + ) + .andExpect(status().isOk()); + + // Validate the PPreguntaCerradaOpcion in the database + List pPreguntaCerradaOpcionList = pPreguntaCerradaOpcionRepository.findAll(); + assertThat(pPreguntaCerradaOpcionList).hasSize(databaseSizeBeforeUpdate); + PPreguntaCerradaOpcion testPPreguntaCerradaOpcion = pPreguntaCerradaOpcionList.get(pPreguntaCerradaOpcionList.size() - 1); + assertThat(testPPreguntaCerradaOpcion.getNombre()).isEqualTo(UPDATED_NOMBRE); + assertThat(testPPreguntaCerradaOpcion.getOrden()).isEqualTo(UPDATED_ORDEN); + } + + @Test + @Transactional + void putNonExistingPPreguntaCerradaOpcion() throws Exception { + int databaseSizeBeforeUpdate = pPreguntaCerradaOpcionRepository.findAll().size(); + pPreguntaCerradaOpcion.setId(count.incrementAndGet()); + + // If the entity doesn't have an ID, it will throw BadRequestAlertException + restPPreguntaCerradaOpcionMockMvc + .perform( + put(ENTITY_API_URL_ID, pPreguntaCerradaOpcion.getId()) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(pPreguntaCerradaOpcion)) + ) + .andExpect(status().isBadRequest()); + + // Validate the PPreguntaCerradaOpcion in the database + List pPreguntaCerradaOpcionList = pPreguntaCerradaOpcionRepository.findAll(); + assertThat(pPreguntaCerradaOpcionList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void putWithIdMismatchPPreguntaCerradaOpcion() throws Exception { + int databaseSizeBeforeUpdate = pPreguntaCerradaOpcionRepository.findAll().size(); + pPreguntaCerradaOpcion.setId(count.incrementAndGet()); + + // If url ID doesn't match entity ID, it will throw BadRequestAlertException + restPPreguntaCerradaOpcionMockMvc + .perform( + put(ENTITY_API_URL_ID, count.incrementAndGet()) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(pPreguntaCerradaOpcion)) + ) + .andExpect(status().isBadRequest()); + + // Validate the PPreguntaCerradaOpcion in the database + List pPreguntaCerradaOpcionList = pPreguntaCerradaOpcionRepository.findAll(); + assertThat(pPreguntaCerradaOpcionList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void putWithMissingIdPathParamPPreguntaCerradaOpcion() throws Exception { + int databaseSizeBeforeUpdate = pPreguntaCerradaOpcionRepository.findAll().size(); + pPreguntaCerradaOpcion.setId(count.incrementAndGet()); + + // If url ID doesn't match entity ID, it will throw BadRequestAlertException + restPPreguntaCerradaOpcionMockMvc + .perform( + put(ENTITY_API_URL) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(pPreguntaCerradaOpcion)) + ) + .andExpect(status().isMethodNotAllowed()); + + // Validate the PPreguntaCerradaOpcion in the database + List pPreguntaCerradaOpcionList = pPreguntaCerradaOpcionRepository.findAll(); + assertThat(pPreguntaCerradaOpcionList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void partialUpdatePPreguntaCerradaOpcionWithPatch() throws Exception { + // Initialize the database + pPreguntaCerradaOpcionRepository.saveAndFlush(pPreguntaCerradaOpcion); + + int databaseSizeBeforeUpdate = pPreguntaCerradaOpcionRepository.findAll().size(); + + // Update the pPreguntaCerradaOpcion using partial update + PPreguntaCerradaOpcion partialUpdatedPPreguntaCerradaOpcion = new PPreguntaCerradaOpcion(); + partialUpdatedPPreguntaCerradaOpcion.setId(pPreguntaCerradaOpcion.getId()); + + partialUpdatedPPreguntaCerradaOpcion.nombre(UPDATED_NOMBRE); + + restPPreguntaCerradaOpcionMockMvc + .perform( + patch(ENTITY_API_URL_ID, partialUpdatedPPreguntaCerradaOpcion.getId()) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(partialUpdatedPPreguntaCerradaOpcion)) + ) + .andExpect(status().isOk()); + + // Validate the PPreguntaCerradaOpcion in the database + List pPreguntaCerradaOpcionList = pPreguntaCerradaOpcionRepository.findAll(); + assertThat(pPreguntaCerradaOpcionList).hasSize(databaseSizeBeforeUpdate); + PPreguntaCerradaOpcion testPPreguntaCerradaOpcion = pPreguntaCerradaOpcionList.get(pPreguntaCerradaOpcionList.size() - 1); + assertThat(testPPreguntaCerradaOpcion.getNombre()).isEqualTo(UPDATED_NOMBRE); + assertThat(testPPreguntaCerradaOpcion.getOrden()).isEqualTo(DEFAULT_ORDEN); + } + + @Test + @Transactional + void fullUpdatePPreguntaCerradaOpcionWithPatch() throws Exception { + // Initialize the database + pPreguntaCerradaOpcionRepository.saveAndFlush(pPreguntaCerradaOpcion); + + int databaseSizeBeforeUpdate = pPreguntaCerradaOpcionRepository.findAll().size(); + + // Update the pPreguntaCerradaOpcion using partial update + PPreguntaCerradaOpcion partialUpdatedPPreguntaCerradaOpcion = new PPreguntaCerradaOpcion(); + partialUpdatedPPreguntaCerradaOpcion.setId(pPreguntaCerradaOpcion.getId()); + + partialUpdatedPPreguntaCerradaOpcion.nombre(UPDATED_NOMBRE).orden(UPDATED_ORDEN); + + restPPreguntaCerradaOpcionMockMvc + .perform( + patch(ENTITY_API_URL_ID, partialUpdatedPPreguntaCerradaOpcion.getId()) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(partialUpdatedPPreguntaCerradaOpcion)) + ) + .andExpect(status().isOk()); + + // Validate the PPreguntaCerradaOpcion in the database + List pPreguntaCerradaOpcionList = pPreguntaCerradaOpcionRepository.findAll(); + assertThat(pPreguntaCerradaOpcionList).hasSize(databaseSizeBeforeUpdate); + PPreguntaCerradaOpcion testPPreguntaCerradaOpcion = pPreguntaCerradaOpcionList.get(pPreguntaCerradaOpcionList.size() - 1); + assertThat(testPPreguntaCerradaOpcion.getNombre()).isEqualTo(UPDATED_NOMBRE); + assertThat(testPPreguntaCerradaOpcion.getOrden()).isEqualTo(UPDATED_ORDEN); + } + + @Test + @Transactional + void patchNonExistingPPreguntaCerradaOpcion() throws Exception { + int databaseSizeBeforeUpdate = pPreguntaCerradaOpcionRepository.findAll().size(); + pPreguntaCerradaOpcion.setId(count.incrementAndGet()); + + // If the entity doesn't have an ID, it will throw BadRequestAlertException + restPPreguntaCerradaOpcionMockMvc + .perform( + patch(ENTITY_API_URL_ID, pPreguntaCerradaOpcion.getId()) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(pPreguntaCerradaOpcion)) + ) + .andExpect(status().isBadRequest()); + + // Validate the PPreguntaCerradaOpcion in the database + List pPreguntaCerradaOpcionList = pPreguntaCerradaOpcionRepository.findAll(); + assertThat(pPreguntaCerradaOpcionList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void patchWithIdMismatchPPreguntaCerradaOpcion() throws Exception { + int databaseSizeBeforeUpdate = pPreguntaCerradaOpcionRepository.findAll().size(); + pPreguntaCerradaOpcion.setId(count.incrementAndGet()); + + // If url ID doesn't match entity ID, it will throw BadRequestAlertException + restPPreguntaCerradaOpcionMockMvc + .perform( + patch(ENTITY_API_URL_ID, count.incrementAndGet()) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(pPreguntaCerradaOpcion)) + ) + .andExpect(status().isBadRequest()); + + // Validate the PPreguntaCerradaOpcion in the database + List pPreguntaCerradaOpcionList = pPreguntaCerradaOpcionRepository.findAll(); + assertThat(pPreguntaCerradaOpcionList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void patchWithMissingIdPathParamPPreguntaCerradaOpcion() throws Exception { + int databaseSizeBeforeUpdate = pPreguntaCerradaOpcionRepository.findAll().size(); + pPreguntaCerradaOpcion.setId(count.incrementAndGet()); + + // If url ID doesn't match entity ID, it will throw BadRequestAlertException + restPPreguntaCerradaOpcionMockMvc + .perform( + patch(ENTITY_API_URL) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(pPreguntaCerradaOpcion)) + ) + .andExpect(status().isMethodNotAllowed()); + + // Validate the PPreguntaCerradaOpcion in the database + List pPreguntaCerradaOpcionList = pPreguntaCerradaOpcionRepository.findAll(); + assertThat(pPreguntaCerradaOpcionList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void deletePPreguntaCerradaOpcion() throws Exception { + // Initialize the database + pPreguntaCerradaOpcionRepository.saveAndFlush(pPreguntaCerradaOpcion); + + int databaseSizeBeforeDelete = pPreguntaCerradaOpcionRepository.findAll().size(); + + // Delete the pPreguntaCerradaOpcion + restPPreguntaCerradaOpcionMockMvc + .perform(delete(ENTITY_API_URL_ID, pPreguntaCerradaOpcion.getId()).accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isNoContent()); + + // Validate the database contains one less item + List pPreguntaCerradaOpcionList = pPreguntaCerradaOpcionRepository.findAll(); + assertThat(pPreguntaCerradaOpcionList).hasSize(databaseSizeBeforeDelete - 1); + } +} diff --git a/src/test/java/org/datasurvey/web/rest/PPreguntaCerradaResourceIT.java b/src/test/java/org/datasurvey/web/rest/PPreguntaCerradaResourceIT.java new file mode 100644 index 0000000..d400f9e --- /dev/null +++ b/src/test/java/org/datasurvey/web/rest/PPreguntaCerradaResourceIT.java @@ -0,0 +1,875 @@ +package org.datasurvey.web.rest; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.hamcrest.Matchers.hasItem; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +import java.util.List; +import java.util.Random; +import java.util.concurrent.atomic.AtomicLong; +import javax.persistence.EntityManager; +import org.datasurvey.IntegrationTest; +import org.datasurvey.domain.PPreguntaCerrada; +import org.datasurvey.domain.PPreguntaCerradaOpcion; +import org.datasurvey.domain.Plantilla; +import org.datasurvey.domain.enumeration.PreguntaCerradaTipo; +import org.datasurvey.repository.PPreguntaCerradaRepository; +import org.datasurvey.service.criteria.PPreguntaCerradaCriteria; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.http.MediaType; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.transaction.annotation.Transactional; + +/** + * Integration tests for the {@link PPreguntaCerradaResource} REST controller. + */ +@IntegrationTest +@AutoConfigureMockMvc +@WithMockUser +class PPreguntaCerradaResourceIT { + + private static final String DEFAULT_NOMBRE = "AAAAAAAAAA"; + private static final String UPDATED_NOMBRE = "BBBBBBBBBB"; + + private static final PreguntaCerradaTipo DEFAULT_TIPO = PreguntaCerradaTipo.SINGLE; + private static final PreguntaCerradaTipo UPDATED_TIPO = PreguntaCerradaTipo.MULTIPLE; + + private static final Boolean DEFAULT_OPCIONAL = false; + private static final Boolean UPDATED_OPCIONAL = true; + + private static final Integer DEFAULT_ORDEN = 1; + private static final Integer UPDATED_ORDEN = 2; + private static final Integer SMALLER_ORDEN = 1 - 1; + + private static final String ENTITY_API_URL = "/api/p-pregunta-cerradas"; + private static final String ENTITY_API_URL_ID = ENTITY_API_URL + "/{id}"; + + private static Random random = new Random(); + private static AtomicLong count = new AtomicLong(random.nextInt() + (2 * Integer.MAX_VALUE)); + + @Autowired + private PPreguntaCerradaRepository pPreguntaCerradaRepository; + + @Autowired + private EntityManager em; + + @Autowired + private MockMvc restPPreguntaCerradaMockMvc; + + private PPreguntaCerrada pPreguntaCerrada; + + /** + * Create an entity for this test. + * + * This is a static method, as tests for other entities might also need it, + * if they test an entity which requires the current entity. + */ + public static PPreguntaCerrada createEntity(EntityManager em) { + PPreguntaCerrada pPreguntaCerrada = new PPreguntaCerrada() + .nombre(DEFAULT_NOMBRE) + .tipo(DEFAULT_TIPO) + .opcional(DEFAULT_OPCIONAL) + .orden(DEFAULT_ORDEN); + return pPreguntaCerrada; + } + + /** + * Create an updated entity for this test. + * + * This is a static method, as tests for other entities might also need it, + * if they test an entity which requires the current entity. + */ + public static PPreguntaCerrada createUpdatedEntity(EntityManager em) { + PPreguntaCerrada pPreguntaCerrada = new PPreguntaCerrada() + .nombre(UPDATED_NOMBRE) + .tipo(UPDATED_TIPO) + .opcional(UPDATED_OPCIONAL) + .orden(UPDATED_ORDEN); + return pPreguntaCerrada; + } + + @BeforeEach + public void initTest() { + pPreguntaCerrada = createEntity(em); + } + + @Test + @Transactional + void createPPreguntaCerrada() throws Exception { + int databaseSizeBeforeCreate = pPreguntaCerradaRepository.findAll().size(); + // Create the PPreguntaCerrada + restPPreguntaCerradaMockMvc + .perform( + post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(pPreguntaCerrada)) + ) + .andExpect(status().isCreated()); + + // Validate the PPreguntaCerrada in the database + List pPreguntaCerradaList = pPreguntaCerradaRepository.findAll(); + assertThat(pPreguntaCerradaList).hasSize(databaseSizeBeforeCreate + 1); + PPreguntaCerrada testPPreguntaCerrada = pPreguntaCerradaList.get(pPreguntaCerradaList.size() - 1); + assertThat(testPPreguntaCerrada.getNombre()).isEqualTo(DEFAULT_NOMBRE); + assertThat(testPPreguntaCerrada.getTipo()).isEqualTo(DEFAULT_TIPO); + assertThat(testPPreguntaCerrada.getOpcional()).isEqualTo(DEFAULT_OPCIONAL); + assertThat(testPPreguntaCerrada.getOrden()).isEqualTo(DEFAULT_ORDEN); + } + + @Test + @Transactional + void createPPreguntaCerradaWithExistingId() throws Exception { + // Create the PPreguntaCerrada with an existing ID + pPreguntaCerrada.setId(1L); + + int databaseSizeBeforeCreate = pPreguntaCerradaRepository.findAll().size(); + + // An entity with an existing ID cannot be created, so this API call must fail + restPPreguntaCerradaMockMvc + .perform( + post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(pPreguntaCerrada)) + ) + .andExpect(status().isBadRequest()); + + // Validate the PPreguntaCerrada in the database + List pPreguntaCerradaList = pPreguntaCerradaRepository.findAll(); + assertThat(pPreguntaCerradaList).hasSize(databaseSizeBeforeCreate); + } + + @Test + @Transactional + void checkNombreIsRequired() throws Exception { + int databaseSizeBeforeTest = pPreguntaCerradaRepository.findAll().size(); + // set the field null + pPreguntaCerrada.setNombre(null); + + // Create the PPreguntaCerrada, which fails. + + restPPreguntaCerradaMockMvc + .perform( + post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(pPreguntaCerrada)) + ) + .andExpect(status().isBadRequest()); + + List pPreguntaCerradaList = pPreguntaCerradaRepository.findAll(); + assertThat(pPreguntaCerradaList).hasSize(databaseSizeBeforeTest); + } + + @Test + @Transactional + void checkTipoIsRequired() throws Exception { + int databaseSizeBeforeTest = pPreguntaCerradaRepository.findAll().size(); + // set the field null + pPreguntaCerrada.setTipo(null); + + // Create the PPreguntaCerrada, which fails. + + restPPreguntaCerradaMockMvc + .perform( + post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(pPreguntaCerrada)) + ) + .andExpect(status().isBadRequest()); + + List pPreguntaCerradaList = pPreguntaCerradaRepository.findAll(); + assertThat(pPreguntaCerradaList).hasSize(databaseSizeBeforeTest); + } + + @Test + @Transactional + void checkOpcionalIsRequired() throws Exception { + int databaseSizeBeforeTest = pPreguntaCerradaRepository.findAll().size(); + // set the field null + pPreguntaCerrada.setOpcional(null); + + // Create the PPreguntaCerrada, which fails. + + restPPreguntaCerradaMockMvc + .perform( + post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(pPreguntaCerrada)) + ) + .andExpect(status().isBadRequest()); + + List pPreguntaCerradaList = pPreguntaCerradaRepository.findAll(); + assertThat(pPreguntaCerradaList).hasSize(databaseSizeBeforeTest); + } + + @Test + @Transactional + void checkOrdenIsRequired() throws Exception { + int databaseSizeBeforeTest = pPreguntaCerradaRepository.findAll().size(); + // set the field null + pPreguntaCerrada.setOrden(null); + + // Create the PPreguntaCerrada, which fails. + + restPPreguntaCerradaMockMvc + .perform( + post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(pPreguntaCerrada)) + ) + .andExpect(status().isBadRequest()); + + List pPreguntaCerradaList = pPreguntaCerradaRepository.findAll(); + assertThat(pPreguntaCerradaList).hasSize(databaseSizeBeforeTest); + } + + @Test + @Transactional + void getAllPPreguntaCerradas() throws Exception { + // Initialize the database + pPreguntaCerradaRepository.saveAndFlush(pPreguntaCerrada); + + // Get all the pPreguntaCerradaList + restPPreguntaCerradaMockMvc + .perform(get(ENTITY_API_URL + "?sort=id,desc")) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.[*].id").value(hasItem(pPreguntaCerrada.getId().intValue()))) + .andExpect(jsonPath("$.[*].nombre").value(hasItem(DEFAULT_NOMBRE))) + .andExpect(jsonPath("$.[*].tipo").value(hasItem(DEFAULT_TIPO.toString()))) + .andExpect(jsonPath("$.[*].opcional").value(hasItem(DEFAULT_OPCIONAL.booleanValue()))) + .andExpect(jsonPath("$.[*].orden").value(hasItem(DEFAULT_ORDEN))); + } + + @Test + @Transactional + void getPPreguntaCerrada() throws Exception { + // Initialize the database + pPreguntaCerradaRepository.saveAndFlush(pPreguntaCerrada); + + // Get the pPreguntaCerrada + restPPreguntaCerradaMockMvc + .perform(get(ENTITY_API_URL_ID, pPreguntaCerrada.getId())) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.id").value(pPreguntaCerrada.getId().intValue())) + .andExpect(jsonPath("$.nombre").value(DEFAULT_NOMBRE)) + .andExpect(jsonPath("$.tipo").value(DEFAULT_TIPO.toString())) + .andExpect(jsonPath("$.opcional").value(DEFAULT_OPCIONAL.booleanValue())) + .andExpect(jsonPath("$.orden").value(DEFAULT_ORDEN)); + } + + @Test + @Transactional + void getPPreguntaCerradasByIdFiltering() throws Exception { + // Initialize the database + pPreguntaCerradaRepository.saveAndFlush(pPreguntaCerrada); + + Long id = pPreguntaCerrada.getId(); + + defaultPPreguntaCerradaShouldBeFound("id.equals=" + id); + defaultPPreguntaCerradaShouldNotBeFound("id.notEquals=" + id); + + defaultPPreguntaCerradaShouldBeFound("id.greaterThanOrEqual=" + id); + defaultPPreguntaCerradaShouldNotBeFound("id.greaterThan=" + id); + + defaultPPreguntaCerradaShouldBeFound("id.lessThanOrEqual=" + id); + defaultPPreguntaCerradaShouldNotBeFound("id.lessThan=" + id); + } + + @Test + @Transactional + void getAllPPreguntaCerradasByNombreIsEqualToSomething() throws Exception { + // Initialize the database + pPreguntaCerradaRepository.saveAndFlush(pPreguntaCerrada); + + // Get all the pPreguntaCerradaList where nombre equals to DEFAULT_NOMBRE + defaultPPreguntaCerradaShouldBeFound("nombre.equals=" + DEFAULT_NOMBRE); + + // Get all the pPreguntaCerradaList where nombre equals to UPDATED_NOMBRE + defaultPPreguntaCerradaShouldNotBeFound("nombre.equals=" + UPDATED_NOMBRE); + } + + @Test + @Transactional + void getAllPPreguntaCerradasByNombreIsNotEqualToSomething() throws Exception { + // Initialize the database + pPreguntaCerradaRepository.saveAndFlush(pPreguntaCerrada); + + // Get all the pPreguntaCerradaList where nombre not equals to DEFAULT_NOMBRE + defaultPPreguntaCerradaShouldNotBeFound("nombre.notEquals=" + DEFAULT_NOMBRE); + + // Get all the pPreguntaCerradaList where nombre not equals to UPDATED_NOMBRE + defaultPPreguntaCerradaShouldBeFound("nombre.notEquals=" + UPDATED_NOMBRE); + } + + @Test + @Transactional + void getAllPPreguntaCerradasByNombreIsInShouldWork() throws Exception { + // Initialize the database + pPreguntaCerradaRepository.saveAndFlush(pPreguntaCerrada); + + // Get all the pPreguntaCerradaList where nombre in DEFAULT_NOMBRE or UPDATED_NOMBRE + defaultPPreguntaCerradaShouldBeFound("nombre.in=" + DEFAULT_NOMBRE + "," + UPDATED_NOMBRE); + + // Get all the pPreguntaCerradaList where nombre equals to UPDATED_NOMBRE + defaultPPreguntaCerradaShouldNotBeFound("nombre.in=" + UPDATED_NOMBRE); + } + + @Test + @Transactional + void getAllPPreguntaCerradasByNombreIsNullOrNotNull() throws Exception { + // Initialize the database + pPreguntaCerradaRepository.saveAndFlush(pPreguntaCerrada); + + // Get all the pPreguntaCerradaList where nombre is not null + defaultPPreguntaCerradaShouldBeFound("nombre.specified=true"); + + // Get all the pPreguntaCerradaList where nombre is null + defaultPPreguntaCerradaShouldNotBeFound("nombre.specified=false"); + } + + @Test + @Transactional + void getAllPPreguntaCerradasByNombreContainsSomething() throws Exception { + // Initialize the database + pPreguntaCerradaRepository.saveAndFlush(pPreguntaCerrada); + + // Get all the pPreguntaCerradaList where nombre contains DEFAULT_NOMBRE + defaultPPreguntaCerradaShouldBeFound("nombre.contains=" + DEFAULT_NOMBRE); + + // Get all the pPreguntaCerradaList where nombre contains UPDATED_NOMBRE + defaultPPreguntaCerradaShouldNotBeFound("nombre.contains=" + UPDATED_NOMBRE); + } + + @Test + @Transactional + void getAllPPreguntaCerradasByNombreNotContainsSomething() throws Exception { + // Initialize the database + pPreguntaCerradaRepository.saveAndFlush(pPreguntaCerrada); + + // Get all the pPreguntaCerradaList where nombre does not contain DEFAULT_NOMBRE + defaultPPreguntaCerradaShouldNotBeFound("nombre.doesNotContain=" + DEFAULT_NOMBRE); + + // Get all the pPreguntaCerradaList where nombre does not contain UPDATED_NOMBRE + defaultPPreguntaCerradaShouldBeFound("nombre.doesNotContain=" + UPDATED_NOMBRE); + } + + @Test + @Transactional + void getAllPPreguntaCerradasByTipoIsEqualToSomething() throws Exception { + // Initialize the database + pPreguntaCerradaRepository.saveAndFlush(pPreguntaCerrada); + + // Get all the pPreguntaCerradaList where tipo equals to DEFAULT_TIPO + defaultPPreguntaCerradaShouldBeFound("tipo.equals=" + DEFAULT_TIPO); + + // Get all the pPreguntaCerradaList where tipo equals to UPDATED_TIPO + defaultPPreguntaCerradaShouldNotBeFound("tipo.equals=" + UPDATED_TIPO); + } + + @Test + @Transactional + void getAllPPreguntaCerradasByTipoIsNotEqualToSomething() throws Exception { + // Initialize the database + pPreguntaCerradaRepository.saveAndFlush(pPreguntaCerrada); + + // Get all the pPreguntaCerradaList where tipo not equals to DEFAULT_TIPO + defaultPPreguntaCerradaShouldNotBeFound("tipo.notEquals=" + DEFAULT_TIPO); + + // Get all the pPreguntaCerradaList where tipo not equals to UPDATED_TIPO + defaultPPreguntaCerradaShouldBeFound("tipo.notEquals=" + UPDATED_TIPO); + } + + @Test + @Transactional + void getAllPPreguntaCerradasByTipoIsInShouldWork() throws Exception { + // Initialize the database + pPreguntaCerradaRepository.saveAndFlush(pPreguntaCerrada); + + // Get all the pPreguntaCerradaList where tipo in DEFAULT_TIPO or UPDATED_TIPO + defaultPPreguntaCerradaShouldBeFound("tipo.in=" + DEFAULT_TIPO + "," + UPDATED_TIPO); + + // Get all the pPreguntaCerradaList where tipo equals to UPDATED_TIPO + defaultPPreguntaCerradaShouldNotBeFound("tipo.in=" + UPDATED_TIPO); + } + + @Test + @Transactional + void getAllPPreguntaCerradasByTipoIsNullOrNotNull() throws Exception { + // Initialize the database + pPreguntaCerradaRepository.saveAndFlush(pPreguntaCerrada); + + // Get all the pPreguntaCerradaList where tipo is not null + defaultPPreguntaCerradaShouldBeFound("tipo.specified=true"); + + // Get all the pPreguntaCerradaList where tipo is null + defaultPPreguntaCerradaShouldNotBeFound("tipo.specified=false"); + } + + @Test + @Transactional + void getAllPPreguntaCerradasByOpcionalIsEqualToSomething() throws Exception { + // Initialize the database + pPreguntaCerradaRepository.saveAndFlush(pPreguntaCerrada); + + // Get all the pPreguntaCerradaList where opcional equals to DEFAULT_OPCIONAL + defaultPPreguntaCerradaShouldBeFound("opcional.equals=" + DEFAULT_OPCIONAL); + + // Get all the pPreguntaCerradaList where opcional equals to UPDATED_OPCIONAL + defaultPPreguntaCerradaShouldNotBeFound("opcional.equals=" + UPDATED_OPCIONAL); + } + + @Test + @Transactional + void getAllPPreguntaCerradasByOpcionalIsNotEqualToSomething() throws Exception { + // Initialize the database + pPreguntaCerradaRepository.saveAndFlush(pPreguntaCerrada); + + // Get all the pPreguntaCerradaList where opcional not equals to DEFAULT_OPCIONAL + defaultPPreguntaCerradaShouldNotBeFound("opcional.notEquals=" + DEFAULT_OPCIONAL); + + // Get all the pPreguntaCerradaList where opcional not equals to UPDATED_OPCIONAL + defaultPPreguntaCerradaShouldBeFound("opcional.notEquals=" + UPDATED_OPCIONAL); + } + + @Test + @Transactional + void getAllPPreguntaCerradasByOpcionalIsInShouldWork() throws Exception { + // Initialize the database + pPreguntaCerradaRepository.saveAndFlush(pPreguntaCerrada); + + // Get all the pPreguntaCerradaList where opcional in DEFAULT_OPCIONAL or UPDATED_OPCIONAL + defaultPPreguntaCerradaShouldBeFound("opcional.in=" + DEFAULT_OPCIONAL + "," + UPDATED_OPCIONAL); + + // Get all the pPreguntaCerradaList where opcional equals to UPDATED_OPCIONAL + defaultPPreguntaCerradaShouldNotBeFound("opcional.in=" + UPDATED_OPCIONAL); + } + + @Test + @Transactional + void getAllPPreguntaCerradasByOpcionalIsNullOrNotNull() throws Exception { + // Initialize the database + pPreguntaCerradaRepository.saveAndFlush(pPreguntaCerrada); + + // Get all the pPreguntaCerradaList where opcional is not null + defaultPPreguntaCerradaShouldBeFound("opcional.specified=true"); + + // Get all the pPreguntaCerradaList where opcional is null + defaultPPreguntaCerradaShouldNotBeFound("opcional.specified=false"); + } + + @Test + @Transactional + void getAllPPreguntaCerradasByOrdenIsEqualToSomething() throws Exception { + // Initialize the database + pPreguntaCerradaRepository.saveAndFlush(pPreguntaCerrada); + + // Get all the pPreguntaCerradaList where orden equals to DEFAULT_ORDEN + defaultPPreguntaCerradaShouldBeFound("orden.equals=" + DEFAULT_ORDEN); + + // Get all the pPreguntaCerradaList where orden equals to UPDATED_ORDEN + defaultPPreguntaCerradaShouldNotBeFound("orden.equals=" + UPDATED_ORDEN); + } + + @Test + @Transactional + void getAllPPreguntaCerradasByOrdenIsNotEqualToSomething() throws Exception { + // Initialize the database + pPreguntaCerradaRepository.saveAndFlush(pPreguntaCerrada); + + // Get all the pPreguntaCerradaList where orden not equals to DEFAULT_ORDEN + defaultPPreguntaCerradaShouldNotBeFound("orden.notEquals=" + DEFAULT_ORDEN); + + // Get all the pPreguntaCerradaList where orden not equals to UPDATED_ORDEN + defaultPPreguntaCerradaShouldBeFound("orden.notEquals=" + UPDATED_ORDEN); + } + + @Test + @Transactional + void getAllPPreguntaCerradasByOrdenIsInShouldWork() throws Exception { + // Initialize the database + pPreguntaCerradaRepository.saveAndFlush(pPreguntaCerrada); + + // Get all the pPreguntaCerradaList where orden in DEFAULT_ORDEN or UPDATED_ORDEN + defaultPPreguntaCerradaShouldBeFound("orden.in=" + DEFAULT_ORDEN + "," + UPDATED_ORDEN); + + // Get all the pPreguntaCerradaList where orden equals to UPDATED_ORDEN + defaultPPreguntaCerradaShouldNotBeFound("orden.in=" + UPDATED_ORDEN); + } + + @Test + @Transactional + void getAllPPreguntaCerradasByOrdenIsNullOrNotNull() throws Exception { + // Initialize the database + pPreguntaCerradaRepository.saveAndFlush(pPreguntaCerrada); + + // Get all the pPreguntaCerradaList where orden is not null + defaultPPreguntaCerradaShouldBeFound("orden.specified=true"); + + // Get all the pPreguntaCerradaList where orden is null + defaultPPreguntaCerradaShouldNotBeFound("orden.specified=false"); + } + + @Test + @Transactional + void getAllPPreguntaCerradasByOrdenIsGreaterThanOrEqualToSomething() throws Exception { + // Initialize the database + pPreguntaCerradaRepository.saveAndFlush(pPreguntaCerrada); + + // Get all the pPreguntaCerradaList where orden is greater than or equal to DEFAULT_ORDEN + defaultPPreguntaCerradaShouldBeFound("orden.greaterThanOrEqual=" + DEFAULT_ORDEN); + + // Get all the pPreguntaCerradaList where orden is greater than or equal to UPDATED_ORDEN + defaultPPreguntaCerradaShouldNotBeFound("orden.greaterThanOrEqual=" + UPDATED_ORDEN); + } + + @Test + @Transactional + void getAllPPreguntaCerradasByOrdenIsLessThanOrEqualToSomething() throws Exception { + // Initialize the database + pPreguntaCerradaRepository.saveAndFlush(pPreguntaCerrada); + + // Get all the pPreguntaCerradaList where orden is less than or equal to DEFAULT_ORDEN + defaultPPreguntaCerradaShouldBeFound("orden.lessThanOrEqual=" + DEFAULT_ORDEN); + + // Get all the pPreguntaCerradaList where orden is less than or equal to SMALLER_ORDEN + defaultPPreguntaCerradaShouldNotBeFound("orden.lessThanOrEqual=" + SMALLER_ORDEN); + } + + @Test + @Transactional + void getAllPPreguntaCerradasByOrdenIsLessThanSomething() throws Exception { + // Initialize the database + pPreguntaCerradaRepository.saveAndFlush(pPreguntaCerrada); + + // Get all the pPreguntaCerradaList where orden is less than DEFAULT_ORDEN + defaultPPreguntaCerradaShouldNotBeFound("orden.lessThan=" + DEFAULT_ORDEN); + + // Get all the pPreguntaCerradaList where orden is less than UPDATED_ORDEN + defaultPPreguntaCerradaShouldBeFound("orden.lessThan=" + UPDATED_ORDEN); + } + + @Test + @Transactional + void getAllPPreguntaCerradasByOrdenIsGreaterThanSomething() throws Exception { + // Initialize the database + pPreguntaCerradaRepository.saveAndFlush(pPreguntaCerrada); + + // Get all the pPreguntaCerradaList where orden is greater than DEFAULT_ORDEN + defaultPPreguntaCerradaShouldNotBeFound("orden.greaterThan=" + DEFAULT_ORDEN); + + // Get all the pPreguntaCerradaList where orden is greater than SMALLER_ORDEN + defaultPPreguntaCerradaShouldBeFound("orden.greaterThan=" + SMALLER_ORDEN); + } + + @Test + @Transactional + void getAllPPreguntaCerradasByPPreguntaCerradaOpcionIsEqualToSomething() throws Exception { + // Initialize the database + pPreguntaCerradaRepository.saveAndFlush(pPreguntaCerrada); + PPreguntaCerradaOpcion pPreguntaCerradaOpcion = PPreguntaCerradaOpcionResourceIT.createEntity(em); + em.persist(pPreguntaCerradaOpcion); + em.flush(); + pPreguntaCerrada.addPPreguntaCerradaOpcion(pPreguntaCerradaOpcion); + pPreguntaCerradaRepository.saveAndFlush(pPreguntaCerrada); + Long pPreguntaCerradaOpcionId = pPreguntaCerradaOpcion.getId(); + + // Get all the pPreguntaCerradaList where pPreguntaCerradaOpcion equals to pPreguntaCerradaOpcionId + defaultPPreguntaCerradaShouldBeFound("pPreguntaCerradaOpcionId.equals=" + pPreguntaCerradaOpcionId); + + // Get all the pPreguntaCerradaList where pPreguntaCerradaOpcion equals to (pPreguntaCerradaOpcionId + 1) + defaultPPreguntaCerradaShouldNotBeFound("pPreguntaCerradaOpcionId.equals=" + (pPreguntaCerradaOpcionId + 1)); + } + + @Test + @Transactional + void getAllPPreguntaCerradasByPlantillaIsEqualToSomething() throws Exception { + // Initialize the database + pPreguntaCerradaRepository.saveAndFlush(pPreguntaCerrada); + Plantilla plantilla = PlantillaResourceIT.createEntity(em); + em.persist(plantilla); + em.flush(); + pPreguntaCerrada.setPlantilla(plantilla); + pPreguntaCerradaRepository.saveAndFlush(pPreguntaCerrada); + Long plantillaId = plantilla.getId(); + + // Get all the pPreguntaCerradaList where plantilla equals to plantillaId + defaultPPreguntaCerradaShouldBeFound("plantillaId.equals=" + plantillaId); + + // Get all the pPreguntaCerradaList where plantilla equals to (plantillaId + 1) + defaultPPreguntaCerradaShouldNotBeFound("plantillaId.equals=" + (plantillaId + 1)); + } + + /** + * Executes the search, and checks that the default entity is returned. + */ + private void defaultPPreguntaCerradaShouldBeFound(String filter) throws Exception { + restPPreguntaCerradaMockMvc + .perform(get(ENTITY_API_URL + "?sort=id,desc&" + filter)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.[*].id").value(hasItem(pPreguntaCerrada.getId().intValue()))) + .andExpect(jsonPath("$.[*].nombre").value(hasItem(DEFAULT_NOMBRE))) + .andExpect(jsonPath("$.[*].tipo").value(hasItem(DEFAULT_TIPO.toString()))) + .andExpect(jsonPath("$.[*].opcional").value(hasItem(DEFAULT_OPCIONAL.booleanValue()))) + .andExpect(jsonPath("$.[*].orden").value(hasItem(DEFAULT_ORDEN))); + + // Check, that the count call also returns 1 + restPPreguntaCerradaMockMvc + .perform(get(ENTITY_API_URL + "/count?sort=id,desc&" + filter)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(content().string("1")); + } + + /** + * Executes the search, and checks that the default entity is not returned. + */ + private void defaultPPreguntaCerradaShouldNotBeFound(String filter) throws Exception { + restPPreguntaCerradaMockMvc + .perform(get(ENTITY_API_URL + "?sort=id,desc&" + filter)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$").isArray()) + .andExpect(jsonPath("$").isEmpty()); + + // Check, that the count call also returns 0 + restPPreguntaCerradaMockMvc + .perform(get(ENTITY_API_URL + "/count?sort=id,desc&" + filter)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(content().string("0")); + } + + @Test + @Transactional + void getNonExistingPPreguntaCerrada() throws Exception { + // Get the pPreguntaCerrada + restPPreguntaCerradaMockMvc.perform(get(ENTITY_API_URL_ID, Long.MAX_VALUE)).andExpect(status().isNotFound()); + } + + @Test + @Transactional + void putNewPPreguntaCerrada() throws Exception { + // Initialize the database + pPreguntaCerradaRepository.saveAndFlush(pPreguntaCerrada); + + int databaseSizeBeforeUpdate = pPreguntaCerradaRepository.findAll().size(); + + // Update the pPreguntaCerrada + PPreguntaCerrada updatedPPreguntaCerrada = pPreguntaCerradaRepository.findById(pPreguntaCerrada.getId()).get(); + // Disconnect from session so that the updates on updatedPPreguntaCerrada are not directly saved in db + em.detach(updatedPPreguntaCerrada); + updatedPPreguntaCerrada.nombre(UPDATED_NOMBRE).tipo(UPDATED_TIPO).opcional(UPDATED_OPCIONAL).orden(UPDATED_ORDEN); + + restPPreguntaCerradaMockMvc + .perform( + put(ENTITY_API_URL_ID, updatedPPreguntaCerrada.getId()) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(updatedPPreguntaCerrada)) + ) + .andExpect(status().isOk()); + + // Validate the PPreguntaCerrada in the database + List pPreguntaCerradaList = pPreguntaCerradaRepository.findAll(); + assertThat(pPreguntaCerradaList).hasSize(databaseSizeBeforeUpdate); + PPreguntaCerrada testPPreguntaCerrada = pPreguntaCerradaList.get(pPreguntaCerradaList.size() - 1); + assertThat(testPPreguntaCerrada.getNombre()).isEqualTo(UPDATED_NOMBRE); + assertThat(testPPreguntaCerrada.getTipo()).isEqualTo(UPDATED_TIPO); + assertThat(testPPreguntaCerrada.getOpcional()).isEqualTo(UPDATED_OPCIONAL); + assertThat(testPPreguntaCerrada.getOrden()).isEqualTo(UPDATED_ORDEN); + } + + @Test + @Transactional + void putNonExistingPPreguntaCerrada() throws Exception { + int databaseSizeBeforeUpdate = pPreguntaCerradaRepository.findAll().size(); + pPreguntaCerrada.setId(count.incrementAndGet()); + + // If the entity doesn't have an ID, it will throw BadRequestAlertException + restPPreguntaCerradaMockMvc + .perform( + put(ENTITY_API_URL_ID, pPreguntaCerrada.getId()) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(pPreguntaCerrada)) + ) + .andExpect(status().isBadRequest()); + + // Validate the PPreguntaCerrada in the database + List pPreguntaCerradaList = pPreguntaCerradaRepository.findAll(); + assertThat(pPreguntaCerradaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void putWithIdMismatchPPreguntaCerrada() throws Exception { + int databaseSizeBeforeUpdate = pPreguntaCerradaRepository.findAll().size(); + pPreguntaCerrada.setId(count.incrementAndGet()); + + // If url ID doesn't match entity ID, it will throw BadRequestAlertException + restPPreguntaCerradaMockMvc + .perform( + put(ENTITY_API_URL_ID, count.incrementAndGet()) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(pPreguntaCerrada)) + ) + .andExpect(status().isBadRequest()); + + // Validate the PPreguntaCerrada in the database + List pPreguntaCerradaList = pPreguntaCerradaRepository.findAll(); + assertThat(pPreguntaCerradaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void putWithMissingIdPathParamPPreguntaCerrada() throws Exception { + int databaseSizeBeforeUpdate = pPreguntaCerradaRepository.findAll().size(); + pPreguntaCerrada.setId(count.incrementAndGet()); + + // If url ID doesn't match entity ID, it will throw BadRequestAlertException + restPPreguntaCerradaMockMvc + .perform( + put(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(pPreguntaCerrada)) + ) + .andExpect(status().isMethodNotAllowed()); + + // Validate the PPreguntaCerrada in the database + List pPreguntaCerradaList = pPreguntaCerradaRepository.findAll(); + assertThat(pPreguntaCerradaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void partialUpdatePPreguntaCerradaWithPatch() throws Exception { + // Initialize the database + pPreguntaCerradaRepository.saveAndFlush(pPreguntaCerrada); + + int databaseSizeBeforeUpdate = pPreguntaCerradaRepository.findAll().size(); + + // Update the pPreguntaCerrada using partial update + PPreguntaCerrada partialUpdatedPPreguntaCerrada = new PPreguntaCerrada(); + partialUpdatedPPreguntaCerrada.setId(pPreguntaCerrada.getId()); + + partialUpdatedPPreguntaCerrada.nombre(UPDATED_NOMBRE).tipo(UPDATED_TIPO); + + restPPreguntaCerradaMockMvc + .perform( + patch(ENTITY_API_URL_ID, partialUpdatedPPreguntaCerrada.getId()) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(partialUpdatedPPreguntaCerrada)) + ) + .andExpect(status().isOk()); + + // Validate the PPreguntaCerrada in the database + List pPreguntaCerradaList = pPreguntaCerradaRepository.findAll(); + assertThat(pPreguntaCerradaList).hasSize(databaseSizeBeforeUpdate); + PPreguntaCerrada testPPreguntaCerrada = pPreguntaCerradaList.get(pPreguntaCerradaList.size() - 1); + assertThat(testPPreguntaCerrada.getNombre()).isEqualTo(UPDATED_NOMBRE); + assertThat(testPPreguntaCerrada.getTipo()).isEqualTo(UPDATED_TIPO); + assertThat(testPPreguntaCerrada.getOpcional()).isEqualTo(DEFAULT_OPCIONAL); + assertThat(testPPreguntaCerrada.getOrden()).isEqualTo(DEFAULT_ORDEN); + } + + @Test + @Transactional + void fullUpdatePPreguntaCerradaWithPatch() throws Exception { + // Initialize the database + pPreguntaCerradaRepository.saveAndFlush(pPreguntaCerrada); + + int databaseSizeBeforeUpdate = pPreguntaCerradaRepository.findAll().size(); + + // Update the pPreguntaCerrada using partial update + PPreguntaCerrada partialUpdatedPPreguntaCerrada = new PPreguntaCerrada(); + partialUpdatedPPreguntaCerrada.setId(pPreguntaCerrada.getId()); + + partialUpdatedPPreguntaCerrada.nombre(UPDATED_NOMBRE).tipo(UPDATED_TIPO).opcional(UPDATED_OPCIONAL).orden(UPDATED_ORDEN); + + restPPreguntaCerradaMockMvc + .perform( + patch(ENTITY_API_URL_ID, partialUpdatedPPreguntaCerrada.getId()) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(partialUpdatedPPreguntaCerrada)) + ) + .andExpect(status().isOk()); + + // Validate the PPreguntaCerrada in the database + List pPreguntaCerradaList = pPreguntaCerradaRepository.findAll(); + assertThat(pPreguntaCerradaList).hasSize(databaseSizeBeforeUpdate); + PPreguntaCerrada testPPreguntaCerrada = pPreguntaCerradaList.get(pPreguntaCerradaList.size() - 1); + assertThat(testPPreguntaCerrada.getNombre()).isEqualTo(UPDATED_NOMBRE); + assertThat(testPPreguntaCerrada.getTipo()).isEqualTo(UPDATED_TIPO); + assertThat(testPPreguntaCerrada.getOpcional()).isEqualTo(UPDATED_OPCIONAL); + assertThat(testPPreguntaCerrada.getOrden()).isEqualTo(UPDATED_ORDEN); + } + + @Test + @Transactional + void patchNonExistingPPreguntaCerrada() throws Exception { + int databaseSizeBeforeUpdate = pPreguntaCerradaRepository.findAll().size(); + pPreguntaCerrada.setId(count.incrementAndGet()); + + // If the entity doesn't have an ID, it will throw BadRequestAlertException + restPPreguntaCerradaMockMvc + .perform( + patch(ENTITY_API_URL_ID, pPreguntaCerrada.getId()) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(pPreguntaCerrada)) + ) + .andExpect(status().isBadRequest()); + + // Validate the PPreguntaCerrada in the database + List pPreguntaCerradaList = pPreguntaCerradaRepository.findAll(); + assertThat(pPreguntaCerradaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void patchWithIdMismatchPPreguntaCerrada() throws Exception { + int databaseSizeBeforeUpdate = pPreguntaCerradaRepository.findAll().size(); + pPreguntaCerrada.setId(count.incrementAndGet()); + + // If url ID doesn't match entity ID, it will throw BadRequestAlertException + restPPreguntaCerradaMockMvc + .perform( + patch(ENTITY_API_URL_ID, count.incrementAndGet()) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(pPreguntaCerrada)) + ) + .andExpect(status().isBadRequest()); + + // Validate the PPreguntaCerrada in the database + List pPreguntaCerradaList = pPreguntaCerradaRepository.findAll(); + assertThat(pPreguntaCerradaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void patchWithMissingIdPathParamPPreguntaCerrada() throws Exception { + int databaseSizeBeforeUpdate = pPreguntaCerradaRepository.findAll().size(); + pPreguntaCerrada.setId(count.incrementAndGet()); + + // If url ID doesn't match entity ID, it will throw BadRequestAlertException + restPPreguntaCerradaMockMvc + .perform( + patch(ENTITY_API_URL) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(pPreguntaCerrada)) + ) + .andExpect(status().isMethodNotAllowed()); + + // Validate the PPreguntaCerrada in the database + List pPreguntaCerradaList = pPreguntaCerradaRepository.findAll(); + assertThat(pPreguntaCerradaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void deletePPreguntaCerrada() throws Exception { + // Initialize the database + pPreguntaCerradaRepository.saveAndFlush(pPreguntaCerrada); + + int databaseSizeBeforeDelete = pPreguntaCerradaRepository.findAll().size(); + + // Delete the pPreguntaCerrada + restPPreguntaCerradaMockMvc + .perform(delete(ENTITY_API_URL_ID, pPreguntaCerrada.getId()).accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isNoContent()); + + // Validate the database contains one less item + List pPreguntaCerradaList = pPreguntaCerradaRepository.findAll(); + assertThat(pPreguntaCerradaList).hasSize(databaseSizeBeforeDelete - 1); + } +} diff --git a/src/test/java/org/datasurvey/web/rest/ParametroAplicacionResourceIT.java b/src/test/java/org/datasurvey/web/rest/ParametroAplicacionResourceIT.java new file mode 100644 index 0000000..4cfac94 --- /dev/null +++ b/src/test/java/org/datasurvey/web/rest/ParametroAplicacionResourceIT.java @@ -0,0 +1,979 @@ +package org.datasurvey.web.rest; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.hamcrest.Matchers.hasItem; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +import java.util.List; +import java.util.Random; +import java.util.concurrent.atomic.AtomicLong; +import javax.persistence.EntityManager; +import org.datasurvey.IntegrationTest; +import org.datasurvey.domain.ParametroAplicacion; +import org.datasurvey.repository.ParametroAplicacionRepository; +import org.datasurvey.service.criteria.ParametroAplicacionCriteria; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.http.MediaType; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.transaction.annotation.Transactional; + +/** + * Integration tests for the {@link ParametroAplicacionResource} REST controller. + */ +@IntegrationTest +@AutoConfigureMockMvc +@WithMockUser +class ParametroAplicacionResourceIT { + + private static final Integer DEFAULT_MAX_DIAS_ENCUESTA = 1; + private static final Integer UPDATED_MAX_DIAS_ENCUESTA = 2; + private static final Integer SMALLER_MAX_DIAS_ENCUESTA = 1 - 1; + + private static final Integer DEFAULT_MIN_DIAS_ENCUESTA = 1; + private static final Integer UPDATED_MIN_DIAS_ENCUESTA = 2; + private static final Integer SMALLER_MIN_DIAS_ENCUESTA = 1 - 1; + + private static final Integer DEFAULT_MAX_CANTIDAD_PREGUNTAS = 1; + private static final Integer UPDATED_MAX_CANTIDAD_PREGUNTAS = 2; + private static final Integer SMALLER_MAX_CANTIDAD_PREGUNTAS = 1 - 1; + + private static final Integer DEFAULT_MIN_CANTIDAD_PREGUNTAS = 1; + private static final Integer UPDATED_MIN_CANTIDAD_PREGUNTAS = 2; + private static final Integer SMALLER_MIN_CANTIDAD_PREGUNTAS = 1 - 1; + + private static final String ENTITY_API_URL = "/api/parametro-aplicacions"; + private static final String ENTITY_API_URL_ID = ENTITY_API_URL + "/{id}"; + + private static Random random = new Random(); + private static AtomicLong count = new AtomicLong(random.nextInt() + (2 * Integer.MAX_VALUE)); + + @Autowired + private ParametroAplicacionRepository parametroAplicacionRepository; + + @Autowired + private EntityManager em; + + @Autowired + private MockMvc restParametroAplicacionMockMvc; + + private ParametroAplicacion parametroAplicacion; + + /** + * Create an entity for this test. + * + * This is a static method, as tests for other entities might also need it, + * if they test an entity which requires the current entity. + */ + public static ParametroAplicacion createEntity(EntityManager em) { + ParametroAplicacion parametroAplicacion = new ParametroAplicacion() + .maxDiasEncuesta(DEFAULT_MAX_DIAS_ENCUESTA) + .minDiasEncuesta(DEFAULT_MIN_DIAS_ENCUESTA) + .maxCantidadPreguntas(DEFAULT_MAX_CANTIDAD_PREGUNTAS) + .minCantidadPreguntas(DEFAULT_MIN_CANTIDAD_PREGUNTAS); + return parametroAplicacion; + } + + /** + * Create an updated entity for this test. + * + * This is a static method, as tests for other entities might also need it, + * if they test an entity which requires the current entity. + */ + public static ParametroAplicacion createUpdatedEntity(EntityManager em) { + ParametroAplicacion parametroAplicacion = new ParametroAplicacion() + .maxDiasEncuesta(UPDATED_MAX_DIAS_ENCUESTA) + .minDiasEncuesta(UPDATED_MIN_DIAS_ENCUESTA) + .maxCantidadPreguntas(UPDATED_MAX_CANTIDAD_PREGUNTAS) + .minCantidadPreguntas(UPDATED_MIN_CANTIDAD_PREGUNTAS); + return parametroAplicacion; + } + + @BeforeEach + public void initTest() { + parametroAplicacion = createEntity(em); + } + + @Test + @Transactional + void createParametroAplicacion() throws Exception { + int databaseSizeBeforeCreate = parametroAplicacionRepository.findAll().size(); + // Create the ParametroAplicacion + restParametroAplicacionMockMvc + .perform( + post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(parametroAplicacion)) + ) + .andExpect(status().isCreated()); + + // Validate the ParametroAplicacion in the database + List parametroAplicacionList = parametroAplicacionRepository.findAll(); + assertThat(parametroAplicacionList).hasSize(databaseSizeBeforeCreate + 1); + ParametroAplicacion testParametroAplicacion = parametroAplicacionList.get(parametroAplicacionList.size() - 1); + assertThat(testParametroAplicacion.getMaxDiasEncuesta()).isEqualTo(DEFAULT_MAX_DIAS_ENCUESTA); + assertThat(testParametroAplicacion.getMinDiasEncuesta()).isEqualTo(DEFAULT_MIN_DIAS_ENCUESTA); + assertThat(testParametroAplicacion.getMaxCantidadPreguntas()).isEqualTo(DEFAULT_MAX_CANTIDAD_PREGUNTAS); + assertThat(testParametroAplicacion.getMinCantidadPreguntas()).isEqualTo(DEFAULT_MIN_CANTIDAD_PREGUNTAS); + } + + @Test + @Transactional + void createParametroAplicacionWithExistingId() throws Exception { + // Create the ParametroAplicacion with an existing ID + parametroAplicacion.setId(1L); + + int databaseSizeBeforeCreate = parametroAplicacionRepository.findAll().size(); + + // An entity with an existing ID cannot be created, so this API call must fail + restParametroAplicacionMockMvc + .perform( + post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(parametroAplicacion)) + ) + .andExpect(status().isBadRequest()); + + // Validate the ParametroAplicacion in the database + List parametroAplicacionList = parametroAplicacionRepository.findAll(); + assertThat(parametroAplicacionList).hasSize(databaseSizeBeforeCreate); + } + + @Test + @Transactional + void checkMaxDiasEncuestaIsRequired() throws Exception { + int databaseSizeBeforeTest = parametroAplicacionRepository.findAll().size(); + // set the field null + parametroAplicacion.setMaxDiasEncuesta(null); + + // Create the ParametroAplicacion, which fails. + + restParametroAplicacionMockMvc + .perform( + post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(parametroAplicacion)) + ) + .andExpect(status().isBadRequest()); + + List parametroAplicacionList = parametroAplicacionRepository.findAll(); + assertThat(parametroAplicacionList).hasSize(databaseSizeBeforeTest); + } + + @Test + @Transactional + void checkMinDiasEncuestaIsRequired() throws Exception { + int databaseSizeBeforeTest = parametroAplicacionRepository.findAll().size(); + // set the field null + parametroAplicacion.setMinDiasEncuesta(null); + + // Create the ParametroAplicacion, which fails. + + restParametroAplicacionMockMvc + .perform( + post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(parametroAplicacion)) + ) + .andExpect(status().isBadRequest()); + + List parametroAplicacionList = parametroAplicacionRepository.findAll(); + assertThat(parametroAplicacionList).hasSize(databaseSizeBeforeTest); + } + + @Test + @Transactional + void checkMaxCantidadPreguntasIsRequired() throws Exception { + int databaseSizeBeforeTest = parametroAplicacionRepository.findAll().size(); + // set the field null + parametroAplicacion.setMaxCantidadPreguntas(null); + + // Create the ParametroAplicacion, which fails. + + restParametroAplicacionMockMvc + .perform( + post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(parametroAplicacion)) + ) + .andExpect(status().isBadRequest()); + + List parametroAplicacionList = parametroAplicacionRepository.findAll(); + assertThat(parametroAplicacionList).hasSize(databaseSizeBeforeTest); + } + + @Test + @Transactional + void checkMinCantidadPreguntasIsRequired() throws Exception { + int databaseSizeBeforeTest = parametroAplicacionRepository.findAll().size(); + // set the field null + parametroAplicacion.setMinCantidadPreguntas(null); + + // Create the ParametroAplicacion, which fails. + + restParametroAplicacionMockMvc + .perform( + post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(parametroAplicacion)) + ) + .andExpect(status().isBadRequest()); + + List parametroAplicacionList = parametroAplicacionRepository.findAll(); + assertThat(parametroAplicacionList).hasSize(databaseSizeBeforeTest); + } + + @Test + @Transactional + void getAllParametroAplicacions() throws Exception { + // Initialize the database + parametroAplicacionRepository.saveAndFlush(parametroAplicacion); + + // Get all the parametroAplicacionList + restParametroAplicacionMockMvc + .perform(get(ENTITY_API_URL + "?sort=id,desc")) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.[*].id").value(hasItem(parametroAplicacion.getId().intValue()))) + .andExpect(jsonPath("$.[*].maxDiasEncuesta").value(hasItem(DEFAULT_MAX_DIAS_ENCUESTA))) + .andExpect(jsonPath("$.[*].minDiasEncuesta").value(hasItem(DEFAULT_MIN_DIAS_ENCUESTA))) + .andExpect(jsonPath("$.[*].maxCantidadPreguntas").value(hasItem(DEFAULT_MAX_CANTIDAD_PREGUNTAS))) + .andExpect(jsonPath("$.[*].minCantidadPreguntas").value(hasItem(DEFAULT_MIN_CANTIDAD_PREGUNTAS))); + } + + @Test + @Transactional + void getParametroAplicacion() throws Exception { + // Initialize the database + parametroAplicacionRepository.saveAndFlush(parametroAplicacion); + + // Get the parametroAplicacion + restParametroAplicacionMockMvc + .perform(get(ENTITY_API_URL_ID, parametroAplicacion.getId())) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.id").value(parametroAplicacion.getId().intValue())) + .andExpect(jsonPath("$.maxDiasEncuesta").value(DEFAULT_MAX_DIAS_ENCUESTA)) + .andExpect(jsonPath("$.minDiasEncuesta").value(DEFAULT_MIN_DIAS_ENCUESTA)) + .andExpect(jsonPath("$.maxCantidadPreguntas").value(DEFAULT_MAX_CANTIDAD_PREGUNTAS)) + .andExpect(jsonPath("$.minCantidadPreguntas").value(DEFAULT_MIN_CANTIDAD_PREGUNTAS)); + } + + @Test + @Transactional + void getParametroAplicacionsByIdFiltering() throws Exception { + // Initialize the database + parametroAplicacionRepository.saveAndFlush(parametroAplicacion); + + Long id = parametroAplicacion.getId(); + + defaultParametroAplicacionShouldBeFound("id.equals=" + id); + defaultParametroAplicacionShouldNotBeFound("id.notEquals=" + id); + + defaultParametroAplicacionShouldBeFound("id.greaterThanOrEqual=" + id); + defaultParametroAplicacionShouldNotBeFound("id.greaterThan=" + id); + + defaultParametroAplicacionShouldBeFound("id.lessThanOrEqual=" + id); + defaultParametroAplicacionShouldNotBeFound("id.lessThan=" + id); + } + + @Test + @Transactional + void getAllParametroAplicacionsByMaxDiasEncuestaIsEqualToSomething() throws Exception { + // Initialize the database + parametroAplicacionRepository.saveAndFlush(parametroAplicacion); + + // Get all the parametroAplicacionList where maxDiasEncuesta equals to DEFAULT_MAX_DIAS_ENCUESTA + defaultParametroAplicacionShouldBeFound("maxDiasEncuesta.equals=" + DEFAULT_MAX_DIAS_ENCUESTA); + + // Get all the parametroAplicacionList where maxDiasEncuesta equals to UPDATED_MAX_DIAS_ENCUESTA + defaultParametroAplicacionShouldNotBeFound("maxDiasEncuesta.equals=" + UPDATED_MAX_DIAS_ENCUESTA); + } + + @Test + @Transactional + void getAllParametroAplicacionsByMaxDiasEncuestaIsNotEqualToSomething() throws Exception { + // Initialize the database + parametroAplicacionRepository.saveAndFlush(parametroAplicacion); + + // Get all the parametroAplicacionList where maxDiasEncuesta not equals to DEFAULT_MAX_DIAS_ENCUESTA + defaultParametroAplicacionShouldNotBeFound("maxDiasEncuesta.notEquals=" + DEFAULT_MAX_DIAS_ENCUESTA); + + // Get all the parametroAplicacionList where maxDiasEncuesta not equals to UPDATED_MAX_DIAS_ENCUESTA + defaultParametroAplicacionShouldBeFound("maxDiasEncuesta.notEquals=" + UPDATED_MAX_DIAS_ENCUESTA); + } + + @Test + @Transactional + void getAllParametroAplicacionsByMaxDiasEncuestaIsInShouldWork() throws Exception { + // Initialize the database + parametroAplicacionRepository.saveAndFlush(parametroAplicacion); + + // Get all the parametroAplicacionList where maxDiasEncuesta in DEFAULT_MAX_DIAS_ENCUESTA or UPDATED_MAX_DIAS_ENCUESTA + defaultParametroAplicacionShouldBeFound("maxDiasEncuesta.in=" + DEFAULT_MAX_DIAS_ENCUESTA + "," + UPDATED_MAX_DIAS_ENCUESTA); + + // Get all the parametroAplicacionList where maxDiasEncuesta equals to UPDATED_MAX_DIAS_ENCUESTA + defaultParametroAplicacionShouldNotBeFound("maxDiasEncuesta.in=" + UPDATED_MAX_DIAS_ENCUESTA); + } + + @Test + @Transactional + void getAllParametroAplicacionsByMaxDiasEncuestaIsNullOrNotNull() throws Exception { + // Initialize the database + parametroAplicacionRepository.saveAndFlush(parametroAplicacion); + + // Get all the parametroAplicacionList where maxDiasEncuesta is not null + defaultParametroAplicacionShouldBeFound("maxDiasEncuesta.specified=true"); + + // Get all the parametroAplicacionList where maxDiasEncuesta is null + defaultParametroAplicacionShouldNotBeFound("maxDiasEncuesta.specified=false"); + } + + @Test + @Transactional + void getAllParametroAplicacionsByMaxDiasEncuestaIsGreaterThanOrEqualToSomething() throws Exception { + // Initialize the database + parametroAplicacionRepository.saveAndFlush(parametroAplicacion); + + // Get all the parametroAplicacionList where maxDiasEncuesta is greater than or equal to DEFAULT_MAX_DIAS_ENCUESTA + defaultParametroAplicacionShouldBeFound("maxDiasEncuesta.greaterThanOrEqual=" + DEFAULT_MAX_DIAS_ENCUESTA); + + // Get all the parametroAplicacionList where maxDiasEncuesta is greater than or equal to UPDATED_MAX_DIAS_ENCUESTA + defaultParametroAplicacionShouldNotBeFound("maxDiasEncuesta.greaterThanOrEqual=" + UPDATED_MAX_DIAS_ENCUESTA); + } + + @Test + @Transactional + void getAllParametroAplicacionsByMaxDiasEncuestaIsLessThanOrEqualToSomething() throws Exception { + // Initialize the database + parametroAplicacionRepository.saveAndFlush(parametroAplicacion); + + // Get all the parametroAplicacionList where maxDiasEncuesta is less than or equal to DEFAULT_MAX_DIAS_ENCUESTA + defaultParametroAplicacionShouldBeFound("maxDiasEncuesta.lessThanOrEqual=" + DEFAULT_MAX_DIAS_ENCUESTA); + + // Get all the parametroAplicacionList where maxDiasEncuesta is less than or equal to SMALLER_MAX_DIAS_ENCUESTA + defaultParametroAplicacionShouldNotBeFound("maxDiasEncuesta.lessThanOrEqual=" + SMALLER_MAX_DIAS_ENCUESTA); + } + + @Test + @Transactional + void getAllParametroAplicacionsByMaxDiasEncuestaIsLessThanSomething() throws Exception { + // Initialize the database + parametroAplicacionRepository.saveAndFlush(parametroAplicacion); + + // Get all the parametroAplicacionList where maxDiasEncuesta is less than DEFAULT_MAX_DIAS_ENCUESTA + defaultParametroAplicacionShouldNotBeFound("maxDiasEncuesta.lessThan=" + DEFAULT_MAX_DIAS_ENCUESTA); + + // Get all the parametroAplicacionList where maxDiasEncuesta is less than UPDATED_MAX_DIAS_ENCUESTA + defaultParametroAplicacionShouldBeFound("maxDiasEncuesta.lessThan=" + UPDATED_MAX_DIAS_ENCUESTA); + } + + @Test + @Transactional + void getAllParametroAplicacionsByMaxDiasEncuestaIsGreaterThanSomething() throws Exception { + // Initialize the database + parametroAplicacionRepository.saveAndFlush(parametroAplicacion); + + // Get all the parametroAplicacionList where maxDiasEncuesta is greater than DEFAULT_MAX_DIAS_ENCUESTA + defaultParametroAplicacionShouldNotBeFound("maxDiasEncuesta.greaterThan=" + DEFAULT_MAX_DIAS_ENCUESTA); + + // Get all the parametroAplicacionList where maxDiasEncuesta is greater than SMALLER_MAX_DIAS_ENCUESTA + defaultParametroAplicacionShouldBeFound("maxDiasEncuesta.greaterThan=" + SMALLER_MAX_DIAS_ENCUESTA); + } + + @Test + @Transactional + void getAllParametroAplicacionsByMinDiasEncuestaIsEqualToSomething() throws Exception { + // Initialize the database + parametroAplicacionRepository.saveAndFlush(parametroAplicacion); + + // Get all the parametroAplicacionList where minDiasEncuesta equals to DEFAULT_MIN_DIAS_ENCUESTA + defaultParametroAplicacionShouldBeFound("minDiasEncuesta.equals=" + DEFAULT_MIN_DIAS_ENCUESTA); + + // Get all the parametroAplicacionList where minDiasEncuesta equals to UPDATED_MIN_DIAS_ENCUESTA + defaultParametroAplicacionShouldNotBeFound("minDiasEncuesta.equals=" + UPDATED_MIN_DIAS_ENCUESTA); + } + + @Test + @Transactional + void getAllParametroAplicacionsByMinDiasEncuestaIsNotEqualToSomething() throws Exception { + // Initialize the database + parametroAplicacionRepository.saveAndFlush(parametroAplicacion); + + // Get all the parametroAplicacionList where minDiasEncuesta not equals to DEFAULT_MIN_DIAS_ENCUESTA + defaultParametroAplicacionShouldNotBeFound("minDiasEncuesta.notEquals=" + DEFAULT_MIN_DIAS_ENCUESTA); + + // Get all the parametroAplicacionList where minDiasEncuesta not equals to UPDATED_MIN_DIAS_ENCUESTA + defaultParametroAplicacionShouldBeFound("minDiasEncuesta.notEquals=" + UPDATED_MIN_DIAS_ENCUESTA); + } + + @Test + @Transactional + void getAllParametroAplicacionsByMinDiasEncuestaIsInShouldWork() throws Exception { + // Initialize the database + parametroAplicacionRepository.saveAndFlush(parametroAplicacion); + + // Get all the parametroAplicacionList where minDiasEncuesta in DEFAULT_MIN_DIAS_ENCUESTA or UPDATED_MIN_DIAS_ENCUESTA + defaultParametroAplicacionShouldBeFound("minDiasEncuesta.in=" + DEFAULT_MIN_DIAS_ENCUESTA + "," + UPDATED_MIN_DIAS_ENCUESTA); + + // Get all the parametroAplicacionList where minDiasEncuesta equals to UPDATED_MIN_DIAS_ENCUESTA + defaultParametroAplicacionShouldNotBeFound("minDiasEncuesta.in=" + UPDATED_MIN_DIAS_ENCUESTA); + } + + @Test + @Transactional + void getAllParametroAplicacionsByMinDiasEncuestaIsNullOrNotNull() throws Exception { + // Initialize the database + parametroAplicacionRepository.saveAndFlush(parametroAplicacion); + + // Get all the parametroAplicacionList where minDiasEncuesta is not null + defaultParametroAplicacionShouldBeFound("minDiasEncuesta.specified=true"); + + // Get all the parametroAplicacionList where minDiasEncuesta is null + defaultParametroAplicacionShouldNotBeFound("minDiasEncuesta.specified=false"); + } + + @Test + @Transactional + void getAllParametroAplicacionsByMinDiasEncuestaIsGreaterThanOrEqualToSomething() throws Exception { + // Initialize the database + parametroAplicacionRepository.saveAndFlush(parametroAplicacion); + + // Get all the parametroAplicacionList where minDiasEncuesta is greater than or equal to DEFAULT_MIN_DIAS_ENCUESTA + defaultParametroAplicacionShouldBeFound("minDiasEncuesta.greaterThanOrEqual=" + DEFAULT_MIN_DIAS_ENCUESTA); + + // Get all the parametroAplicacionList where minDiasEncuesta is greater than or equal to UPDATED_MIN_DIAS_ENCUESTA + defaultParametroAplicacionShouldNotBeFound("minDiasEncuesta.greaterThanOrEqual=" + UPDATED_MIN_DIAS_ENCUESTA); + } + + @Test + @Transactional + void getAllParametroAplicacionsByMinDiasEncuestaIsLessThanOrEqualToSomething() throws Exception { + // Initialize the database + parametroAplicacionRepository.saveAndFlush(parametroAplicacion); + + // Get all the parametroAplicacionList where minDiasEncuesta is less than or equal to DEFAULT_MIN_DIAS_ENCUESTA + defaultParametroAplicacionShouldBeFound("minDiasEncuesta.lessThanOrEqual=" + DEFAULT_MIN_DIAS_ENCUESTA); + + // Get all the parametroAplicacionList where minDiasEncuesta is less than or equal to SMALLER_MIN_DIAS_ENCUESTA + defaultParametroAplicacionShouldNotBeFound("minDiasEncuesta.lessThanOrEqual=" + SMALLER_MIN_DIAS_ENCUESTA); + } + + @Test + @Transactional + void getAllParametroAplicacionsByMinDiasEncuestaIsLessThanSomething() throws Exception { + // Initialize the database + parametroAplicacionRepository.saveAndFlush(parametroAplicacion); + + // Get all the parametroAplicacionList where minDiasEncuesta is less than DEFAULT_MIN_DIAS_ENCUESTA + defaultParametroAplicacionShouldNotBeFound("minDiasEncuesta.lessThan=" + DEFAULT_MIN_DIAS_ENCUESTA); + + // Get all the parametroAplicacionList where minDiasEncuesta is less than UPDATED_MIN_DIAS_ENCUESTA + defaultParametroAplicacionShouldBeFound("minDiasEncuesta.lessThan=" + UPDATED_MIN_DIAS_ENCUESTA); + } + + @Test + @Transactional + void getAllParametroAplicacionsByMinDiasEncuestaIsGreaterThanSomething() throws Exception { + // Initialize the database + parametroAplicacionRepository.saveAndFlush(parametroAplicacion); + + // Get all the parametroAplicacionList where minDiasEncuesta is greater than DEFAULT_MIN_DIAS_ENCUESTA + defaultParametroAplicacionShouldNotBeFound("minDiasEncuesta.greaterThan=" + DEFAULT_MIN_DIAS_ENCUESTA); + + // Get all the parametroAplicacionList where minDiasEncuesta is greater than SMALLER_MIN_DIAS_ENCUESTA + defaultParametroAplicacionShouldBeFound("minDiasEncuesta.greaterThan=" + SMALLER_MIN_DIAS_ENCUESTA); + } + + @Test + @Transactional + void getAllParametroAplicacionsByMaxCantidadPreguntasIsEqualToSomething() throws Exception { + // Initialize the database + parametroAplicacionRepository.saveAndFlush(parametroAplicacion); + + // Get all the parametroAplicacionList where maxCantidadPreguntas equals to DEFAULT_MAX_CANTIDAD_PREGUNTAS + defaultParametroAplicacionShouldBeFound("maxCantidadPreguntas.equals=" + DEFAULT_MAX_CANTIDAD_PREGUNTAS); + + // Get all the parametroAplicacionList where maxCantidadPreguntas equals to UPDATED_MAX_CANTIDAD_PREGUNTAS + defaultParametroAplicacionShouldNotBeFound("maxCantidadPreguntas.equals=" + UPDATED_MAX_CANTIDAD_PREGUNTAS); + } + + @Test + @Transactional + void getAllParametroAplicacionsByMaxCantidadPreguntasIsNotEqualToSomething() throws Exception { + // Initialize the database + parametroAplicacionRepository.saveAndFlush(parametroAplicacion); + + // Get all the parametroAplicacionList where maxCantidadPreguntas not equals to DEFAULT_MAX_CANTIDAD_PREGUNTAS + defaultParametroAplicacionShouldNotBeFound("maxCantidadPreguntas.notEquals=" + DEFAULT_MAX_CANTIDAD_PREGUNTAS); + + // Get all the parametroAplicacionList where maxCantidadPreguntas not equals to UPDATED_MAX_CANTIDAD_PREGUNTAS + defaultParametroAplicacionShouldBeFound("maxCantidadPreguntas.notEquals=" + UPDATED_MAX_CANTIDAD_PREGUNTAS); + } + + @Test + @Transactional + void getAllParametroAplicacionsByMaxCantidadPreguntasIsInShouldWork() throws Exception { + // Initialize the database + parametroAplicacionRepository.saveAndFlush(parametroAplicacion); + + // Get all the parametroAplicacionList where maxCantidadPreguntas in DEFAULT_MAX_CANTIDAD_PREGUNTAS or UPDATED_MAX_CANTIDAD_PREGUNTAS + defaultParametroAplicacionShouldBeFound( + "maxCantidadPreguntas.in=" + DEFAULT_MAX_CANTIDAD_PREGUNTAS + "," + UPDATED_MAX_CANTIDAD_PREGUNTAS + ); + + // Get all the parametroAplicacionList where maxCantidadPreguntas equals to UPDATED_MAX_CANTIDAD_PREGUNTAS + defaultParametroAplicacionShouldNotBeFound("maxCantidadPreguntas.in=" + UPDATED_MAX_CANTIDAD_PREGUNTAS); + } + + @Test + @Transactional + void getAllParametroAplicacionsByMaxCantidadPreguntasIsNullOrNotNull() throws Exception { + // Initialize the database + parametroAplicacionRepository.saveAndFlush(parametroAplicacion); + + // Get all the parametroAplicacionList where maxCantidadPreguntas is not null + defaultParametroAplicacionShouldBeFound("maxCantidadPreguntas.specified=true"); + + // Get all the parametroAplicacionList where maxCantidadPreguntas is null + defaultParametroAplicacionShouldNotBeFound("maxCantidadPreguntas.specified=false"); + } + + @Test + @Transactional + void getAllParametroAplicacionsByMaxCantidadPreguntasIsGreaterThanOrEqualToSomething() throws Exception { + // Initialize the database + parametroAplicacionRepository.saveAndFlush(parametroAplicacion); + + // Get all the parametroAplicacionList where maxCantidadPreguntas is greater than or equal to DEFAULT_MAX_CANTIDAD_PREGUNTAS + defaultParametroAplicacionShouldBeFound("maxCantidadPreguntas.greaterThanOrEqual=" + DEFAULT_MAX_CANTIDAD_PREGUNTAS); + + // Get all the parametroAplicacionList where maxCantidadPreguntas is greater than or equal to UPDATED_MAX_CANTIDAD_PREGUNTAS + defaultParametroAplicacionShouldNotBeFound("maxCantidadPreguntas.greaterThanOrEqual=" + UPDATED_MAX_CANTIDAD_PREGUNTAS); + } + + @Test + @Transactional + void getAllParametroAplicacionsByMaxCantidadPreguntasIsLessThanOrEqualToSomething() throws Exception { + // Initialize the database + parametroAplicacionRepository.saveAndFlush(parametroAplicacion); + + // Get all the parametroAplicacionList where maxCantidadPreguntas is less than or equal to DEFAULT_MAX_CANTIDAD_PREGUNTAS + defaultParametroAplicacionShouldBeFound("maxCantidadPreguntas.lessThanOrEqual=" + DEFAULT_MAX_CANTIDAD_PREGUNTAS); + + // Get all the parametroAplicacionList where maxCantidadPreguntas is less than or equal to SMALLER_MAX_CANTIDAD_PREGUNTAS + defaultParametroAplicacionShouldNotBeFound("maxCantidadPreguntas.lessThanOrEqual=" + SMALLER_MAX_CANTIDAD_PREGUNTAS); + } + + @Test + @Transactional + void getAllParametroAplicacionsByMaxCantidadPreguntasIsLessThanSomething() throws Exception { + // Initialize the database + parametroAplicacionRepository.saveAndFlush(parametroAplicacion); + + // Get all the parametroAplicacionList where maxCantidadPreguntas is less than DEFAULT_MAX_CANTIDAD_PREGUNTAS + defaultParametroAplicacionShouldNotBeFound("maxCantidadPreguntas.lessThan=" + DEFAULT_MAX_CANTIDAD_PREGUNTAS); + + // Get all the parametroAplicacionList where maxCantidadPreguntas is less than UPDATED_MAX_CANTIDAD_PREGUNTAS + defaultParametroAplicacionShouldBeFound("maxCantidadPreguntas.lessThan=" + UPDATED_MAX_CANTIDAD_PREGUNTAS); + } + + @Test + @Transactional + void getAllParametroAplicacionsByMaxCantidadPreguntasIsGreaterThanSomething() throws Exception { + // Initialize the database + parametroAplicacionRepository.saveAndFlush(parametroAplicacion); + + // Get all the parametroAplicacionList where maxCantidadPreguntas is greater than DEFAULT_MAX_CANTIDAD_PREGUNTAS + defaultParametroAplicacionShouldNotBeFound("maxCantidadPreguntas.greaterThan=" + DEFAULT_MAX_CANTIDAD_PREGUNTAS); + + // Get all the parametroAplicacionList where maxCantidadPreguntas is greater than SMALLER_MAX_CANTIDAD_PREGUNTAS + defaultParametroAplicacionShouldBeFound("maxCantidadPreguntas.greaterThan=" + SMALLER_MAX_CANTIDAD_PREGUNTAS); + } + + @Test + @Transactional + void getAllParametroAplicacionsByMinCantidadPreguntasIsEqualToSomething() throws Exception { + // Initialize the database + parametroAplicacionRepository.saveAndFlush(parametroAplicacion); + + // Get all the parametroAplicacionList where minCantidadPreguntas equals to DEFAULT_MIN_CANTIDAD_PREGUNTAS + defaultParametroAplicacionShouldBeFound("minCantidadPreguntas.equals=" + DEFAULT_MIN_CANTIDAD_PREGUNTAS); + + // Get all the parametroAplicacionList where minCantidadPreguntas equals to UPDATED_MIN_CANTIDAD_PREGUNTAS + defaultParametroAplicacionShouldNotBeFound("minCantidadPreguntas.equals=" + UPDATED_MIN_CANTIDAD_PREGUNTAS); + } + + @Test + @Transactional + void getAllParametroAplicacionsByMinCantidadPreguntasIsNotEqualToSomething() throws Exception { + // Initialize the database + parametroAplicacionRepository.saveAndFlush(parametroAplicacion); + + // Get all the parametroAplicacionList where minCantidadPreguntas not equals to DEFAULT_MIN_CANTIDAD_PREGUNTAS + defaultParametroAplicacionShouldNotBeFound("minCantidadPreguntas.notEquals=" + DEFAULT_MIN_CANTIDAD_PREGUNTAS); + + // Get all the parametroAplicacionList where minCantidadPreguntas not equals to UPDATED_MIN_CANTIDAD_PREGUNTAS + defaultParametroAplicacionShouldBeFound("minCantidadPreguntas.notEquals=" + UPDATED_MIN_CANTIDAD_PREGUNTAS); + } + + @Test + @Transactional + void getAllParametroAplicacionsByMinCantidadPreguntasIsInShouldWork() throws Exception { + // Initialize the database + parametroAplicacionRepository.saveAndFlush(parametroAplicacion); + + // Get all the parametroAplicacionList where minCantidadPreguntas in DEFAULT_MIN_CANTIDAD_PREGUNTAS or UPDATED_MIN_CANTIDAD_PREGUNTAS + defaultParametroAplicacionShouldBeFound( + "minCantidadPreguntas.in=" + DEFAULT_MIN_CANTIDAD_PREGUNTAS + "," + UPDATED_MIN_CANTIDAD_PREGUNTAS + ); + + // Get all the parametroAplicacionList where minCantidadPreguntas equals to UPDATED_MIN_CANTIDAD_PREGUNTAS + defaultParametroAplicacionShouldNotBeFound("minCantidadPreguntas.in=" + UPDATED_MIN_CANTIDAD_PREGUNTAS); + } + + @Test + @Transactional + void getAllParametroAplicacionsByMinCantidadPreguntasIsNullOrNotNull() throws Exception { + // Initialize the database + parametroAplicacionRepository.saveAndFlush(parametroAplicacion); + + // Get all the parametroAplicacionList where minCantidadPreguntas is not null + defaultParametroAplicacionShouldBeFound("minCantidadPreguntas.specified=true"); + + // Get all the parametroAplicacionList where minCantidadPreguntas is null + defaultParametroAplicacionShouldNotBeFound("minCantidadPreguntas.specified=false"); + } + + @Test + @Transactional + void getAllParametroAplicacionsByMinCantidadPreguntasIsGreaterThanOrEqualToSomething() throws Exception { + // Initialize the database + parametroAplicacionRepository.saveAndFlush(parametroAplicacion); + + // Get all the parametroAplicacionList where minCantidadPreguntas is greater than or equal to DEFAULT_MIN_CANTIDAD_PREGUNTAS + defaultParametroAplicacionShouldBeFound("minCantidadPreguntas.greaterThanOrEqual=" + DEFAULT_MIN_CANTIDAD_PREGUNTAS); + + // Get all the parametroAplicacionList where minCantidadPreguntas is greater than or equal to UPDATED_MIN_CANTIDAD_PREGUNTAS + defaultParametroAplicacionShouldNotBeFound("minCantidadPreguntas.greaterThanOrEqual=" + UPDATED_MIN_CANTIDAD_PREGUNTAS); + } + + @Test + @Transactional + void getAllParametroAplicacionsByMinCantidadPreguntasIsLessThanOrEqualToSomething() throws Exception { + // Initialize the database + parametroAplicacionRepository.saveAndFlush(parametroAplicacion); + + // Get all the parametroAplicacionList where minCantidadPreguntas is less than or equal to DEFAULT_MIN_CANTIDAD_PREGUNTAS + defaultParametroAplicacionShouldBeFound("minCantidadPreguntas.lessThanOrEqual=" + DEFAULT_MIN_CANTIDAD_PREGUNTAS); + + // Get all the parametroAplicacionList where minCantidadPreguntas is less than or equal to SMALLER_MIN_CANTIDAD_PREGUNTAS + defaultParametroAplicacionShouldNotBeFound("minCantidadPreguntas.lessThanOrEqual=" + SMALLER_MIN_CANTIDAD_PREGUNTAS); + } + + @Test + @Transactional + void getAllParametroAplicacionsByMinCantidadPreguntasIsLessThanSomething() throws Exception { + // Initialize the database + parametroAplicacionRepository.saveAndFlush(parametroAplicacion); + + // Get all the parametroAplicacionList where minCantidadPreguntas is less than DEFAULT_MIN_CANTIDAD_PREGUNTAS + defaultParametroAplicacionShouldNotBeFound("minCantidadPreguntas.lessThan=" + DEFAULT_MIN_CANTIDAD_PREGUNTAS); + + // Get all the parametroAplicacionList where minCantidadPreguntas is less than UPDATED_MIN_CANTIDAD_PREGUNTAS + defaultParametroAplicacionShouldBeFound("minCantidadPreguntas.lessThan=" + UPDATED_MIN_CANTIDAD_PREGUNTAS); + } + + @Test + @Transactional + void getAllParametroAplicacionsByMinCantidadPreguntasIsGreaterThanSomething() throws Exception { + // Initialize the database + parametroAplicacionRepository.saveAndFlush(parametroAplicacion); + + // Get all the parametroAplicacionList where minCantidadPreguntas is greater than DEFAULT_MIN_CANTIDAD_PREGUNTAS + defaultParametroAplicacionShouldNotBeFound("minCantidadPreguntas.greaterThan=" + DEFAULT_MIN_CANTIDAD_PREGUNTAS); + + // Get all the parametroAplicacionList where minCantidadPreguntas is greater than SMALLER_MIN_CANTIDAD_PREGUNTAS + defaultParametroAplicacionShouldBeFound("minCantidadPreguntas.greaterThan=" + SMALLER_MIN_CANTIDAD_PREGUNTAS); + } + + /** + * Executes the search, and checks that the default entity is returned. + */ + private void defaultParametroAplicacionShouldBeFound(String filter) throws Exception { + restParametroAplicacionMockMvc + .perform(get(ENTITY_API_URL + "?sort=id,desc&" + filter)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.[*].id").value(hasItem(parametroAplicacion.getId().intValue()))) + .andExpect(jsonPath("$.[*].maxDiasEncuesta").value(hasItem(DEFAULT_MAX_DIAS_ENCUESTA))) + .andExpect(jsonPath("$.[*].minDiasEncuesta").value(hasItem(DEFAULT_MIN_DIAS_ENCUESTA))) + .andExpect(jsonPath("$.[*].maxCantidadPreguntas").value(hasItem(DEFAULT_MAX_CANTIDAD_PREGUNTAS))) + .andExpect(jsonPath("$.[*].minCantidadPreguntas").value(hasItem(DEFAULT_MIN_CANTIDAD_PREGUNTAS))); + + // Check, that the count call also returns 1 + restParametroAplicacionMockMvc + .perform(get(ENTITY_API_URL + "/count?sort=id,desc&" + filter)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(content().string("1")); + } + + /** + * Executes the search, and checks that the default entity is not returned. + */ + private void defaultParametroAplicacionShouldNotBeFound(String filter) throws Exception { + restParametroAplicacionMockMvc + .perform(get(ENTITY_API_URL + "?sort=id,desc&" + filter)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$").isArray()) + .andExpect(jsonPath("$").isEmpty()); + + // Check, that the count call also returns 0 + restParametroAplicacionMockMvc + .perform(get(ENTITY_API_URL + "/count?sort=id,desc&" + filter)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(content().string("0")); + } + + @Test + @Transactional + void getNonExistingParametroAplicacion() throws Exception { + // Get the parametroAplicacion + restParametroAplicacionMockMvc.perform(get(ENTITY_API_URL_ID, Long.MAX_VALUE)).andExpect(status().isNotFound()); + } + + @Test + @Transactional + void putNewParametroAplicacion() throws Exception { + // Initialize the database + parametroAplicacionRepository.saveAndFlush(parametroAplicacion); + + int databaseSizeBeforeUpdate = parametroAplicacionRepository.findAll().size(); + + // Update the parametroAplicacion + ParametroAplicacion updatedParametroAplicacion = parametroAplicacionRepository.findById(parametroAplicacion.getId()).get(); + // Disconnect from session so that the updates on updatedParametroAplicacion are not directly saved in db + em.detach(updatedParametroAplicacion); + updatedParametroAplicacion + .maxDiasEncuesta(UPDATED_MAX_DIAS_ENCUESTA) + .minDiasEncuesta(UPDATED_MIN_DIAS_ENCUESTA) + .maxCantidadPreguntas(UPDATED_MAX_CANTIDAD_PREGUNTAS) + .minCantidadPreguntas(UPDATED_MIN_CANTIDAD_PREGUNTAS); + + restParametroAplicacionMockMvc + .perform( + put(ENTITY_API_URL_ID, updatedParametroAplicacion.getId()) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(updatedParametroAplicacion)) + ) + .andExpect(status().isOk()); + + // Validate the ParametroAplicacion in the database + List parametroAplicacionList = parametroAplicacionRepository.findAll(); + assertThat(parametroAplicacionList).hasSize(databaseSizeBeforeUpdate); + ParametroAplicacion testParametroAplicacion = parametroAplicacionList.get(parametroAplicacionList.size() - 1); + assertThat(testParametroAplicacion.getMaxDiasEncuesta()).isEqualTo(UPDATED_MAX_DIAS_ENCUESTA); + assertThat(testParametroAplicacion.getMinDiasEncuesta()).isEqualTo(UPDATED_MIN_DIAS_ENCUESTA); + assertThat(testParametroAplicacion.getMaxCantidadPreguntas()).isEqualTo(UPDATED_MAX_CANTIDAD_PREGUNTAS); + assertThat(testParametroAplicacion.getMinCantidadPreguntas()).isEqualTo(UPDATED_MIN_CANTIDAD_PREGUNTAS); + } + + @Test + @Transactional + void putNonExistingParametroAplicacion() throws Exception { + int databaseSizeBeforeUpdate = parametroAplicacionRepository.findAll().size(); + parametroAplicacion.setId(count.incrementAndGet()); + + // If the entity doesn't have an ID, it will throw BadRequestAlertException + restParametroAplicacionMockMvc + .perform( + put(ENTITY_API_URL_ID, parametroAplicacion.getId()) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(parametroAplicacion)) + ) + .andExpect(status().isBadRequest()); + + // Validate the ParametroAplicacion in the database + List parametroAplicacionList = parametroAplicacionRepository.findAll(); + assertThat(parametroAplicacionList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void putWithIdMismatchParametroAplicacion() throws Exception { + int databaseSizeBeforeUpdate = parametroAplicacionRepository.findAll().size(); + parametroAplicacion.setId(count.incrementAndGet()); + + // If url ID doesn't match entity ID, it will throw BadRequestAlertException + restParametroAplicacionMockMvc + .perform( + put(ENTITY_API_URL_ID, count.incrementAndGet()) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(parametroAplicacion)) + ) + .andExpect(status().isBadRequest()); + + // Validate the ParametroAplicacion in the database + List parametroAplicacionList = parametroAplicacionRepository.findAll(); + assertThat(parametroAplicacionList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void putWithMissingIdPathParamParametroAplicacion() throws Exception { + int databaseSizeBeforeUpdate = parametroAplicacionRepository.findAll().size(); + parametroAplicacion.setId(count.incrementAndGet()); + + // If url ID doesn't match entity ID, it will throw BadRequestAlertException + restParametroAplicacionMockMvc + .perform( + put(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(parametroAplicacion)) + ) + .andExpect(status().isMethodNotAllowed()); + + // Validate the ParametroAplicacion in the database + List parametroAplicacionList = parametroAplicacionRepository.findAll(); + assertThat(parametroAplicacionList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void partialUpdateParametroAplicacionWithPatch() throws Exception { + // Initialize the database + parametroAplicacionRepository.saveAndFlush(parametroAplicacion); + + int databaseSizeBeforeUpdate = parametroAplicacionRepository.findAll().size(); + + // Update the parametroAplicacion using partial update + ParametroAplicacion partialUpdatedParametroAplicacion = new ParametroAplicacion(); + partialUpdatedParametroAplicacion.setId(parametroAplicacion.getId()); + + partialUpdatedParametroAplicacion.maxDiasEncuesta(UPDATED_MAX_DIAS_ENCUESTA).maxCantidadPreguntas(UPDATED_MAX_CANTIDAD_PREGUNTAS); + + restParametroAplicacionMockMvc + .perform( + patch(ENTITY_API_URL_ID, partialUpdatedParametroAplicacion.getId()) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(partialUpdatedParametroAplicacion)) + ) + .andExpect(status().isOk()); + + // Validate the ParametroAplicacion in the database + List parametroAplicacionList = parametroAplicacionRepository.findAll(); + assertThat(parametroAplicacionList).hasSize(databaseSizeBeforeUpdate); + ParametroAplicacion testParametroAplicacion = parametroAplicacionList.get(parametroAplicacionList.size() - 1); + assertThat(testParametroAplicacion.getMaxDiasEncuesta()).isEqualTo(UPDATED_MAX_DIAS_ENCUESTA); + assertThat(testParametroAplicacion.getMinDiasEncuesta()).isEqualTo(DEFAULT_MIN_DIAS_ENCUESTA); + assertThat(testParametroAplicacion.getMaxCantidadPreguntas()).isEqualTo(UPDATED_MAX_CANTIDAD_PREGUNTAS); + assertThat(testParametroAplicacion.getMinCantidadPreguntas()).isEqualTo(DEFAULT_MIN_CANTIDAD_PREGUNTAS); + } + + @Test + @Transactional + void fullUpdateParametroAplicacionWithPatch() throws Exception { + // Initialize the database + parametroAplicacionRepository.saveAndFlush(parametroAplicacion); + + int databaseSizeBeforeUpdate = parametroAplicacionRepository.findAll().size(); + + // Update the parametroAplicacion using partial update + ParametroAplicacion partialUpdatedParametroAplicacion = new ParametroAplicacion(); + partialUpdatedParametroAplicacion.setId(parametroAplicacion.getId()); + + partialUpdatedParametroAplicacion + .maxDiasEncuesta(UPDATED_MAX_DIAS_ENCUESTA) + .minDiasEncuesta(UPDATED_MIN_DIAS_ENCUESTA) + .maxCantidadPreguntas(UPDATED_MAX_CANTIDAD_PREGUNTAS) + .minCantidadPreguntas(UPDATED_MIN_CANTIDAD_PREGUNTAS); + + restParametroAplicacionMockMvc + .perform( + patch(ENTITY_API_URL_ID, partialUpdatedParametroAplicacion.getId()) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(partialUpdatedParametroAplicacion)) + ) + .andExpect(status().isOk()); + + // Validate the ParametroAplicacion in the database + List parametroAplicacionList = parametroAplicacionRepository.findAll(); + assertThat(parametroAplicacionList).hasSize(databaseSizeBeforeUpdate); + ParametroAplicacion testParametroAplicacion = parametroAplicacionList.get(parametroAplicacionList.size() - 1); + assertThat(testParametroAplicacion.getMaxDiasEncuesta()).isEqualTo(UPDATED_MAX_DIAS_ENCUESTA); + assertThat(testParametroAplicacion.getMinDiasEncuesta()).isEqualTo(UPDATED_MIN_DIAS_ENCUESTA); + assertThat(testParametroAplicacion.getMaxCantidadPreguntas()).isEqualTo(UPDATED_MAX_CANTIDAD_PREGUNTAS); + assertThat(testParametroAplicacion.getMinCantidadPreguntas()).isEqualTo(UPDATED_MIN_CANTIDAD_PREGUNTAS); + } + + @Test + @Transactional + void patchNonExistingParametroAplicacion() throws Exception { + int databaseSizeBeforeUpdate = parametroAplicacionRepository.findAll().size(); + parametroAplicacion.setId(count.incrementAndGet()); + + // If the entity doesn't have an ID, it will throw BadRequestAlertException + restParametroAplicacionMockMvc + .perform( + patch(ENTITY_API_URL_ID, parametroAplicacion.getId()) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(parametroAplicacion)) + ) + .andExpect(status().isBadRequest()); + + // Validate the ParametroAplicacion in the database + List parametroAplicacionList = parametroAplicacionRepository.findAll(); + assertThat(parametroAplicacionList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void patchWithIdMismatchParametroAplicacion() throws Exception { + int databaseSizeBeforeUpdate = parametroAplicacionRepository.findAll().size(); + parametroAplicacion.setId(count.incrementAndGet()); + + // If url ID doesn't match entity ID, it will throw BadRequestAlertException + restParametroAplicacionMockMvc + .perform( + patch(ENTITY_API_URL_ID, count.incrementAndGet()) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(parametroAplicacion)) + ) + .andExpect(status().isBadRequest()); + + // Validate the ParametroAplicacion in the database + List parametroAplicacionList = parametroAplicacionRepository.findAll(); + assertThat(parametroAplicacionList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void patchWithMissingIdPathParamParametroAplicacion() throws Exception { + int databaseSizeBeforeUpdate = parametroAplicacionRepository.findAll().size(); + parametroAplicacion.setId(count.incrementAndGet()); + + // If url ID doesn't match entity ID, it will throw BadRequestAlertException + restParametroAplicacionMockMvc + .perform( + patch(ENTITY_API_URL) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(parametroAplicacion)) + ) + .andExpect(status().isMethodNotAllowed()); + + // Validate the ParametroAplicacion in the database + List parametroAplicacionList = parametroAplicacionRepository.findAll(); + assertThat(parametroAplicacionList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void deleteParametroAplicacion() throws Exception { + // Initialize the database + parametroAplicacionRepository.saveAndFlush(parametroAplicacion); + + int databaseSizeBeforeDelete = parametroAplicacionRepository.findAll().size(); + + // Delete the parametroAplicacion + restParametroAplicacionMockMvc + .perform(delete(ENTITY_API_URL_ID, parametroAplicacion.getId()).accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isNoContent()); + + // Validate the database contains one less item + List parametroAplicacionList = parametroAplicacionRepository.findAll(); + assertThat(parametroAplicacionList).hasSize(databaseSizeBeforeDelete - 1); + } +} diff --git a/src/test/java/org/datasurvey/web/rest/PlantillaResourceIT.java b/src/test/java/org/datasurvey/web/rest/PlantillaResourceIT.java new file mode 100644 index 0000000..e226bac --- /dev/null +++ b/src/test/java/org/datasurvey/web/rest/PlantillaResourceIT.java @@ -0,0 +1,1164 @@ +package org.datasurvey.web.rest; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.datasurvey.web.rest.TestUtil.sameInstant; +import static org.hamcrest.Matchers.hasItem; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +import java.time.Instant; +import java.time.ZoneId; +import java.time.ZoneOffset; +import java.time.ZonedDateTime; +import java.util.List; +import java.util.Random; +import java.util.concurrent.atomic.AtomicLong; +import javax.persistence.EntityManager; +import org.datasurvey.IntegrationTest; +import org.datasurvey.domain.Categoria; +import org.datasurvey.domain.PPreguntaAbierta; +import org.datasurvey.domain.PPreguntaCerrada; +import org.datasurvey.domain.Plantilla; +import org.datasurvey.domain.UsuarioExtra; +import org.datasurvey.domain.enumeration.EstadoPlantilla; +import org.datasurvey.repository.PlantillaRepository; +import org.datasurvey.service.criteria.PlantillaCriteria; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.http.MediaType; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.transaction.annotation.Transactional; + +/** + * Integration tests for the {@link PlantillaResource} REST controller. + */ +@IntegrationTest +@AutoConfigureMockMvc +@WithMockUser +class PlantillaResourceIT { + + private static final String DEFAULT_NOMBRE = "AAAAAAAAAA"; + private static final String UPDATED_NOMBRE = "BBBBBBBBBB"; + + private static final String DEFAULT_DESCRIPCION = "AAAAAAAAAA"; + private static final String UPDATED_DESCRIPCION = "BBBBBBBBBB"; + + private static final ZonedDateTime DEFAULT_FECHA_CREACION = ZonedDateTime.ofInstant(Instant.ofEpochMilli(0L), ZoneOffset.UTC); + private static final ZonedDateTime UPDATED_FECHA_CREACION = ZonedDateTime.now(ZoneId.systemDefault()).withNano(0); + private static final ZonedDateTime SMALLER_FECHA_CREACION = ZonedDateTime.ofInstant(Instant.ofEpochMilli(-1L), ZoneOffset.UTC); + + private static final ZonedDateTime DEFAULT_FECHA_PUBLICACION_TIENDA = ZonedDateTime.ofInstant(Instant.ofEpochMilli(0L), ZoneOffset.UTC); + private static final ZonedDateTime UPDATED_FECHA_PUBLICACION_TIENDA = ZonedDateTime.now(ZoneId.systemDefault()).withNano(0); + private static final ZonedDateTime SMALLER_FECHA_PUBLICACION_TIENDA = ZonedDateTime.ofInstant( + Instant.ofEpochMilli(-1L), + ZoneOffset.UTC + ); + + private static final EstadoPlantilla DEFAULT_ESTADO = EstadoPlantilla.DRAFT; + private static final EstadoPlantilla UPDATED_ESTADO = EstadoPlantilla.ACTIVE; + + private static final Double DEFAULT_PRECIO = 1D; + private static final Double UPDATED_PRECIO = 2D; + private static final Double SMALLER_PRECIO = 1D - 1D; + + private static final String ENTITY_API_URL = "/api/plantillas"; + private static final String ENTITY_API_URL_ID = ENTITY_API_URL + "/{id}"; + + private static Random random = new Random(); + private static AtomicLong count = new AtomicLong(random.nextInt() + (2 * Integer.MAX_VALUE)); + + @Autowired + private PlantillaRepository plantillaRepository; + + @Autowired + private EntityManager em; + + @Autowired + private MockMvc restPlantillaMockMvc; + + private Plantilla plantilla; + + /** + * Create an entity for this test. + * + * This is a static method, as tests for other entities might also need it, + * if they test an entity which requires the current entity. + */ + public static Plantilla createEntity(EntityManager em) { + Plantilla plantilla = new Plantilla() + .nombre(DEFAULT_NOMBRE) + .descripcion(DEFAULT_DESCRIPCION) + .fechaCreacion(DEFAULT_FECHA_CREACION) + .fechaPublicacionTienda(DEFAULT_FECHA_PUBLICACION_TIENDA) + .estado(DEFAULT_ESTADO) + .precio(DEFAULT_PRECIO); + return plantilla; + } + + /** + * Create an updated entity for this test. + * + * This is a static method, as tests for other entities might also need it, + * if they test an entity which requires the current entity. + */ + public static Plantilla createUpdatedEntity(EntityManager em) { + Plantilla plantilla = new Plantilla() + .nombre(UPDATED_NOMBRE) + .descripcion(UPDATED_DESCRIPCION) + .fechaCreacion(UPDATED_FECHA_CREACION) + .fechaPublicacionTienda(UPDATED_FECHA_PUBLICACION_TIENDA) + .estado(UPDATED_ESTADO) + .precio(UPDATED_PRECIO); + return plantilla; + } + + @BeforeEach + public void initTest() { + plantilla = createEntity(em); + } + + @Test + @Transactional + void createPlantilla() throws Exception { + int databaseSizeBeforeCreate = plantillaRepository.findAll().size(); + // Create the Plantilla + restPlantillaMockMvc + .perform(post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(plantilla))) + .andExpect(status().isCreated()); + + // Validate the Plantilla in the database + List plantillaList = plantillaRepository.findAll(); + assertThat(plantillaList).hasSize(databaseSizeBeforeCreate + 1); + Plantilla testPlantilla = plantillaList.get(plantillaList.size() - 1); + assertThat(testPlantilla.getNombre()).isEqualTo(DEFAULT_NOMBRE); + assertThat(testPlantilla.getDescripcion()).isEqualTo(DEFAULT_DESCRIPCION); + assertThat(testPlantilla.getFechaCreacion()).isEqualTo(DEFAULT_FECHA_CREACION); + assertThat(testPlantilla.getFechaPublicacionTienda()).isEqualTo(DEFAULT_FECHA_PUBLICACION_TIENDA); + assertThat(testPlantilla.getEstado()).isEqualTo(DEFAULT_ESTADO); + assertThat(testPlantilla.getPrecio()).isEqualTo(DEFAULT_PRECIO); + } + + @Test + @Transactional + void createPlantillaWithExistingId() throws Exception { + // Create the Plantilla with an existing ID + plantilla.setId(1L); + + int databaseSizeBeforeCreate = plantillaRepository.findAll().size(); + + // An entity with an existing ID cannot be created, so this API call must fail + restPlantillaMockMvc + .perform(post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(plantilla))) + .andExpect(status().isBadRequest()); + + // Validate the Plantilla in the database + List plantillaList = plantillaRepository.findAll(); + assertThat(plantillaList).hasSize(databaseSizeBeforeCreate); + } + + @Test + @Transactional + void checkFechaCreacionIsRequired() throws Exception { + int databaseSizeBeforeTest = plantillaRepository.findAll().size(); + // set the field null + plantilla.setFechaCreacion(null); + + // Create the Plantilla, which fails. + + restPlantillaMockMvc + .perform(post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(plantilla))) + .andExpect(status().isBadRequest()); + + List plantillaList = plantillaRepository.findAll(); + assertThat(plantillaList).hasSize(databaseSizeBeforeTest); + } + + @Test + @Transactional + void checkEstadoIsRequired() throws Exception { + int databaseSizeBeforeTest = plantillaRepository.findAll().size(); + // set the field null + plantilla.setEstado(null); + + // Create the Plantilla, which fails. + + restPlantillaMockMvc + .perform(post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(plantilla))) + .andExpect(status().isBadRequest()); + + List plantillaList = plantillaRepository.findAll(); + assertThat(plantillaList).hasSize(databaseSizeBeforeTest); + } + + @Test + @Transactional + void checkPrecioIsRequired() throws Exception { + int databaseSizeBeforeTest = plantillaRepository.findAll().size(); + // set the field null + plantilla.setPrecio(null); + + // Create the Plantilla, which fails. + + restPlantillaMockMvc + .perform(post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(plantilla))) + .andExpect(status().isBadRequest()); + + List plantillaList = plantillaRepository.findAll(); + assertThat(plantillaList).hasSize(databaseSizeBeforeTest); + } + + @Test + @Transactional + void getAllPlantillas() throws Exception { + // Initialize the database + plantillaRepository.saveAndFlush(plantilla); + + // Get all the plantillaList + restPlantillaMockMvc + .perform(get(ENTITY_API_URL + "?sort=id,desc")) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.[*].id").value(hasItem(plantilla.getId().intValue()))) + .andExpect(jsonPath("$.[*].nombre").value(hasItem(DEFAULT_NOMBRE))) + .andExpect(jsonPath("$.[*].descripcion").value(hasItem(DEFAULT_DESCRIPCION))) + .andExpect(jsonPath("$.[*].fechaCreacion").value(hasItem(sameInstant(DEFAULT_FECHA_CREACION)))) + .andExpect(jsonPath("$.[*].fechaPublicacionTienda").value(hasItem(sameInstant(DEFAULT_FECHA_PUBLICACION_TIENDA)))) + .andExpect(jsonPath("$.[*].estado").value(hasItem(DEFAULT_ESTADO.toString()))) + .andExpect(jsonPath("$.[*].precio").value(hasItem(DEFAULT_PRECIO.doubleValue()))); + } + + @Test + @Transactional + void getPlantilla() throws Exception { + // Initialize the database + plantillaRepository.saveAndFlush(plantilla); + + // Get the plantilla + restPlantillaMockMvc + .perform(get(ENTITY_API_URL_ID, plantilla.getId())) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.id").value(plantilla.getId().intValue())) + .andExpect(jsonPath("$.nombre").value(DEFAULT_NOMBRE)) + .andExpect(jsonPath("$.descripcion").value(DEFAULT_DESCRIPCION)) + .andExpect(jsonPath("$.fechaCreacion").value(sameInstant(DEFAULT_FECHA_CREACION))) + .andExpect(jsonPath("$.fechaPublicacionTienda").value(sameInstant(DEFAULT_FECHA_PUBLICACION_TIENDA))) + .andExpect(jsonPath("$.estado").value(DEFAULT_ESTADO.toString())) + .andExpect(jsonPath("$.precio").value(DEFAULT_PRECIO.doubleValue())); + } + + @Test + @Transactional + void getPlantillasByIdFiltering() throws Exception { + // Initialize the database + plantillaRepository.saveAndFlush(plantilla); + + Long id = plantilla.getId(); + + defaultPlantillaShouldBeFound("id.equals=" + id); + defaultPlantillaShouldNotBeFound("id.notEquals=" + id); + + defaultPlantillaShouldBeFound("id.greaterThanOrEqual=" + id); + defaultPlantillaShouldNotBeFound("id.greaterThan=" + id); + + defaultPlantillaShouldBeFound("id.lessThanOrEqual=" + id); + defaultPlantillaShouldNotBeFound("id.lessThan=" + id); + } + + @Test + @Transactional + void getAllPlantillasByNombreIsEqualToSomething() throws Exception { + // Initialize the database + plantillaRepository.saveAndFlush(plantilla); + + // Get all the plantillaList where nombre equals to DEFAULT_NOMBRE + defaultPlantillaShouldBeFound("nombre.equals=" + DEFAULT_NOMBRE); + + // Get all the plantillaList where nombre equals to UPDATED_NOMBRE + defaultPlantillaShouldNotBeFound("nombre.equals=" + UPDATED_NOMBRE); + } + + @Test + @Transactional + void getAllPlantillasByNombreIsNotEqualToSomething() throws Exception { + // Initialize the database + plantillaRepository.saveAndFlush(plantilla); + + // Get all the plantillaList where nombre not equals to DEFAULT_NOMBRE + defaultPlantillaShouldNotBeFound("nombre.notEquals=" + DEFAULT_NOMBRE); + + // Get all the plantillaList where nombre not equals to UPDATED_NOMBRE + defaultPlantillaShouldBeFound("nombre.notEquals=" + UPDATED_NOMBRE); + } + + @Test + @Transactional + void getAllPlantillasByNombreIsInShouldWork() throws Exception { + // Initialize the database + plantillaRepository.saveAndFlush(plantilla); + + // Get all the plantillaList where nombre in DEFAULT_NOMBRE or UPDATED_NOMBRE + defaultPlantillaShouldBeFound("nombre.in=" + DEFAULT_NOMBRE + "," + UPDATED_NOMBRE); + + // Get all the plantillaList where nombre equals to UPDATED_NOMBRE + defaultPlantillaShouldNotBeFound("nombre.in=" + UPDATED_NOMBRE); + } + + @Test + @Transactional + void getAllPlantillasByNombreIsNullOrNotNull() throws Exception { + // Initialize the database + plantillaRepository.saveAndFlush(plantilla); + + // Get all the plantillaList where nombre is not null + defaultPlantillaShouldBeFound("nombre.specified=true"); + + // Get all the plantillaList where nombre is null + defaultPlantillaShouldNotBeFound("nombre.specified=false"); + } + + @Test + @Transactional + void getAllPlantillasByNombreContainsSomething() throws Exception { + // Initialize the database + plantillaRepository.saveAndFlush(plantilla); + + // Get all the plantillaList where nombre contains DEFAULT_NOMBRE + defaultPlantillaShouldBeFound("nombre.contains=" + DEFAULT_NOMBRE); + + // Get all the plantillaList where nombre contains UPDATED_NOMBRE + defaultPlantillaShouldNotBeFound("nombre.contains=" + UPDATED_NOMBRE); + } + + @Test + @Transactional + void getAllPlantillasByNombreNotContainsSomething() throws Exception { + // Initialize the database + plantillaRepository.saveAndFlush(plantilla); + + // Get all the plantillaList where nombre does not contain DEFAULT_NOMBRE + defaultPlantillaShouldNotBeFound("nombre.doesNotContain=" + DEFAULT_NOMBRE); + + // Get all the plantillaList where nombre does not contain UPDATED_NOMBRE + defaultPlantillaShouldBeFound("nombre.doesNotContain=" + UPDATED_NOMBRE); + } + + @Test + @Transactional + void getAllPlantillasByDescripcionIsEqualToSomething() throws Exception { + // Initialize the database + plantillaRepository.saveAndFlush(plantilla); + + // Get all the plantillaList where descripcion equals to DEFAULT_DESCRIPCION + defaultPlantillaShouldBeFound("descripcion.equals=" + DEFAULT_DESCRIPCION); + + // Get all the plantillaList where descripcion equals to UPDATED_DESCRIPCION + defaultPlantillaShouldNotBeFound("descripcion.equals=" + UPDATED_DESCRIPCION); + } + + @Test + @Transactional + void getAllPlantillasByDescripcionIsNotEqualToSomething() throws Exception { + // Initialize the database + plantillaRepository.saveAndFlush(plantilla); + + // Get all the plantillaList where descripcion not equals to DEFAULT_DESCRIPCION + defaultPlantillaShouldNotBeFound("descripcion.notEquals=" + DEFAULT_DESCRIPCION); + + // Get all the plantillaList where descripcion not equals to UPDATED_DESCRIPCION + defaultPlantillaShouldBeFound("descripcion.notEquals=" + UPDATED_DESCRIPCION); + } + + @Test + @Transactional + void getAllPlantillasByDescripcionIsInShouldWork() throws Exception { + // Initialize the database + plantillaRepository.saveAndFlush(plantilla); + + // Get all the plantillaList where descripcion in DEFAULT_DESCRIPCION or UPDATED_DESCRIPCION + defaultPlantillaShouldBeFound("descripcion.in=" + DEFAULT_DESCRIPCION + "," + UPDATED_DESCRIPCION); + + // Get all the plantillaList where descripcion equals to UPDATED_DESCRIPCION + defaultPlantillaShouldNotBeFound("descripcion.in=" + UPDATED_DESCRIPCION); + } + + @Test + @Transactional + void getAllPlantillasByDescripcionIsNullOrNotNull() throws Exception { + // Initialize the database + plantillaRepository.saveAndFlush(plantilla); + + // Get all the plantillaList where descripcion is not null + defaultPlantillaShouldBeFound("descripcion.specified=true"); + + // Get all the plantillaList where descripcion is null + defaultPlantillaShouldNotBeFound("descripcion.specified=false"); + } + + @Test + @Transactional + void getAllPlantillasByDescripcionContainsSomething() throws Exception { + // Initialize the database + plantillaRepository.saveAndFlush(plantilla); + + // Get all the plantillaList where descripcion contains DEFAULT_DESCRIPCION + defaultPlantillaShouldBeFound("descripcion.contains=" + DEFAULT_DESCRIPCION); + + // Get all the plantillaList where descripcion contains UPDATED_DESCRIPCION + defaultPlantillaShouldNotBeFound("descripcion.contains=" + UPDATED_DESCRIPCION); + } + + @Test + @Transactional + void getAllPlantillasByDescripcionNotContainsSomething() throws Exception { + // Initialize the database + plantillaRepository.saveAndFlush(plantilla); + + // Get all the plantillaList where descripcion does not contain DEFAULT_DESCRIPCION + defaultPlantillaShouldNotBeFound("descripcion.doesNotContain=" + DEFAULT_DESCRIPCION); + + // Get all the plantillaList where descripcion does not contain UPDATED_DESCRIPCION + defaultPlantillaShouldBeFound("descripcion.doesNotContain=" + UPDATED_DESCRIPCION); + } + + @Test + @Transactional + void getAllPlantillasByFechaCreacionIsEqualToSomething() throws Exception { + // Initialize the database + plantillaRepository.saveAndFlush(plantilla); + + // Get all the plantillaList where fechaCreacion equals to DEFAULT_FECHA_CREACION + defaultPlantillaShouldBeFound("fechaCreacion.equals=" + DEFAULT_FECHA_CREACION); + + // Get all the plantillaList where fechaCreacion equals to UPDATED_FECHA_CREACION + defaultPlantillaShouldNotBeFound("fechaCreacion.equals=" + UPDATED_FECHA_CREACION); + } + + @Test + @Transactional + void getAllPlantillasByFechaCreacionIsNotEqualToSomething() throws Exception { + // Initialize the database + plantillaRepository.saveAndFlush(plantilla); + + // Get all the plantillaList where fechaCreacion not equals to DEFAULT_FECHA_CREACION + defaultPlantillaShouldNotBeFound("fechaCreacion.notEquals=" + DEFAULT_FECHA_CREACION); + + // Get all the plantillaList where fechaCreacion not equals to UPDATED_FECHA_CREACION + defaultPlantillaShouldBeFound("fechaCreacion.notEquals=" + UPDATED_FECHA_CREACION); + } + + @Test + @Transactional + void getAllPlantillasByFechaCreacionIsInShouldWork() throws Exception { + // Initialize the database + plantillaRepository.saveAndFlush(plantilla); + + // Get all the plantillaList where fechaCreacion in DEFAULT_FECHA_CREACION or UPDATED_FECHA_CREACION + defaultPlantillaShouldBeFound("fechaCreacion.in=" + DEFAULT_FECHA_CREACION + "," + UPDATED_FECHA_CREACION); + + // Get all the plantillaList where fechaCreacion equals to UPDATED_FECHA_CREACION + defaultPlantillaShouldNotBeFound("fechaCreacion.in=" + UPDATED_FECHA_CREACION); + } + + @Test + @Transactional + void getAllPlantillasByFechaCreacionIsNullOrNotNull() throws Exception { + // Initialize the database + plantillaRepository.saveAndFlush(plantilla); + + // Get all the plantillaList where fechaCreacion is not null + defaultPlantillaShouldBeFound("fechaCreacion.specified=true"); + + // Get all the plantillaList where fechaCreacion is null + defaultPlantillaShouldNotBeFound("fechaCreacion.specified=false"); + } + + @Test + @Transactional + void getAllPlantillasByFechaCreacionIsGreaterThanOrEqualToSomething() throws Exception { + // Initialize the database + plantillaRepository.saveAndFlush(plantilla); + + // Get all the plantillaList where fechaCreacion is greater than or equal to DEFAULT_FECHA_CREACION + defaultPlantillaShouldBeFound("fechaCreacion.greaterThanOrEqual=" + DEFAULT_FECHA_CREACION); + + // Get all the plantillaList where fechaCreacion is greater than or equal to UPDATED_FECHA_CREACION + defaultPlantillaShouldNotBeFound("fechaCreacion.greaterThanOrEqual=" + UPDATED_FECHA_CREACION); + } + + @Test + @Transactional + void getAllPlantillasByFechaCreacionIsLessThanOrEqualToSomething() throws Exception { + // Initialize the database + plantillaRepository.saveAndFlush(plantilla); + + // Get all the plantillaList where fechaCreacion is less than or equal to DEFAULT_FECHA_CREACION + defaultPlantillaShouldBeFound("fechaCreacion.lessThanOrEqual=" + DEFAULT_FECHA_CREACION); + + // Get all the plantillaList where fechaCreacion is less than or equal to SMALLER_FECHA_CREACION + defaultPlantillaShouldNotBeFound("fechaCreacion.lessThanOrEqual=" + SMALLER_FECHA_CREACION); + } + + @Test + @Transactional + void getAllPlantillasByFechaCreacionIsLessThanSomething() throws Exception { + // Initialize the database + plantillaRepository.saveAndFlush(plantilla); + + // Get all the plantillaList where fechaCreacion is less than DEFAULT_FECHA_CREACION + defaultPlantillaShouldNotBeFound("fechaCreacion.lessThan=" + DEFAULT_FECHA_CREACION); + + // Get all the plantillaList where fechaCreacion is less than UPDATED_FECHA_CREACION + defaultPlantillaShouldBeFound("fechaCreacion.lessThan=" + UPDATED_FECHA_CREACION); + } + + @Test + @Transactional + void getAllPlantillasByFechaCreacionIsGreaterThanSomething() throws Exception { + // Initialize the database + plantillaRepository.saveAndFlush(plantilla); + + // Get all the plantillaList where fechaCreacion is greater than DEFAULT_FECHA_CREACION + defaultPlantillaShouldNotBeFound("fechaCreacion.greaterThan=" + DEFAULT_FECHA_CREACION); + + // Get all the plantillaList where fechaCreacion is greater than SMALLER_FECHA_CREACION + defaultPlantillaShouldBeFound("fechaCreacion.greaterThan=" + SMALLER_FECHA_CREACION); + } + + @Test + @Transactional + void getAllPlantillasByFechaPublicacionTiendaIsEqualToSomething() throws Exception { + // Initialize the database + plantillaRepository.saveAndFlush(plantilla); + + // Get all the plantillaList where fechaPublicacionTienda equals to DEFAULT_FECHA_PUBLICACION_TIENDA + defaultPlantillaShouldBeFound("fechaPublicacionTienda.equals=" + DEFAULT_FECHA_PUBLICACION_TIENDA); + + // Get all the plantillaList where fechaPublicacionTienda equals to UPDATED_FECHA_PUBLICACION_TIENDA + defaultPlantillaShouldNotBeFound("fechaPublicacionTienda.equals=" + UPDATED_FECHA_PUBLICACION_TIENDA); + } + + @Test + @Transactional + void getAllPlantillasByFechaPublicacionTiendaIsNotEqualToSomething() throws Exception { + // Initialize the database + plantillaRepository.saveAndFlush(plantilla); + + // Get all the plantillaList where fechaPublicacionTienda not equals to DEFAULT_FECHA_PUBLICACION_TIENDA + defaultPlantillaShouldNotBeFound("fechaPublicacionTienda.notEquals=" + DEFAULT_FECHA_PUBLICACION_TIENDA); + + // Get all the plantillaList where fechaPublicacionTienda not equals to UPDATED_FECHA_PUBLICACION_TIENDA + defaultPlantillaShouldBeFound("fechaPublicacionTienda.notEquals=" + UPDATED_FECHA_PUBLICACION_TIENDA); + } + + @Test + @Transactional + void getAllPlantillasByFechaPublicacionTiendaIsInShouldWork() throws Exception { + // Initialize the database + plantillaRepository.saveAndFlush(plantilla); + + // Get all the plantillaList where fechaPublicacionTienda in DEFAULT_FECHA_PUBLICACION_TIENDA or UPDATED_FECHA_PUBLICACION_TIENDA + defaultPlantillaShouldBeFound( + "fechaPublicacionTienda.in=" + DEFAULT_FECHA_PUBLICACION_TIENDA + "," + UPDATED_FECHA_PUBLICACION_TIENDA + ); + + // Get all the plantillaList where fechaPublicacionTienda equals to UPDATED_FECHA_PUBLICACION_TIENDA + defaultPlantillaShouldNotBeFound("fechaPublicacionTienda.in=" + UPDATED_FECHA_PUBLICACION_TIENDA); + } + + @Test + @Transactional + void getAllPlantillasByFechaPublicacionTiendaIsNullOrNotNull() throws Exception { + // Initialize the database + plantillaRepository.saveAndFlush(plantilla); + + // Get all the plantillaList where fechaPublicacionTienda is not null + defaultPlantillaShouldBeFound("fechaPublicacionTienda.specified=true"); + + // Get all the plantillaList where fechaPublicacionTienda is null + defaultPlantillaShouldNotBeFound("fechaPublicacionTienda.specified=false"); + } + + @Test + @Transactional + void getAllPlantillasByFechaPublicacionTiendaIsGreaterThanOrEqualToSomething() throws Exception { + // Initialize the database + plantillaRepository.saveAndFlush(plantilla); + + // Get all the plantillaList where fechaPublicacionTienda is greater than or equal to DEFAULT_FECHA_PUBLICACION_TIENDA + defaultPlantillaShouldBeFound("fechaPublicacionTienda.greaterThanOrEqual=" + DEFAULT_FECHA_PUBLICACION_TIENDA); + + // Get all the plantillaList where fechaPublicacionTienda is greater than or equal to UPDATED_FECHA_PUBLICACION_TIENDA + defaultPlantillaShouldNotBeFound("fechaPublicacionTienda.greaterThanOrEqual=" + UPDATED_FECHA_PUBLICACION_TIENDA); + } + + @Test + @Transactional + void getAllPlantillasByFechaPublicacionTiendaIsLessThanOrEqualToSomething() throws Exception { + // Initialize the database + plantillaRepository.saveAndFlush(plantilla); + + // Get all the plantillaList where fechaPublicacionTienda is less than or equal to DEFAULT_FECHA_PUBLICACION_TIENDA + defaultPlantillaShouldBeFound("fechaPublicacionTienda.lessThanOrEqual=" + DEFAULT_FECHA_PUBLICACION_TIENDA); + + // Get all the plantillaList where fechaPublicacionTienda is less than or equal to SMALLER_FECHA_PUBLICACION_TIENDA + defaultPlantillaShouldNotBeFound("fechaPublicacionTienda.lessThanOrEqual=" + SMALLER_FECHA_PUBLICACION_TIENDA); + } + + @Test + @Transactional + void getAllPlantillasByFechaPublicacionTiendaIsLessThanSomething() throws Exception { + // Initialize the database + plantillaRepository.saveAndFlush(plantilla); + + // Get all the plantillaList where fechaPublicacionTienda is less than DEFAULT_FECHA_PUBLICACION_TIENDA + defaultPlantillaShouldNotBeFound("fechaPublicacionTienda.lessThan=" + DEFAULT_FECHA_PUBLICACION_TIENDA); + + // Get all the plantillaList where fechaPublicacionTienda is less than UPDATED_FECHA_PUBLICACION_TIENDA + defaultPlantillaShouldBeFound("fechaPublicacionTienda.lessThan=" + UPDATED_FECHA_PUBLICACION_TIENDA); + } + + @Test + @Transactional + void getAllPlantillasByFechaPublicacionTiendaIsGreaterThanSomething() throws Exception { + // Initialize the database + plantillaRepository.saveAndFlush(plantilla); + + // Get all the plantillaList where fechaPublicacionTienda is greater than DEFAULT_FECHA_PUBLICACION_TIENDA + defaultPlantillaShouldNotBeFound("fechaPublicacionTienda.greaterThan=" + DEFAULT_FECHA_PUBLICACION_TIENDA); + + // Get all the plantillaList where fechaPublicacionTienda is greater than SMALLER_FECHA_PUBLICACION_TIENDA + defaultPlantillaShouldBeFound("fechaPublicacionTienda.greaterThan=" + SMALLER_FECHA_PUBLICACION_TIENDA); + } + + @Test + @Transactional + void getAllPlantillasByEstadoIsEqualToSomething() throws Exception { + // Initialize the database + plantillaRepository.saveAndFlush(plantilla); + + // Get all the plantillaList where estado equals to DEFAULT_ESTADO + defaultPlantillaShouldBeFound("estado.equals=" + DEFAULT_ESTADO); + + // Get all the plantillaList where estado equals to UPDATED_ESTADO + defaultPlantillaShouldNotBeFound("estado.equals=" + UPDATED_ESTADO); + } + + @Test + @Transactional + void getAllPlantillasByEstadoIsNotEqualToSomething() throws Exception { + // Initialize the database + plantillaRepository.saveAndFlush(plantilla); + + // Get all the plantillaList where estado not equals to DEFAULT_ESTADO + defaultPlantillaShouldNotBeFound("estado.notEquals=" + DEFAULT_ESTADO); + + // Get all the plantillaList where estado not equals to UPDATED_ESTADO + defaultPlantillaShouldBeFound("estado.notEquals=" + UPDATED_ESTADO); + } + + @Test + @Transactional + void getAllPlantillasByEstadoIsInShouldWork() throws Exception { + // Initialize the database + plantillaRepository.saveAndFlush(plantilla); + + // Get all the plantillaList where estado in DEFAULT_ESTADO or UPDATED_ESTADO + defaultPlantillaShouldBeFound("estado.in=" + DEFAULT_ESTADO + "," + UPDATED_ESTADO); + + // Get all the plantillaList where estado equals to UPDATED_ESTADO + defaultPlantillaShouldNotBeFound("estado.in=" + UPDATED_ESTADO); + } + + @Test + @Transactional + void getAllPlantillasByEstadoIsNullOrNotNull() throws Exception { + // Initialize the database + plantillaRepository.saveAndFlush(plantilla); + + // Get all the plantillaList where estado is not null + defaultPlantillaShouldBeFound("estado.specified=true"); + + // Get all the plantillaList where estado is null + defaultPlantillaShouldNotBeFound("estado.specified=false"); + } + + @Test + @Transactional + void getAllPlantillasByPrecioIsEqualToSomething() throws Exception { + // Initialize the database + plantillaRepository.saveAndFlush(plantilla); + + // Get all the plantillaList where precio equals to DEFAULT_PRECIO + defaultPlantillaShouldBeFound("precio.equals=" + DEFAULT_PRECIO); + + // Get all the plantillaList where precio equals to UPDATED_PRECIO + defaultPlantillaShouldNotBeFound("precio.equals=" + UPDATED_PRECIO); + } + + @Test + @Transactional + void getAllPlantillasByPrecioIsNotEqualToSomething() throws Exception { + // Initialize the database + plantillaRepository.saveAndFlush(plantilla); + + // Get all the plantillaList where precio not equals to DEFAULT_PRECIO + defaultPlantillaShouldNotBeFound("precio.notEquals=" + DEFAULT_PRECIO); + + // Get all the plantillaList where precio not equals to UPDATED_PRECIO + defaultPlantillaShouldBeFound("precio.notEquals=" + UPDATED_PRECIO); + } + + @Test + @Transactional + void getAllPlantillasByPrecioIsInShouldWork() throws Exception { + // Initialize the database + plantillaRepository.saveAndFlush(plantilla); + + // Get all the plantillaList where precio in DEFAULT_PRECIO or UPDATED_PRECIO + defaultPlantillaShouldBeFound("precio.in=" + DEFAULT_PRECIO + "," + UPDATED_PRECIO); + + // Get all the plantillaList where precio equals to UPDATED_PRECIO + defaultPlantillaShouldNotBeFound("precio.in=" + UPDATED_PRECIO); + } + + @Test + @Transactional + void getAllPlantillasByPrecioIsNullOrNotNull() throws Exception { + // Initialize the database + plantillaRepository.saveAndFlush(plantilla); + + // Get all the plantillaList where precio is not null + defaultPlantillaShouldBeFound("precio.specified=true"); + + // Get all the plantillaList where precio is null + defaultPlantillaShouldNotBeFound("precio.specified=false"); + } + + @Test + @Transactional + void getAllPlantillasByPrecioIsGreaterThanOrEqualToSomething() throws Exception { + // Initialize the database + plantillaRepository.saveAndFlush(plantilla); + + // Get all the plantillaList where precio is greater than or equal to DEFAULT_PRECIO + defaultPlantillaShouldBeFound("precio.greaterThanOrEqual=" + DEFAULT_PRECIO); + + // Get all the plantillaList where precio is greater than or equal to UPDATED_PRECIO + defaultPlantillaShouldNotBeFound("precio.greaterThanOrEqual=" + UPDATED_PRECIO); + } + + @Test + @Transactional + void getAllPlantillasByPrecioIsLessThanOrEqualToSomething() throws Exception { + // Initialize the database + plantillaRepository.saveAndFlush(plantilla); + + // Get all the plantillaList where precio is less than or equal to DEFAULT_PRECIO + defaultPlantillaShouldBeFound("precio.lessThanOrEqual=" + DEFAULT_PRECIO); + + // Get all the plantillaList where precio is less than or equal to SMALLER_PRECIO + defaultPlantillaShouldNotBeFound("precio.lessThanOrEqual=" + SMALLER_PRECIO); + } + + @Test + @Transactional + void getAllPlantillasByPrecioIsLessThanSomething() throws Exception { + // Initialize the database + plantillaRepository.saveAndFlush(plantilla); + + // Get all the plantillaList where precio is less than DEFAULT_PRECIO + defaultPlantillaShouldNotBeFound("precio.lessThan=" + DEFAULT_PRECIO); + + // Get all the plantillaList where precio is less than UPDATED_PRECIO + defaultPlantillaShouldBeFound("precio.lessThan=" + UPDATED_PRECIO); + } + + @Test + @Transactional + void getAllPlantillasByPrecioIsGreaterThanSomething() throws Exception { + // Initialize the database + plantillaRepository.saveAndFlush(plantilla); + + // Get all the plantillaList where precio is greater than DEFAULT_PRECIO + defaultPlantillaShouldNotBeFound("precio.greaterThan=" + DEFAULT_PRECIO); + + // Get all the plantillaList where precio is greater than SMALLER_PRECIO + defaultPlantillaShouldBeFound("precio.greaterThan=" + SMALLER_PRECIO); + } + + @Test + @Transactional + void getAllPlantillasByPPreguntaCerradaIsEqualToSomething() throws Exception { + // Initialize the database + plantillaRepository.saveAndFlush(plantilla); + PPreguntaCerrada pPreguntaCerrada = PPreguntaCerradaResourceIT.createEntity(em); + em.persist(pPreguntaCerrada); + em.flush(); + plantilla.addPPreguntaCerrada(pPreguntaCerrada); + plantillaRepository.saveAndFlush(plantilla); + Long pPreguntaCerradaId = pPreguntaCerrada.getId(); + + // Get all the plantillaList where pPreguntaCerrada equals to pPreguntaCerradaId + defaultPlantillaShouldBeFound("pPreguntaCerradaId.equals=" + pPreguntaCerradaId); + + // Get all the plantillaList where pPreguntaCerrada equals to (pPreguntaCerradaId + 1) + defaultPlantillaShouldNotBeFound("pPreguntaCerradaId.equals=" + (pPreguntaCerradaId + 1)); + } + + @Test + @Transactional + void getAllPlantillasByPPreguntaAbiertaIsEqualToSomething() throws Exception { + // Initialize the database + plantillaRepository.saveAndFlush(plantilla); + PPreguntaAbierta pPreguntaAbierta = PPreguntaAbiertaResourceIT.createEntity(em); + em.persist(pPreguntaAbierta); + em.flush(); + plantilla.addPPreguntaAbierta(pPreguntaAbierta); + plantillaRepository.saveAndFlush(plantilla); + Long pPreguntaAbiertaId = pPreguntaAbierta.getId(); + + // Get all the plantillaList where pPreguntaAbierta equals to pPreguntaAbiertaId + defaultPlantillaShouldBeFound("pPreguntaAbiertaId.equals=" + pPreguntaAbiertaId); + + // Get all the plantillaList where pPreguntaAbierta equals to (pPreguntaAbiertaId + 1) + defaultPlantillaShouldNotBeFound("pPreguntaAbiertaId.equals=" + (pPreguntaAbiertaId + 1)); + } + + @Test + @Transactional + void getAllPlantillasByCategoriaIsEqualToSomething() throws Exception { + // Initialize the database + plantillaRepository.saveAndFlush(plantilla); + Categoria categoria = CategoriaResourceIT.createEntity(em); + em.persist(categoria); + em.flush(); + plantilla.setCategoria(categoria); + plantillaRepository.saveAndFlush(plantilla); + Long categoriaId = categoria.getId(); + + // Get all the plantillaList where categoria equals to categoriaId + defaultPlantillaShouldBeFound("categoriaId.equals=" + categoriaId); + + // Get all the plantillaList where categoria equals to (categoriaId + 1) + defaultPlantillaShouldNotBeFound("categoriaId.equals=" + (categoriaId + 1)); + } + + @Test + @Transactional + void getAllPlantillasByUsuarioExtraIsEqualToSomething() throws Exception { + // Initialize the database + plantillaRepository.saveAndFlush(plantilla); + UsuarioExtra usuarioExtra = UsuarioExtraResourceIT.createEntity(em); + em.persist(usuarioExtra); + em.flush(); + plantilla.addUsuarioExtra(usuarioExtra); + plantillaRepository.saveAndFlush(plantilla); + Long usuarioExtraId = usuarioExtra.getId(); + + // Get all the plantillaList where usuarioExtra equals to usuarioExtraId + defaultPlantillaShouldBeFound("usuarioExtraId.equals=" + usuarioExtraId); + + // Get all the plantillaList where usuarioExtra equals to (usuarioExtraId + 1) + defaultPlantillaShouldNotBeFound("usuarioExtraId.equals=" + (usuarioExtraId + 1)); + } + + /** + * Executes the search, and checks that the default entity is returned. + */ + private void defaultPlantillaShouldBeFound(String filter) throws Exception { + restPlantillaMockMvc + .perform(get(ENTITY_API_URL + "?sort=id,desc&" + filter)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.[*].id").value(hasItem(plantilla.getId().intValue()))) + .andExpect(jsonPath("$.[*].nombre").value(hasItem(DEFAULT_NOMBRE))) + .andExpect(jsonPath("$.[*].descripcion").value(hasItem(DEFAULT_DESCRIPCION))) + .andExpect(jsonPath("$.[*].fechaCreacion").value(hasItem(sameInstant(DEFAULT_FECHA_CREACION)))) + .andExpect(jsonPath("$.[*].fechaPublicacionTienda").value(hasItem(sameInstant(DEFAULT_FECHA_PUBLICACION_TIENDA)))) + .andExpect(jsonPath("$.[*].estado").value(hasItem(DEFAULT_ESTADO.toString()))) + .andExpect(jsonPath("$.[*].precio").value(hasItem(DEFAULT_PRECIO.doubleValue()))); + + // Check, that the count call also returns 1 + restPlantillaMockMvc + .perform(get(ENTITY_API_URL + "/count?sort=id,desc&" + filter)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(content().string("1")); + } + + /** + * Executes the search, and checks that the default entity is not returned. + */ + private void defaultPlantillaShouldNotBeFound(String filter) throws Exception { + restPlantillaMockMvc + .perform(get(ENTITY_API_URL + "?sort=id,desc&" + filter)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$").isArray()) + .andExpect(jsonPath("$").isEmpty()); + + // Check, that the count call also returns 0 + restPlantillaMockMvc + .perform(get(ENTITY_API_URL + "/count?sort=id,desc&" + filter)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(content().string("0")); + } + + @Test + @Transactional + void getNonExistingPlantilla() throws Exception { + // Get the plantilla + restPlantillaMockMvc.perform(get(ENTITY_API_URL_ID, Long.MAX_VALUE)).andExpect(status().isNotFound()); + } + + @Test + @Transactional + void putNewPlantilla() throws Exception { + // Initialize the database + plantillaRepository.saveAndFlush(plantilla); + + int databaseSizeBeforeUpdate = plantillaRepository.findAll().size(); + + // Update the plantilla + Plantilla updatedPlantilla = plantillaRepository.findById(plantilla.getId()).get(); + // Disconnect from session so that the updates on updatedPlantilla are not directly saved in db + em.detach(updatedPlantilla); + updatedPlantilla + .nombre(UPDATED_NOMBRE) + .descripcion(UPDATED_DESCRIPCION) + .fechaCreacion(UPDATED_FECHA_CREACION) + .fechaPublicacionTienda(UPDATED_FECHA_PUBLICACION_TIENDA) + .estado(UPDATED_ESTADO) + .precio(UPDATED_PRECIO); + + restPlantillaMockMvc + .perform( + put(ENTITY_API_URL_ID, updatedPlantilla.getId()) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(updatedPlantilla)) + ) + .andExpect(status().isOk()); + + // Validate the Plantilla in the database + List plantillaList = plantillaRepository.findAll(); + assertThat(plantillaList).hasSize(databaseSizeBeforeUpdate); + Plantilla testPlantilla = plantillaList.get(plantillaList.size() - 1); + assertThat(testPlantilla.getNombre()).isEqualTo(UPDATED_NOMBRE); + assertThat(testPlantilla.getDescripcion()).isEqualTo(UPDATED_DESCRIPCION); + assertThat(testPlantilla.getFechaCreacion()).isEqualTo(UPDATED_FECHA_CREACION); + assertThat(testPlantilla.getFechaPublicacionTienda()).isEqualTo(UPDATED_FECHA_PUBLICACION_TIENDA); + assertThat(testPlantilla.getEstado()).isEqualTo(UPDATED_ESTADO); + assertThat(testPlantilla.getPrecio()).isEqualTo(UPDATED_PRECIO); + } + + @Test + @Transactional + void putNonExistingPlantilla() throws Exception { + int databaseSizeBeforeUpdate = plantillaRepository.findAll().size(); + plantilla.setId(count.incrementAndGet()); + + // If the entity doesn't have an ID, it will throw BadRequestAlertException + restPlantillaMockMvc + .perform( + put(ENTITY_API_URL_ID, plantilla.getId()) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(plantilla)) + ) + .andExpect(status().isBadRequest()); + + // Validate the Plantilla in the database + List plantillaList = plantillaRepository.findAll(); + assertThat(plantillaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void putWithIdMismatchPlantilla() throws Exception { + int databaseSizeBeforeUpdate = plantillaRepository.findAll().size(); + plantilla.setId(count.incrementAndGet()); + + // If url ID doesn't match entity ID, it will throw BadRequestAlertException + restPlantillaMockMvc + .perform( + put(ENTITY_API_URL_ID, count.incrementAndGet()) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(plantilla)) + ) + .andExpect(status().isBadRequest()); + + // Validate the Plantilla in the database + List plantillaList = plantillaRepository.findAll(); + assertThat(plantillaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void putWithMissingIdPathParamPlantilla() throws Exception { + int databaseSizeBeforeUpdate = plantillaRepository.findAll().size(); + plantilla.setId(count.incrementAndGet()); + + // If url ID doesn't match entity ID, it will throw BadRequestAlertException + restPlantillaMockMvc + .perform(put(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(plantilla))) + .andExpect(status().isMethodNotAllowed()); + + // Validate the Plantilla in the database + List plantillaList = plantillaRepository.findAll(); + assertThat(plantillaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void partialUpdatePlantillaWithPatch() throws Exception { + // Initialize the database + plantillaRepository.saveAndFlush(plantilla); + + int databaseSizeBeforeUpdate = plantillaRepository.findAll().size(); + + // Update the plantilla using partial update + Plantilla partialUpdatedPlantilla = new Plantilla(); + partialUpdatedPlantilla.setId(plantilla.getId()); + + partialUpdatedPlantilla.fechaCreacion(UPDATED_FECHA_CREACION).fechaPublicacionTienda(UPDATED_FECHA_PUBLICACION_TIENDA); + + restPlantillaMockMvc + .perform( + patch(ENTITY_API_URL_ID, partialUpdatedPlantilla.getId()) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(partialUpdatedPlantilla)) + ) + .andExpect(status().isOk()); + + // Validate the Plantilla in the database + List plantillaList = plantillaRepository.findAll(); + assertThat(plantillaList).hasSize(databaseSizeBeforeUpdate); + Plantilla testPlantilla = plantillaList.get(plantillaList.size() - 1); + assertThat(testPlantilla.getNombre()).isEqualTo(DEFAULT_NOMBRE); + assertThat(testPlantilla.getDescripcion()).isEqualTo(DEFAULT_DESCRIPCION); + assertThat(testPlantilla.getFechaCreacion()).isEqualTo(UPDATED_FECHA_CREACION); + assertThat(testPlantilla.getFechaPublicacionTienda()).isEqualTo(UPDATED_FECHA_PUBLICACION_TIENDA); + assertThat(testPlantilla.getEstado()).isEqualTo(DEFAULT_ESTADO); + assertThat(testPlantilla.getPrecio()).isEqualTo(DEFAULT_PRECIO); + } + + @Test + @Transactional + void fullUpdatePlantillaWithPatch() throws Exception { + // Initialize the database + plantillaRepository.saveAndFlush(plantilla); + + int databaseSizeBeforeUpdate = plantillaRepository.findAll().size(); + + // Update the plantilla using partial update + Plantilla partialUpdatedPlantilla = new Plantilla(); + partialUpdatedPlantilla.setId(plantilla.getId()); + + partialUpdatedPlantilla + .nombre(UPDATED_NOMBRE) + .descripcion(UPDATED_DESCRIPCION) + .fechaCreacion(UPDATED_FECHA_CREACION) + .fechaPublicacionTienda(UPDATED_FECHA_PUBLICACION_TIENDA) + .estado(UPDATED_ESTADO) + .precio(UPDATED_PRECIO); + + restPlantillaMockMvc + .perform( + patch(ENTITY_API_URL_ID, partialUpdatedPlantilla.getId()) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(partialUpdatedPlantilla)) + ) + .andExpect(status().isOk()); + + // Validate the Plantilla in the database + List plantillaList = plantillaRepository.findAll(); + assertThat(plantillaList).hasSize(databaseSizeBeforeUpdate); + Plantilla testPlantilla = plantillaList.get(plantillaList.size() - 1); + assertThat(testPlantilla.getNombre()).isEqualTo(UPDATED_NOMBRE); + assertThat(testPlantilla.getDescripcion()).isEqualTo(UPDATED_DESCRIPCION); + assertThat(testPlantilla.getFechaCreacion()).isEqualTo(UPDATED_FECHA_CREACION); + assertThat(testPlantilla.getFechaPublicacionTienda()).isEqualTo(UPDATED_FECHA_PUBLICACION_TIENDA); + assertThat(testPlantilla.getEstado()).isEqualTo(UPDATED_ESTADO); + assertThat(testPlantilla.getPrecio()).isEqualTo(UPDATED_PRECIO); + } + + @Test + @Transactional + void patchNonExistingPlantilla() throws Exception { + int databaseSizeBeforeUpdate = plantillaRepository.findAll().size(); + plantilla.setId(count.incrementAndGet()); + + // If the entity doesn't have an ID, it will throw BadRequestAlertException + restPlantillaMockMvc + .perform( + patch(ENTITY_API_URL_ID, plantilla.getId()) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(plantilla)) + ) + .andExpect(status().isBadRequest()); + + // Validate the Plantilla in the database + List plantillaList = plantillaRepository.findAll(); + assertThat(plantillaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void patchWithIdMismatchPlantilla() throws Exception { + int databaseSizeBeforeUpdate = plantillaRepository.findAll().size(); + plantilla.setId(count.incrementAndGet()); + + // If url ID doesn't match entity ID, it will throw BadRequestAlertException + restPlantillaMockMvc + .perform( + patch(ENTITY_API_URL_ID, count.incrementAndGet()) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(plantilla)) + ) + .andExpect(status().isBadRequest()); + + // Validate the Plantilla in the database + List plantillaList = plantillaRepository.findAll(); + assertThat(plantillaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void patchWithMissingIdPathParamPlantilla() throws Exception { + int databaseSizeBeforeUpdate = plantillaRepository.findAll().size(); + plantilla.setId(count.incrementAndGet()); + + // If url ID doesn't match entity ID, it will throw BadRequestAlertException + restPlantillaMockMvc + .perform( + patch(ENTITY_API_URL).contentType("application/merge-patch+json").content(TestUtil.convertObjectToJsonBytes(plantilla)) + ) + .andExpect(status().isMethodNotAllowed()); + + // Validate the Plantilla in the database + List plantillaList = plantillaRepository.findAll(); + assertThat(plantillaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void deletePlantilla() throws Exception { + // Initialize the database + plantillaRepository.saveAndFlush(plantilla); + + int databaseSizeBeforeDelete = plantillaRepository.findAll().size(); + + // Delete the plantilla + restPlantillaMockMvc + .perform(delete(ENTITY_API_URL_ID, plantilla.getId()).accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isNoContent()); + + // Validate the database contains one less item + List plantillaList = plantillaRepository.findAll(); + assertThat(plantillaList).hasSize(databaseSizeBeforeDelete - 1); + } +} diff --git a/src/test/java/org/datasurvey/web/rest/PublicUserResourceIT.java b/src/test/java/org/datasurvey/web/rest/PublicUserResourceIT.java new file mode 100644 index 0000000..700eba7 --- /dev/null +++ b/src/test/java/org/datasurvey/web/rest/PublicUserResourceIT.java @@ -0,0 +1,99 @@ +package org.datasurvey.web.rest; + +import static org.hamcrest.Matchers.hasItem; +import static org.hamcrest.Matchers.hasItems; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +import javax.persistence.EntityManager; +import org.datasurvey.IntegrationTest; +import org.datasurvey.domain.User; +import org.datasurvey.repository.UserRepository; +import org.datasurvey.security.AuthoritiesConstants; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.cache.CacheManager; +import org.springframework.http.MediaType; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.transaction.annotation.Transactional; + +/** + * Integration tests for the {@link UserResource} REST controller. + */ +@AutoConfigureMockMvc +@WithMockUser(authorities = AuthoritiesConstants.ADMIN) +@IntegrationTest +class PublicUserResourceIT { + + private static final String DEFAULT_LOGIN = "johndoe"; + + @Autowired + private UserRepository userRepository; + + @Autowired + private EntityManager em; + + @Autowired + private CacheManager cacheManager; + + @Autowired + private MockMvc restUserMockMvc; + + private User user; + + @BeforeEach + public void setup() { + cacheManager.getCache(UserRepository.USERS_BY_LOGIN_CACHE).clear(); + cacheManager.getCache(UserRepository.USERS_BY_EMAIL_CACHE).clear(); + } + + @BeforeEach + public void initTest() { + user = UserResourceIT.initTestUser(userRepository, em); + } + + @Test + @Transactional + void getAllPublicUsers() throws Exception { + // Initialize the database + userRepository.saveAndFlush(user); + + // Get all the users + restUserMockMvc + .perform(get("/api/users?sort=id,desc").accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.[*].login").value(hasItem(DEFAULT_LOGIN))) + .andExpect(jsonPath("$.[*].email").doesNotExist()) + .andExpect(jsonPath("$.[*].imageUrl").doesNotExist()) + .andExpect(jsonPath("$.[*].langKey").doesNotExist()); + } + + @Test + @Transactional + void getAllAuthorities() throws Exception { + restUserMockMvc + .perform(get("/api/authorities").accept(MediaType.APPLICATION_JSON).contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$").isArray()) + .andExpect(jsonPath("$").value(hasItems(AuthoritiesConstants.USER, AuthoritiesConstants.ADMIN))); + } + + @Test + @Transactional + void getAllUsersSortedByParameters() throws Exception { + // Initialize the database + userRepository.saveAndFlush(user); + + restUserMockMvc.perform(get("/api/users?sort=resetKey,desc").accept(MediaType.APPLICATION_JSON)).andExpect(status().isBadRequest()); + restUserMockMvc.perform(get("/api/users?sort=password,desc").accept(MediaType.APPLICATION_JSON)).andExpect(status().isBadRequest()); + restUserMockMvc + .perform(get("/api/users?sort=resetKey,id,desc").accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isBadRequest()); + restUserMockMvc.perform(get("/api/users?sort=id,desc").accept(MediaType.APPLICATION_JSON)).andExpect(status().isOk()); + } +} diff --git a/src/test/java/org/datasurvey/web/rest/TestUtil.java b/src/test/java/org/datasurvey/web/rest/TestUtil.java new file mode 100644 index 0000000..2373dc3 --- /dev/null +++ b/src/test/java/org/datasurvey/web/rest/TestUtil.java @@ -0,0 +1,206 @@ +package org.datasurvey.web.rest; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import java.io.IOException; +import java.math.BigDecimal; +import java.time.ZonedDateTime; +import java.time.format.DateTimeParseException; +import java.util.List; +import javax.persistence.EntityManager; +import javax.persistence.TypedQuery; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; +import org.hamcrest.Description; +import org.hamcrest.TypeSafeDiagnosingMatcher; +import org.hamcrest.TypeSafeMatcher; +import org.springframework.format.datetime.standard.DateTimeFormatterRegistrar; +import org.springframework.format.support.DefaultFormattingConversionService; +import org.springframework.format.support.FormattingConversionService; + +/** + * Utility class for testing REST controllers. + */ +public final class TestUtil { + + private static final ObjectMapper mapper = createObjectMapper(); + + private static ObjectMapper createObjectMapper() { + ObjectMapper mapper = new ObjectMapper(); + mapper.configure(SerializationFeature.WRITE_DURATIONS_AS_TIMESTAMPS, false); + mapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY); + mapper.registerModule(new JavaTimeModule()); + return mapper; + } + + /** + * Convert an object to JSON byte array. + * + * @param object the object to convert. + * @return the JSON byte array. + * @throws IOException + */ + public static byte[] convertObjectToJsonBytes(Object object) throws IOException { + return mapper.writeValueAsBytes(object); + } + + /** + * Create a byte array with a specific size filled with specified data. + * + * @param size the size of the byte array. + * @param data the data to put in the byte array. + * @return the JSON byte array. + */ + public static byte[] createByteArray(int size, String data) { + byte[] byteArray = new byte[size]; + for (int i = 0; i < size; i++) { + byteArray[i] = Byte.parseByte(data, 2); + } + return byteArray; + } + + /** + * A matcher that tests that the examined string represents the same instant as the reference datetime. + */ + public static class ZonedDateTimeMatcher extends TypeSafeDiagnosingMatcher { + + private final ZonedDateTime date; + + public ZonedDateTimeMatcher(ZonedDateTime date) { + this.date = date; + } + + @Override + protected boolean matchesSafely(String item, Description mismatchDescription) { + try { + if (!date.isEqual(ZonedDateTime.parse(item))) { + mismatchDescription.appendText("was ").appendValue(item); + return false; + } + return true; + } catch (DateTimeParseException e) { + mismatchDescription.appendText("was ").appendValue(item).appendText(", which could not be parsed as a ZonedDateTime"); + return false; + } + } + + @Override + public void describeTo(Description description) { + description.appendText("a String representing the same Instant as ").appendValue(date); + } + } + + /** + * Creates a matcher that matches when the examined string represents the same instant as the reference datetime. + * + * @param date the reference datetime against which the examined string is checked. + */ + public static ZonedDateTimeMatcher sameInstant(ZonedDateTime date) { + return new ZonedDateTimeMatcher(date); + } + + /** + * A matcher that tests that the examined number represents the same value - it can be Long, Double, etc - as the reference BigDecimal. + */ + public static class NumberMatcher extends TypeSafeMatcher { + + final BigDecimal value; + + public NumberMatcher(BigDecimal value) { + this.value = value; + } + + @Override + public void describeTo(Description description) { + description.appendText("a numeric value is ").appendValue(value); + } + + @Override + protected boolean matchesSafely(Number item) { + BigDecimal bigDecimal = asDecimal(item); + return bigDecimal != null && value.compareTo(bigDecimal) == 0; + } + + private static BigDecimal asDecimal(Number item) { + if (item == null) { + return null; + } + if (item instanceof BigDecimal) { + return (BigDecimal) item; + } else if (item instanceof Long) { + return BigDecimal.valueOf((Long) item); + } else if (item instanceof Integer) { + return BigDecimal.valueOf((Integer) item); + } else if (item instanceof Double) { + return BigDecimal.valueOf((Double) item); + } else if (item instanceof Float) { + return BigDecimal.valueOf((Float) item); + } else { + return BigDecimal.valueOf(item.doubleValue()); + } + } + } + + /** + * Creates a matcher that matches when the examined number represents the same value as the reference BigDecimal. + * + * @param number the reference BigDecimal against which the examined number is checked. + */ + public static NumberMatcher sameNumber(BigDecimal number) { + return new NumberMatcher(number); + } + + /** + * Verifies the equals/hashcode contract on the domain object. + */ + public static void equalsVerifier(Class clazz) throws Exception { + T domainObject1 = clazz.getConstructor().newInstance(); + assertThat(domainObject1.toString()).isNotNull(); + assertThat(domainObject1).isEqualTo(domainObject1); + assertThat(domainObject1).hasSameHashCodeAs(domainObject1); + // Test with an instance of another class + Object testOtherObject = new Object(); + assertThat(domainObject1).isNotEqualTo(testOtherObject); + assertThat(domainObject1).isNotEqualTo(null); + // Test with an instance of the same class + T domainObject2 = clazz.getConstructor().newInstance(); + assertThat(domainObject1).isNotEqualTo(domainObject2); + // HashCodes are equals because the objects are not persisted yet + assertThat(domainObject1).hasSameHashCodeAs(domainObject2); + } + + /** + * Create a {@link FormattingConversionService} which use ISO date format, instead of the localized one. + * @return the {@link FormattingConversionService}. + */ + public static FormattingConversionService createFormattingConversionService() { + DefaultFormattingConversionService dfcs = new DefaultFormattingConversionService(); + DateTimeFormatterRegistrar registrar = new DateTimeFormatterRegistrar(); + registrar.setUseIsoFormat(true); + registrar.registerFormatters(dfcs); + return dfcs; + } + + /** + * Makes a an executes a query to the EntityManager finding all stored objects. + * @param The type of objects to be searched + * @param em The instance of the EntityManager + * @param clss The class type to be searched + * @return A list of all found objects + */ + public static List findAll(EntityManager em, Class clss) { + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(clss); + Root rootEntry = cq.from(clss); + CriteriaQuery all = cq.select(rootEntry); + TypedQuery allQuery = em.createQuery(all); + return allQuery.getResultList(); + } + + private TestUtil() {} +} diff --git a/src/test/java/org/datasurvey/web/rest/UserJWTControllerIT.java b/src/test/java/org/datasurvey/web/rest/UserJWTControllerIT.java new file mode 100644 index 0000000..5702dbf --- /dev/null +++ b/src/test/java/org/datasurvey/web/rest/UserJWTControllerIT.java @@ -0,0 +1,98 @@ +package org.datasurvey.web.rest; + +import static org.hamcrest.Matchers.emptyString; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.not; +import static org.hamcrest.Matchers.nullValue; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import org.datasurvey.IntegrationTest; +import org.datasurvey.domain.User; +import org.datasurvey.repository.UserRepository; +import org.datasurvey.web.rest.vm.LoginVM; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.http.MediaType; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.transaction.annotation.Transactional; + +/** + * Integration tests for the {@link UserJWTController} REST controller. + */ +@AutoConfigureMockMvc +@IntegrationTest +class UserJWTControllerIT { + + @Autowired + private UserRepository userRepository; + + @Autowired + private PasswordEncoder passwordEncoder; + + @Autowired + private MockMvc mockMvc; + + @Test + @Transactional + void testAuthorize() throws Exception { + User user = new User(); + user.setLogin("user-jwt-controller"); + user.setEmail("user-jwt-controller@example.com"); + user.setActivated(true); + user.setPassword(passwordEncoder.encode("test")); + + userRepository.saveAndFlush(user); + + LoginVM login = new LoginVM(); + login.setUsername("user-jwt-controller"); + login.setPassword("test"); + mockMvc + .perform(post("/api/authenticate").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(login))) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.id_token").isString()) + .andExpect(jsonPath("$.id_token").isNotEmpty()) + .andExpect(header().string("Authorization", not(nullValue()))) + .andExpect(header().string("Authorization", not(is(emptyString())))); + } + + @Test + @Transactional + void testAuthorizeWithRememberMe() throws Exception { + User user = new User(); + user.setLogin("user-jwt-controller-remember-me"); + user.setEmail("user-jwt-controller-remember-me@example.com"); + user.setActivated(true); + user.setPassword(passwordEncoder.encode("test")); + + userRepository.saveAndFlush(user); + + LoginVM login = new LoginVM(); + login.setUsername("user-jwt-controller-remember-me"); + login.setPassword("test"); + login.setRememberMe(true); + mockMvc + .perform(post("/api/authenticate").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(login))) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.id_token").isString()) + .andExpect(jsonPath("$.id_token").isNotEmpty()) + .andExpect(header().string("Authorization", not(nullValue()))) + .andExpect(header().string("Authorization", not(is(emptyString())))); + } + + @Test + void testAuthorizeFails() throws Exception { + LoginVM login = new LoginVM(); + login.setUsername("wrong-user"); + login.setPassword("wrong password"); + mockMvc + .perform(post("/api/authenticate").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(login))) + .andExpect(status().isUnauthorized()) + .andExpect(jsonPath("$.id_token").doesNotExist()) + .andExpect(header().doesNotExist("Authorization")); + } +} diff --git a/src/test/java/org/datasurvey/web/rest/UserResourceIT.java b/src/test/java/org/datasurvey/web/rest/UserResourceIT.java new file mode 100644 index 0000000..3c0d76f --- /dev/null +++ b/src/test/java/org/datasurvey/web/rest/UserResourceIT.java @@ -0,0 +1,589 @@ +package org.datasurvey.web.rest; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.hamcrest.Matchers.hasItem; +import static org.hamcrest.Matchers.hasItems; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +import java.time.Instant; +import java.util.*; +import java.util.function.Consumer; +import javax.persistence.EntityManager; +import org.apache.commons.lang3.RandomStringUtils; +import org.datasurvey.IntegrationTest; +import org.datasurvey.domain.Authority; +import org.datasurvey.domain.User; +import org.datasurvey.repository.UserRepository; +import org.datasurvey.security.AuthoritiesConstants; +import org.datasurvey.service.dto.AdminUserDTO; +import org.datasurvey.service.dto.UserDTO; +import org.datasurvey.service.mapper.UserMapper; +import org.datasurvey.web.rest.vm.ManagedUserVM; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.cache.CacheManager; +import org.springframework.http.MediaType; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.transaction.annotation.Transactional; + +/** + * Integration tests for the {@link UserResource} REST controller. + */ +@AutoConfigureMockMvc +@WithMockUser(authorities = AuthoritiesConstants.ADMIN) +@IntegrationTest +class UserResourceIT { + + private static final String DEFAULT_LOGIN = "johndoe"; + private static final String UPDATED_LOGIN = "jhipster"; + + private static final Long DEFAULT_ID = 1L; + + private static final String DEFAULT_PASSWORD = "passjohndoe"; + private static final String UPDATED_PASSWORD = "passjhipster"; + + private static final String DEFAULT_EMAIL = "johndoe@localhost"; + private static final String UPDATED_EMAIL = "jhipster@localhost"; + + private static final String DEFAULT_FIRSTNAME = "john"; + private static final String UPDATED_FIRSTNAME = "jhipsterFirstName"; + + private static final String DEFAULT_LASTNAME = "doe"; + private static final String UPDATED_LASTNAME = "jhipsterLastName"; + + private static final String DEFAULT_IMAGEURL = "http://placehold.it/50x50"; + private static final String UPDATED_IMAGEURL = "http://placehold.it/40x40"; + + private static final String DEFAULT_LANGKEY = "en"; + private static final String UPDATED_LANGKEY = "fr"; + + @Autowired + private UserRepository userRepository; + + @Autowired + private UserMapper userMapper; + + @Autowired + private EntityManager em; + + @Autowired + private CacheManager cacheManager; + + @Autowired + private MockMvc restUserMockMvc; + + private User user; + + @BeforeEach + public void setup() { + cacheManager.getCache(UserRepository.USERS_BY_LOGIN_CACHE).clear(); + cacheManager.getCache(UserRepository.USERS_BY_EMAIL_CACHE).clear(); + } + + /** + * Create a User. + * + * This is a static method, as tests for other entities might also need it, + * if they test an entity which has a required relationship to the User entity. + */ + public static User createEntity(EntityManager em) { + User user = new User(); + user.setLogin(DEFAULT_LOGIN + RandomStringUtils.randomAlphabetic(5)); + user.setPassword(RandomStringUtils.random(60)); + user.setActivated(true); + user.setEmail(RandomStringUtils.randomAlphabetic(5) + DEFAULT_EMAIL); + user.setFirstName(DEFAULT_FIRSTNAME); + user.setLastName(DEFAULT_LASTNAME); + user.setImageUrl(DEFAULT_IMAGEURL); + user.setLangKey(DEFAULT_LANGKEY); + return user; + } + + /** + * Setups the database with one user. + */ + public static User initTestUser(UserRepository userRepository, EntityManager em) { + User user = createEntity(em); + user.setLogin(DEFAULT_LOGIN); + user.setEmail(DEFAULT_EMAIL); + return user; + } + + @BeforeEach + public void initTest() { + user = initTestUser(userRepository, em); + } + + @Test + @Transactional + void createUser() throws Exception { + int databaseSizeBeforeCreate = userRepository.findAll().size(); + + // Create the User + ManagedUserVM managedUserVM = new ManagedUserVM(); + managedUserVM.setLogin(DEFAULT_LOGIN); + managedUserVM.setPassword(DEFAULT_PASSWORD); + managedUserVM.setFirstName(DEFAULT_FIRSTNAME); + managedUserVM.setLastName(DEFAULT_LASTNAME); + managedUserVM.setEmail(DEFAULT_EMAIL); + managedUserVM.setActivated(true); + managedUserVM.setImageUrl(DEFAULT_IMAGEURL); + managedUserVM.setLangKey(DEFAULT_LANGKEY); + managedUserVM.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + restUserMockMvc + .perform( + post("/api/admin/users").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(managedUserVM)) + ) + .andExpect(status().isCreated()); + + // Validate the User in the database + assertPersistedUsers( + users -> { + assertThat(users).hasSize(databaseSizeBeforeCreate + 1); + User testUser = users.get(users.size() - 1); + assertThat(testUser.getLogin()).isEqualTo(DEFAULT_LOGIN); + assertThat(testUser.getFirstName()).isEqualTo(DEFAULT_FIRSTNAME); + assertThat(testUser.getLastName()).isEqualTo(DEFAULT_LASTNAME); + assertThat(testUser.getEmail()).isEqualTo(DEFAULT_EMAIL); + assertThat(testUser.getImageUrl()).isEqualTo(DEFAULT_IMAGEURL); + assertThat(testUser.getLangKey()).isEqualTo(DEFAULT_LANGKEY); + } + ); + } + + @Test + @Transactional + void createUserWithExistingId() throws Exception { + int databaseSizeBeforeCreate = userRepository.findAll().size(); + + ManagedUserVM managedUserVM = new ManagedUserVM(); + managedUserVM.setId(DEFAULT_ID); + managedUserVM.setLogin(DEFAULT_LOGIN); + managedUserVM.setPassword(DEFAULT_PASSWORD); + managedUserVM.setFirstName(DEFAULT_FIRSTNAME); + managedUserVM.setLastName(DEFAULT_LASTNAME); + managedUserVM.setEmail(DEFAULT_EMAIL); + managedUserVM.setActivated(true); + managedUserVM.setImageUrl(DEFAULT_IMAGEURL); + managedUserVM.setLangKey(DEFAULT_LANGKEY); + managedUserVM.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + // An entity with an existing ID cannot be created, so this API call must fail + restUserMockMvc + .perform( + post("/api/admin/users").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(managedUserVM)) + ) + .andExpect(status().isBadRequest()); + + // Validate the User in the database + assertPersistedUsers(users -> assertThat(users).hasSize(databaseSizeBeforeCreate)); + } + + @Test + @Transactional + void createUserWithExistingLogin() throws Exception { + // Initialize the database + userRepository.saveAndFlush(user); + int databaseSizeBeforeCreate = userRepository.findAll().size(); + + ManagedUserVM managedUserVM = new ManagedUserVM(); + managedUserVM.setLogin(DEFAULT_LOGIN); // this login should already be used + managedUserVM.setPassword(DEFAULT_PASSWORD); + managedUserVM.setFirstName(DEFAULT_FIRSTNAME); + managedUserVM.setLastName(DEFAULT_LASTNAME); + managedUserVM.setEmail("anothermail@localhost"); + managedUserVM.setActivated(true); + managedUserVM.setImageUrl(DEFAULT_IMAGEURL); + managedUserVM.setLangKey(DEFAULT_LANGKEY); + managedUserVM.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + // Create the User + restUserMockMvc + .perform( + post("/api/admin/users").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(managedUserVM)) + ) + .andExpect(status().isBadRequest()); + + // Validate the User in the database + assertPersistedUsers(users -> assertThat(users).hasSize(databaseSizeBeforeCreate)); + } + + @Test + @Transactional + void createUserWithExistingEmail() throws Exception { + // Initialize the database + userRepository.saveAndFlush(user); + int databaseSizeBeforeCreate = userRepository.findAll().size(); + + ManagedUserVM managedUserVM = new ManagedUserVM(); + managedUserVM.setLogin("anotherlogin"); + managedUserVM.setPassword(DEFAULT_PASSWORD); + managedUserVM.setFirstName(DEFAULT_FIRSTNAME); + managedUserVM.setLastName(DEFAULT_LASTNAME); + managedUserVM.setEmail(DEFAULT_EMAIL); // this email should already be used + managedUserVM.setActivated(true); + managedUserVM.setImageUrl(DEFAULT_IMAGEURL); + managedUserVM.setLangKey(DEFAULT_LANGKEY); + managedUserVM.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + // Create the User + restUserMockMvc + .perform( + post("/api/admin/users").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(managedUserVM)) + ) + .andExpect(status().isBadRequest()); + + // Validate the User in the database + assertPersistedUsers(users -> assertThat(users).hasSize(databaseSizeBeforeCreate)); + } + + @Test + @Transactional + void getAllUsers() throws Exception { + // Initialize the database + userRepository.saveAndFlush(user); + + // Get all the users + restUserMockMvc + .perform(get("/api/admin/users?sort=id,desc").accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.[*].login").value(hasItem(DEFAULT_LOGIN))) + .andExpect(jsonPath("$.[*].firstName").value(hasItem(DEFAULT_FIRSTNAME))) + .andExpect(jsonPath("$.[*].lastName").value(hasItem(DEFAULT_LASTNAME))) + .andExpect(jsonPath("$.[*].email").value(hasItem(DEFAULT_EMAIL))) + .andExpect(jsonPath("$.[*].imageUrl").value(hasItem(DEFAULT_IMAGEURL))) + .andExpect(jsonPath("$.[*].langKey").value(hasItem(DEFAULT_LANGKEY))); + } + + @Test + @Transactional + void getUser() throws Exception { + // Initialize the database + userRepository.saveAndFlush(user); + + assertThat(cacheManager.getCache(UserRepository.USERS_BY_LOGIN_CACHE).get(user.getLogin())).isNull(); + + // Get the user + restUserMockMvc + .perform(get("/api/admin/users/{login}", user.getLogin())) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.login").value(user.getLogin())) + .andExpect(jsonPath("$.firstName").value(DEFAULT_FIRSTNAME)) + .andExpect(jsonPath("$.lastName").value(DEFAULT_LASTNAME)) + .andExpect(jsonPath("$.email").value(DEFAULT_EMAIL)) + .andExpect(jsonPath("$.imageUrl").value(DEFAULT_IMAGEURL)) + .andExpect(jsonPath("$.langKey").value(DEFAULT_LANGKEY)); + + assertThat(cacheManager.getCache(UserRepository.USERS_BY_LOGIN_CACHE).get(user.getLogin())).isNotNull(); + } + + @Test + @Transactional + void getNonExistingUser() throws Exception { + restUserMockMvc.perform(get("/api/admin/users/unknown")).andExpect(status().isNotFound()); + } + + @Test + @Transactional + void updateUser() throws Exception { + // Initialize the database + userRepository.saveAndFlush(user); + int databaseSizeBeforeUpdate = userRepository.findAll().size(); + + // Update the user + User updatedUser = userRepository.findById(user.getId()).get(); + + ManagedUserVM managedUserVM = new ManagedUserVM(); + managedUserVM.setId(updatedUser.getId()); + managedUserVM.setLogin(updatedUser.getLogin()); + managedUserVM.setPassword(UPDATED_PASSWORD); + managedUserVM.setFirstName(UPDATED_FIRSTNAME); + managedUserVM.setLastName(UPDATED_LASTNAME); + managedUserVM.setEmail(UPDATED_EMAIL); + managedUserVM.setActivated(updatedUser.isActivated()); + managedUserVM.setImageUrl(UPDATED_IMAGEURL); + managedUserVM.setLangKey(UPDATED_LANGKEY); + managedUserVM.setCreatedBy(updatedUser.getCreatedBy()); + managedUserVM.setCreatedDate(updatedUser.getCreatedDate()); + managedUserVM.setLastModifiedBy(updatedUser.getLastModifiedBy()); + managedUserVM.setLastModifiedDate(updatedUser.getLastModifiedDate()); + managedUserVM.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + restUserMockMvc + .perform( + put("/api/admin/users").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(managedUserVM)) + ) + .andExpect(status().isOk()); + + // Validate the User in the database + assertPersistedUsers( + users -> { + assertThat(users).hasSize(databaseSizeBeforeUpdate); + User testUser = users.stream().filter(usr -> usr.getId().equals(updatedUser.getId())).findFirst().get(); + assertThat(testUser.getFirstName()).isEqualTo(UPDATED_FIRSTNAME); + assertThat(testUser.getLastName()).isEqualTo(UPDATED_LASTNAME); + assertThat(testUser.getEmail()).isEqualTo(UPDATED_EMAIL); + assertThat(testUser.getImageUrl()).isEqualTo(UPDATED_IMAGEURL); + assertThat(testUser.getLangKey()).isEqualTo(UPDATED_LANGKEY); + } + ); + } + + @Test + @Transactional + void updateUserLogin() throws Exception { + // Initialize the database + userRepository.saveAndFlush(user); + int databaseSizeBeforeUpdate = userRepository.findAll().size(); + + // Update the user + User updatedUser = userRepository.findById(user.getId()).get(); + + ManagedUserVM managedUserVM = new ManagedUserVM(); + managedUserVM.setId(updatedUser.getId()); + managedUserVM.setLogin(UPDATED_LOGIN); + managedUserVM.setPassword(UPDATED_PASSWORD); + managedUserVM.setFirstName(UPDATED_FIRSTNAME); + managedUserVM.setLastName(UPDATED_LASTNAME); + managedUserVM.setEmail(UPDATED_EMAIL); + managedUserVM.setActivated(updatedUser.isActivated()); + managedUserVM.setImageUrl(UPDATED_IMAGEURL); + managedUserVM.setLangKey(UPDATED_LANGKEY); + managedUserVM.setCreatedBy(updatedUser.getCreatedBy()); + managedUserVM.setCreatedDate(updatedUser.getCreatedDate()); + managedUserVM.setLastModifiedBy(updatedUser.getLastModifiedBy()); + managedUserVM.setLastModifiedDate(updatedUser.getLastModifiedDate()); + managedUserVM.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + restUserMockMvc + .perform( + put("/api/admin/users").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(managedUserVM)) + ) + .andExpect(status().isOk()); + + // Validate the User in the database + assertPersistedUsers( + users -> { + assertThat(users).hasSize(databaseSizeBeforeUpdate); + User testUser = users.stream().filter(usr -> usr.getId().equals(updatedUser.getId())).findFirst().get(); + assertThat(testUser.getLogin()).isEqualTo(UPDATED_LOGIN); + assertThat(testUser.getFirstName()).isEqualTo(UPDATED_FIRSTNAME); + assertThat(testUser.getLastName()).isEqualTo(UPDATED_LASTNAME); + assertThat(testUser.getEmail()).isEqualTo(UPDATED_EMAIL); + assertThat(testUser.getImageUrl()).isEqualTo(UPDATED_IMAGEURL); + assertThat(testUser.getLangKey()).isEqualTo(UPDATED_LANGKEY); + } + ); + } + + @Test + @Transactional + void updateUserExistingEmail() throws Exception { + // Initialize the database with 2 users + userRepository.saveAndFlush(user); + + User anotherUser = new User(); + anotherUser.setLogin("jhipster"); + anotherUser.setPassword(RandomStringUtils.random(60)); + anotherUser.setActivated(true); + anotherUser.setEmail("jhipster@localhost"); + anotherUser.setFirstName("java"); + anotherUser.setLastName("hipster"); + anotherUser.setImageUrl(""); + anotherUser.setLangKey("en"); + userRepository.saveAndFlush(anotherUser); + + // Update the user + User updatedUser = userRepository.findById(user.getId()).get(); + + ManagedUserVM managedUserVM = new ManagedUserVM(); + managedUserVM.setId(updatedUser.getId()); + managedUserVM.setLogin(updatedUser.getLogin()); + managedUserVM.setPassword(updatedUser.getPassword()); + managedUserVM.setFirstName(updatedUser.getFirstName()); + managedUserVM.setLastName(updatedUser.getLastName()); + managedUserVM.setEmail("jhipster@localhost"); // this email should already be used by anotherUser + managedUserVM.setActivated(updatedUser.isActivated()); + managedUserVM.setImageUrl(updatedUser.getImageUrl()); + managedUserVM.setLangKey(updatedUser.getLangKey()); + managedUserVM.setCreatedBy(updatedUser.getCreatedBy()); + managedUserVM.setCreatedDate(updatedUser.getCreatedDate()); + managedUserVM.setLastModifiedBy(updatedUser.getLastModifiedBy()); + managedUserVM.setLastModifiedDate(updatedUser.getLastModifiedDate()); + managedUserVM.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + restUserMockMvc + .perform( + put("/api/admin/users").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(managedUserVM)) + ) + .andExpect(status().isBadRequest()); + } + + @Test + @Transactional + void updateUserExistingLogin() throws Exception { + // Initialize the database + userRepository.saveAndFlush(user); + + User anotherUser = new User(); + anotherUser.setLogin("jhipster"); + anotherUser.setPassword(RandomStringUtils.random(60)); + anotherUser.setActivated(true); + anotherUser.setEmail("jhipster@localhost"); + anotherUser.setFirstName("java"); + anotherUser.setLastName("hipster"); + anotherUser.setImageUrl(""); + anotherUser.setLangKey("en"); + userRepository.saveAndFlush(anotherUser); + + // Update the user + User updatedUser = userRepository.findById(user.getId()).get(); + + ManagedUserVM managedUserVM = new ManagedUserVM(); + managedUserVM.setId(updatedUser.getId()); + managedUserVM.setLogin("jhipster"); // this login should already be used by anotherUser + managedUserVM.setPassword(updatedUser.getPassword()); + managedUserVM.setFirstName(updatedUser.getFirstName()); + managedUserVM.setLastName(updatedUser.getLastName()); + managedUserVM.setEmail(updatedUser.getEmail()); + managedUserVM.setActivated(updatedUser.isActivated()); + managedUserVM.setImageUrl(updatedUser.getImageUrl()); + managedUserVM.setLangKey(updatedUser.getLangKey()); + managedUserVM.setCreatedBy(updatedUser.getCreatedBy()); + managedUserVM.setCreatedDate(updatedUser.getCreatedDate()); + managedUserVM.setLastModifiedBy(updatedUser.getLastModifiedBy()); + managedUserVM.setLastModifiedDate(updatedUser.getLastModifiedDate()); + managedUserVM.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + restUserMockMvc + .perform( + put("/api/admin/users").contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(managedUserVM)) + ) + .andExpect(status().isBadRequest()); + } + + @Test + @Transactional + void deleteUser() throws Exception { + // Initialize the database + userRepository.saveAndFlush(user); + int databaseSizeBeforeDelete = userRepository.findAll().size(); + + // Delete the user + restUserMockMvc + .perform(delete("/api/admin/users/{login}", user.getLogin()).accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isNoContent()); + + assertThat(cacheManager.getCache(UserRepository.USERS_BY_LOGIN_CACHE).get(user.getLogin())).isNull(); + + // Validate the database is empty + assertPersistedUsers(users -> assertThat(users).hasSize(databaseSizeBeforeDelete - 1)); + } + + @Test + void testUserEquals() throws Exception { + TestUtil.equalsVerifier(User.class); + User user1 = new User(); + user1.setId(DEFAULT_ID); + User user2 = new User(); + user2.setId(user1.getId()); + assertThat(user1).isEqualTo(user2); + user2.setId(2L); + assertThat(user1).isNotEqualTo(user2); + user1.setId(null); + assertThat(user1).isNotEqualTo(user2); + } + + @Test + void testUserDTOtoUser() { + AdminUserDTO userDTO = new AdminUserDTO(); + userDTO.setId(DEFAULT_ID); + userDTO.setLogin(DEFAULT_LOGIN); + userDTO.setFirstName(DEFAULT_FIRSTNAME); + userDTO.setLastName(DEFAULT_LASTNAME); + userDTO.setEmail(DEFAULT_EMAIL); + userDTO.setActivated(true); + userDTO.setImageUrl(DEFAULT_IMAGEURL); + userDTO.setLangKey(DEFAULT_LANGKEY); + userDTO.setCreatedBy(DEFAULT_LOGIN); + userDTO.setLastModifiedBy(DEFAULT_LOGIN); + userDTO.setAuthorities(Collections.singleton(AuthoritiesConstants.USER)); + + User user = userMapper.userDTOToUser(userDTO); + assertThat(user.getId()).isEqualTo(DEFAULT_ID); + assertThat(user.getLogin()).isEqualTo(DEFAULT_LOGIN); + assertThat(user.getFirstName()).isEqualTo(DEFAULT_FIRSTNAME); + assertThat(user.getLastName()).isEqualTo(DEFAULT_LASTNAME); + assertThat(user.getEmail()).isEqualTo(DEFAULT_EMAIL); + assertThat(user.isActivated()).isTrue(); + assertThat(user.getImageUrl()).isEqualTo(DEFAULT_IMAGEURL); + assertThat(user.getLangKey()).isEqualTo(DEFAULT_LANGKEY); + assertThat(user.getCreatedBy()).isNull(); + assertThat(user.getCreatedDate()).isNotNull(); + assertThat(user.getLastModifiedBy()).isNull(); + assertThat(user.getLastModifiedDate()).isNotNull(); + assertThat(user.getAuthorities()).extracting("name").containsExactly(AuthoritiesConstants.USER); + } + + @Test + void testUserToUserDTO() { + user.setId(DEFAULT_ID); + user.setCreatedBy(DEFAULT_LOGIN); + user.setCreatedDate(Instant.now()); + user.setLastModifiedBy(DEFAULT_LOGIN); + user.setLastModifiedDate(Instant.now()); + Set authorities = new HashSet<>(); + Authority authority = new Authority(); + authority.setName(AuthoritiesConstants.USER); + authorities.add(authority); + user.setAuthorities(authorities); + + AdminUserDTO userDTO = userMapper.userToAdminUserDTO(user); + + assertThat(userDTO.getId()).isEqualTo(DEFAULT_ID); + assertThat(userDTO.getLogin()).isEqualTo(DEFAULT_LOGIN); + assertThat(userDTO.getFirstName()).isEqualTo(DEFAULT_FIRSTNAME); + assertThat(userDTO.getLastName()).isEqualTo(DEFAULT_LASTNAME); + assertThat(userDTO.getEmail()).isEqualTo(DEFAULT_EMAIL); + assertThat(userDTO.isActivated()).isTrue(); + assertThat(userDTO.getImageUrl()).isEqualTo(DEFAULT_IMAGEURL); + assertThat(userDTO.getLangKey()).isEqualTo(DEFAULT_LANGKEY); + assertThat(userDTO.getCreatedBy()).isEqualTo(DEFAULT_LOGIN); + assertThat(userDTO.getCreatedDate()).isEqualTo(user.getCreatedDate()); + assertThat(userDTO.getLastModifiedBy()).isEqualTo(DEFAULT_LOGIN); + assertThat(userDTO.getLastModifiedDate()).isEqualTo(user.getLastModifiedDate()); + assertThat(userDTO.getAuthorities()).containsExactly(AuthoritiesConstants.USER); + assertThat(userDTO.toString()).isNotNull(); + } + + @Test + void testAuthorityEquals() { + Authority authorityA = new Authority(); + assertThat(authorityA).isNotEqualTo(null).isNotEqualTo(new Object()); + assertThat(authorityA.hashCode()).isZero(); + assertThat(authorityA.toString()).isNotNull(); + + Authority authorityB = new Authority(); + assertThat(authorityA).isEqualTo(authorityB); + + authorityB.setName(AuthoritiesConstants.ADMIN); + assertThat(authorityA).isNotEqualTo(authorityB); + + authorityA.setName(AuthoritiesConstants.USER); + assertThat(authorityA).isNotEqualTo(authorityB); + + authorityB.setName(AuthoritiesConstants.USER); + assertThat(authorityA).isEqualTo(authorityB).hasSameHashCodeAs(authorityB); + } + + private void assertPersistedUsers(Consumer> userAssertion) { + userAssertion.accept(userRepository.findAll()); + } +} diff --git a/src/test/java/org/datasurvey/web/rest/UsuarioEncuestaResourceIT.java b/src/test/java/org/datasurvey/web/rest/UsuarioEncuestaResourceIT.java new file mode 100644 index 0000000..21108f5 --- /dev/null +++ b/src/test/java/org/datasurvey/web/rest/UsuarioEncuestaResourceIT.java @@ -0,0 +1,772 @@ +package org.datasurvey.web.rest; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.datasurvey.web.rest.TestUtil.sameInstant; +import static org.hamcrest.Matchers.hasItem; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +import java.time.Instant; +import java.time.ZoneId; +import java.time.ZoneOffset; +import java.time.ZonedDateTime; +import java.util.List; +import java.util.Random; +import java.util.concurrent.atomic.AtomicLong; +import javax.persistence.EntityManager; +import org.datasurvey.IntegrationTest; +import org.datasurvey.domain.Encuesta; +import org.datasurvey.domain.UsuarioEncuesta; +import org.datasurvey.domain.UsuarioExtra; +import org.datasurvey.domain.enumeration.EstadoColaborador; +import org.datasurvey.domain.enumeration.RolColaborador; +import org.datasurvey.repository.UsuarioEncuestaRepository; +import org.datasurvey.service.criteria.UsuarioEncuestaCriteria; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.http.MediaType; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.transaction.annotation.Transactional; + +/** + * Integration tests for the {@link UsuarioEncuestaResource} REST controller. + */ +@IntegrationTest +@AutoConfigureMockMvc +@WithMockUser +class UsuarioEncuestaResourceIT { + + private static final RolColaborador DEFAULT_ROL = RolColaborador.READ; + private static final RolColaborador UPDATED_ROL = RolColaborador.WRITE; + + private static final EstadoColaborador DEFAULT_ESTADO = EstadoColaborador.PENDING; + private static final EstadoColaborador UPDATED_ESTADO = EstadoColaborador.ACTIVE; + + private static final ZonedDateTime DEFAULT_FECHA_AGREGADO = ZonedDateTime.ofInstant(Instant.ofEpochMilli(0L), ZoneOffset.UTC); + private static final ZonedDateTime UPDATED_FECHA_AGREGADO = ZonedDateTime.now(ZoneId.systemDefault()).withNano(0); + private static final ZonedDateTime SMALLER_FECHA_AGREGADO = ZonedDateTime.ofInstant(Instant.ofEpochMilli(-1L), ZoneOffset.UTC); + + private static final String ENTITY_API_URL = "/api/usuario-encuestas"; + private static final String ENTITY_API_URL_ID = ENTITY_API_URL + "/{id}"; + + private static Random random = new Random(); + private static AtomicLong count = new AtomicLong(random.nextInt() + (2 * Integer.MAX_VALUE)); + + @Autowired + private UsuarioEncuestaRepository usuarioEncuestaRepository; + + @Autowired + private EntityManager em; + + @Autowired + private MockMvc restUsuarioEncuestaMockMvc; + + private UsuarioEncuesta usuarioEncuesta; + + /** + * Create an entity for this test. + * + * This is a static method, as tests for other entities might also need it, + * if they test an entity which requires the current entity. + */ + public static UsuarioEncuesta createEntity(EntityManager em) { + UsuarioEncuesta usuarioEncuesta = new UsuarioEncuesta() + .rol(DEFAULT_ROL) + .estado(DEFAULT_ESTADO) + .fechaAgregado(DEFAULT_FECHA_AGREGADO); + return usuarioEncuesta; + } + + /** + * Create an updated entity for this test. + * + * This is a static method, as tests for other entities might also need it, + * if they test an entity which requires the current entity. + */ + public static UsuarioEncuesta createUpdatedEntity(EntityManager em) { + UsuarioEncuesta usuarioEncuesta = new UsuarioEncuesta() + .rol(UPDATED_ROL) + .estado(UPDATED_ESTADO) + .fechaAgregado(UPDATED_FECHA_AGREGADO); + return usuarioEncuesta; + } + + @BeforeEach + public void initTest() { + usuarioEncuesta = createEntity(em); + } + + @Test + @Transactional + void createUsuarioEncuesta() throws Exception { + int databaseSizeBeforeCreate = usuarioEncuestaRepository.findAll().size(); + // Create the UsuarioEncuesta + restUsuarioEncuestaMockMvc + .perform( + post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(usuarioEncuesta)) + ) + .andExpect(status().isCreated()); + + // Validate the UsuarioEncuesta in the database + List usuarioEncuestaList = usuarioEncuestaRepository.findAll(); + assertThat(usuarioEncuestaList).hasSize(databaseSizeBeforeCreate + 1); + UsuarioEncuesta testUsuarioEncuesta = usuarioEncuestaList.get(usuarioEncuestaList.size() - 1); + assertThat(testUsuarioEncuesta.getRol()).isEqualTo(DEFAULT_ROL); + assertThat(testUsuarioEncuesta.getEstado()).isEqualTo(DEFAULT_ESTADO); + assertThat(testUsuarioEncuesta.getFechaAgregado()).isEqualTo(DEFAULT_FECHA_AGREGADO); + } + + @Test + @Transactional + void createUsuarioEncuestaWithExistingId() throws Exception { + // Create the UsuarioEncuesta with an existing ID + usuarioEncuesta.setId(1L); + + int databaseSizeBeforeCreate = usuarioEncuestaRepository.findAll().size(); + + // An entity with an existing ID cannot be created, so this API call must fail + restUsuarioEncuestaMockMvc + .perform( + post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(usuarioEncuesta)) + ) + .andExpect(status().isBadRequest()); + + // Validate the UsuarioEncuesta in the database + List usuarioEncuestaList = usuarioEncuestaRepository.findAll(); + assertThat(usuarioEncuestaList).hasSize(databaseSizeBeforeCreate); + } + + @Test + @Transactional + void checkRolIsRequired() throws Exception { + int databaseSizeBeforeTest = usuarioEncuestaRepository.findAll().size(); + // set the field null + usuarioEncuesta.setRol(null); + + // Create the UsuarioEncuesta, which fails. + + restUsuarioEncuestaMockMvc + .perform( + post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(usuarioEncuesta)) + ) + .andExpect(status().isBadRequest()); + + List usuarioEncuestaList = usuarioEncuestaRepository.findAll(); + assertThat(usuarioEncuestaList).hasSize(databaseSizeBeforeTest); + } + + @Test + @Transactional + void checkEstadoIsRequired() throws Exception { + int databaseSizeBeforeTest = usuarioEncuestaRepository.findAll().size(); + // set the field null + usuarioEncuesta.setEstado(null); + + // Create the UsuarioEncuesta, which fails. + + restUsuarioEncuestaMockMvc + .perform( + post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(usuarioEncuesta)) + ) + .andExpect(status().isBadRequest()); + + List usuarioEncuestaList = usuarioEncuestaRepository.findAll(); + assertThat(usuarioEncuestaList).hasSize(databaseSizeBeforeTest); + } + + @Test + @Transactional + void checkFechaAgregadoIsRequired() throws Exception { + int databaseSizeBeforeTest = usuarioEncuestaRepository.findAll().size(); + // set the field null + usuarioEncuesta.setFechaAgregado(null); + + // Create the UsuarioEncuesta, which fails. + + restUsuarioEncuestaMockMvc + .perform( + post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(usuarioEncuesta)) + ) + .andExpect(status().isBadRequest()); + + List usuarioEncuestaList = usuarioEncuestaRepository.findAll(); + assertThat(usuarioEncuestaList).hasSize(databaseSizeBeforeTest); + } + + @Test + @Transactional + void getAllUsuarioEncuestas() throws Exception { + // Initialize the database + usuarioEncuestaRepository.saveAndFlush(usuarioEncuesta); + + // Get all the usuarioEncuestaList + restUsuarioEncuestaMockMvc + .perform(get(ENTITY_API_URL + "?sort=id,desc")) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.[*].id").value(hasItem(usuarioEncuesta.getId().intValue()))) + .andExpect(jsonPath("$.[*].rol").value(hasItem(DEFAULT_ROL.toString()))) + .andExpect(jsonPath("$.[*].estado").value(hasItem(DEFAULT_ESTADO.toString()))) + .andExpect(jsonPath("$.[*].fechaAgregado").value(hasItem(sameInstant(DEFAULT_FECHA_AGREGADO)))); + } + + @Test + @Transactional + void getUsuarioEncuesta() throws Exception { + // Initialize the database + usuarioEncuestaRepository.saveAndFlush(usuarioEncuesta); + + // Get the usuarioEncuesta + restUsuarioEncuestaMockMvc + .perform(get(ENTITY_API_URL_ID, usuarioEncuesta.getId())) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.id").value(usuarioEncuesta.getId().intValue())) + .andExpect(jsonPath("$.rol").value(DEFAULT_ROL.toString())) + .andExpect(jsonPath("$.estado").value(DEFAULT_ESTADO.toString())) + .andExpect(jsonPath("$.fechaAgregado").value(sameInstant(DEFAULT_FECHA_AGREGADO))); + } + + @Test + @Transactional + void getUsuarioEncuestasByIdFiltering() throws Exception { + // Initialize the database + usuarioEncuestaRepository.saveAndFlush(usuarioEncuesta); + + Long id = usuarioEncuesta.getId(); + + defaultUsuarioEncuestaShouldBeFound("id.equals=" + id); + defaultUsuarioEncuestaShouldNotBeFound("id.notEquals=" + id); + + defaultUsuarioEncuestaShouldBeFound("id.greaterThanOrEqual=" + id); + defaultUsuarioEncuestaShouldNotBeFound("id.greaterThan=" + id); + + defaultUsuarioEncuestaShouldBeFound("id.lessThanOrEqual=" + id); + defaultUsuarioEncuestaShouldNotBeFound("id.lessThan=" + id); + } + + @Test + @Transactional + void getAllUsuarioEncuestasByRolIsEqualToSomething() throws Exception { + // Initialize the database + usuarioEncuestaRepository.saveAndFlush(usuarioEncuesta); + + // Get all the usuarioEncuestaList where rol equals to DEFAULT_ROL + defaultUsuarioEncuestaShouldBeFound("rol.equals=" + DEFAULT_ROL); + + // Get all the usuarioEncuestaList where rol equals to UPDATED_ROL + defaultUsuarioEncuestaShouldNotBeFound("rol.equals=" + UPDATED_ROL); + } + + @Test + @Transactional + void getAllUsuarioEncuestasByRolIsNotEqualToSomething() throws Exception { + // Initialize the database + usuarioEncuestaRepository.saveAndFlush(usuarioEncuesta); + + // Get all the usuarioEncuestaList where rol not equals to DEFAULT_ROL + defaultUsuarioEncuestaShouldNotBeFound("rol.notEquals=" + DEFAULT_ROL); + + // Get all the usuarioEncuestaList where rol not equals to UPDATED_ROL + defaultUsuarioEncuestaShouldBeFound("rol.notEquals=" + UPDATED_ROL); + } + + @Test + @Transactional + void getAllUsuarioEncuestasByRolIsInShouldWork() throws Exception { + // Initialize the database + usuarioEncuestaRepository.saveAndFlush(usuarioEncuesta); + + // Get all the usuarioEncuestaList where rol in DEFAULT_ROL or UPDATED_ROL + defaultUsuarioEncuestaShouldBeFound("rol.in=" + DEFAULT_ROL + "," + UPDATED_ROL); + + // Get all the usuarioEncuestaList where rol equals to UPDATED_ROL + defaultUsuarioEncuestaShouldNotBeFound("rol.in=" + UPDATED_ROL); + } + + @Test + @Transactional + void getAllUsuarioEncuestasByRolIsNullOrNotNull() throws Exception { + // Initialize the database + usuarioEncuestaRepository.saveAndFlush(usuarioEncuesta); + + // Get all the usuarioEncuestaList where rol is not null + defaultUsuarioEncuestaShouldBeFound("rol.specified=true"); + + // Get all the usuarioEncuestaList where rol is null + defaultUsuarioEncuestaShouldNotBeFound("rol.specified=false"); + } + + @Test + @Transactional + void getAllUsuarioEncuestasByEstadoIsEqualToSomething() throws Exception { + // Initialize the database + usuarioEncuestaRepository.saveAndFlush(usuarioEncuesta); + + // Get all the usuarioEncuestaList where estado equals to DEFAULT_ESTADO + defaultUsuarioEncuestaShouldBeFound("estado.equals=" + DEFAULT_ESTADO); + + // Get all the usuarioEncuestaList where estado equals to UPDATED_ESTADO + defaultUsuarioEncuestaShouldNotBeFound("estado.equals=" + UPDATED_ESTADO); + } + + @Test + @Transactional + void getAllUsuarioEncuestasByEstadoIsNotEqualToSomething() throws Exception { + // Initialize the database + usuarioEncuestaRepository.saveAndFlush(usuarioEncuesta); + + // Get all the usuarioEncuestaList where estado not equals to DEFAULT_ESTADO + defaultUsuarioEncuestaShouldNotBeFound("estado.notEquals=" + DEFAULT_ESTADO); + + // Get all the usuarioEncuestaList where estado not equals to UPDATED_ESTADO + defaultUsuarioEncuestaShouldBeFound("estado.notEquals=" + UPDATED_ESTADO); + } + + @Test + @Transactional + void getAllUsuarioEncuestasByEstadoIsInShouldWork() throws Exception { + // Initialize the database + usuarioEncuestaRepository.saveAndFlush(usuarioEncuesta); + + // Get all the usuarioEncuestaList where estado in DEFAULT_ESTADO or UPDATED_ESTADO + defaultUsuarioEncuestaShouldBeFound("estado.in=" + DEFAULT_ESTADO + "," + UPDATED_ESTADO); + + // Get all the usuarioEncuestaList where estado equals to UPDATED_ESTADO + defaultUsuarioEncuestaShouldNotBeFound("estado.in=" + UPDATED_ESTADO); + } + + @Test + @Transactional + void getAllUsuarioEncuestasByEstadoIsNullOrNotNull() throws Exception { + // Initialize the database + usuarioEncuestaRepository.saveAndFlush(usuarioEncuesta); + + // Get all the usuarioEncuestaList where estado is not null + defaultUsuarioEncuestaShouldBeFound("estado.specified=true"); + + // Get all the usuarioEncuestaList where estado is null + defaultUsuarioEncuestaShouldNotBeFound("estado.specified=false"); + } + + @Test + @Transactional + void getAllUsuarioEncuestasByFechaAgregadoIsEqualToSomething() throws Exception { + // Initialize the database + usuarioEncuestaRepository.saveAndFlush(usuarioEncuesta); + + // Get all the usuarioEncuestaList where fechaAgregado equals to DEFAULT_FECHA_AGREGADO + defaultUsuarioEncuestaShouldBeFound("fechaAgregado.equals=" + DEFAULT_FECHA_AGREGADO); + + // Get all the usuarioEncuestaList where fechaAgregado equals to UPDATED_FECHA_AGREGADO + defaultUsuarioEncuestaShouldNotBeFound("fechaAgregado.equals=" + UPDATED_FECHA_AGREGADO); + } + + @Test + @Transactional + void getAllUsuarioEncuestasByFechaAgregadoIsNotEqualToSomething() throws Exception { + // Initialize the database + usuarioEncuestaRepository.saveAndFlush(usuarioEncuesta); + + // Get all the usuarioEncuestaList where fechaAgregado not equals to DEFAULT_FECHA_AGREGADO + defaultUsuarioEncuestaShouldNotBeFound("fechaAgregado.notEquals=" + DEFAULT_FECHA_AGREGADO); + + // Get all the usuarioEncuestaList where fechaAgregado not equals to UPDATED_FECHA_AGREGADO + defaultUsuarioEncuestaShouldBeFound("fechaAgregado.notEquals=" + UPDATED_FECHA_AGREGADO); + } + + @Test + @Transactional + void getAllUsuarioEncuestasByFechaAgregadoIsInShouldWork() throws Exception { + // Initialize the database + usuarioEncuestaRepository.saveAndFlush(usuarioEncuesta); + + // Get all the usuarioEncuestaList where fechaAgregado in DEFAULT_FECHA_AGREGADO or UPDATED_FECHA_AGREGADO + defaultUsuarioEncuestaShouldBeFound("fechaAgregado.in=" + DEFAULT_FECHA_AGREGADO + "," + UPDATED_FECHA_AGREGADO); + + // Get all the usuarioEncuestaList where fechaAgregado equals to UPDATED_FECHA_AGREGADO + defaultUsuarioEncuestaShouldNotBeFound("fechaAgregado.in=" + UPDATED_FECHA_AGREGADO); + } + + @Test + @Transactional + void getAllUsuarioEncuestasByFechaAgregadoIsNullOrNotNull() throws Exception { + // Initialize the database + usuarioEncuestaRepository.saveAndFlush(usuarioEncuesta); + + // Get all the usuarioEncuestaList where fechaAgregado is not null + defaultUsuarioEncuestaShouldBeFound("fechaAgregado.specified=true"); + + // Get all the usuarioEncuestaList where fechaAgregado is null + defaultUsuarioEncuestaShouldNotBeFound("fechaAgregado.specified=false"); + } + + @Test + @Transactional + void getAllUsuarioEncuestasByFechaAgregadoIsGreaterThanOrEqualToSomething() throws Exception { + // Initialize the database + usuarioEncuestaRepository.saveAndFlush(usuarioEncuesta); + + // Get all the usuarioEncuestaList where fechaAgregado is greater than or equal to DEFAULT_FECHA_AGREGADO + defaultUsuarioEncuestaShouldBeFound("fechaAgregado.greaterThanOrEqual=" + DEFAULT_FECHA_AGREGADO); + + // Get all the usuarioEncuestaList where fechaAgregado is greater than or equal to UPDATED_FECHA_AGREGADO + defaultUsuarioEncuestaShouldNotBeFound("fechaAgregado.greaterThanOrEqual=" + UPDATED_FECHA_AGREGADO); + } + + @Test + @Transactional + void getAllUsuarioEncuestasByFechaAgregadoIsLessThanOrEqualToSomething() throws Exception { + // Initialize the database + usuarioEncuestaRepository.saveAndFlush(usuarioEncuesta); + + // Get all the usuarioEncuestaList where fechaAgregado is less than or equal to DEFAULT_FECHA_AGREGADO + defaultUsuarioEncuestaShouldBeFound("fechaAgregado.lessThanOrEqual=" + DEFAULT_FECHA_AGREGADO); + + // Get all the usuarioEncuestaList where fechaAgregado is less than or equal to SMALLER_FECHA_AGREGADO + defaultUsuarioEncuestaShouldNotBeFound("fechaAgregado.lessThanOrEqual=" + SMALLER_FECHA_AGREGADO); + } + + @Test + @Transactional + void getAllUsuarioEncuestasByFechaAgregadoIsLessThanSomething() throws Exception { + // Initialize the database + usuarioEncuestaRepository.saveAndFlush(usuarioEncuesta); + + // Get all the usuarioEncuestaList where fechaAgregado is less than DEFAULT_FECHA_AGREGADO + defaultUsuarioEncuestaShouldNotBeFound("fechaAgregado.lessThan=" + DEFAULT_FECHA_AGREGADO); + + // Get all the usuarioEncuestaList where fechaAgregado is less than UPDATED_FECHA_AGREGADO + defaultUsuarioEncuestaShouldBeFound("fechaAgregado.lessThan=" + UPDATED_FECHA_AGREGADO); + } + + @Test + @Transactional + void getAllUsuarioEncuestasByFechaAgregadoIsGreaterThanSomething() throws Exception { + // Initialize the database + usuarioEncuestaRepository.saveAndFlush(usuarioEncuesta); + + // Get all the usuarioEncuestaList where fechaAgregado is greater than DEFAULT_FECHA_AGREGADO + defaultUsuarioEncuestaShouldNotBeFound("fechaAgregado.greaterThan=" + DEFAULT_FECHA_AGREGADO); + + // Get all the usuarioEncuestaList where fechaAgregado is greater than SMALLER_FECHA_AGREGADO + defaultUsuarioEncuestaShouldBeFound("fechaAgregado.greaterThan=" + SMALLER_FECHA_AGREGADO); + } + + @Test + @Transactional + void getAllUsuarioEncuestasByUsuarioExtraIsEqualToSomething() throws Exception { + // Initialize the database + usuarioEncuestaRepository.saveAndFlush(usuarioEncuesta); + UsuarioExtra usuarioExtra = UsuarioExtraResourceIT.createEntity(em); + em.persist(usuarioExtra); + em.flush(); + usuarioEncuesta.setUsuarioExtra(usuarioExtra); + usuarioEncuestaRepository.saveAndFlush(usuarioEncuesta); + Long usuarioExtraId = usuarioExtra.getId(); + + // Get all the usuarioEncuestaList where usuarioExtra equals to usuarioExtraId + defaultUsuarioEncuestaShouldBeFound("usuarioExtraId.equals=" + usuarioExtraId); + + // Get all the usuarioEncuestaList where usuarioExtra equals to (usuarioExtraId + 1) + defaultUsuarioEncuestaShouldNotBeFound("usuarioExtraId.equals=" + (usuarioExtraId + 1)); + } + + @Test + @Transactional + void getAllUsuarioEncuestasByEncuestaIsEqualToSomething() throws Exception { + // Initialize the database + usuarioEncuestaRepository.saveAndFlush(usuarioEncuesta); + Encuesta encuesta = EncuestaResourceIT.createEntity(em); + em.persist(encuesta); + em.flush(); + usuarioEncuesta.setEncuesta(encuesta); + usuarioEncuestaRepository.saveAndFlush(usuarioEncuesta); + Long encuestaId = encuesta.getId(); + + // Get all the usuarioEncuestaList where encuesta equals to encuestaId + defaultUsuarioEncuestaShouldBeFound("encuestaId.equals=" + encuestaId); + + // Get all the usuarioEncuestaList where encuesta equals to (encuestaId + 1) + defaultUsuarioEncuestaShouldNotBeFound("encuestaId.equals=" + (encuestaId + 1)); + } + + /** + * Executes the search, and checks that the default entity is returned. + */ + private void defaultUsuarioEncuestaShouldBeFound(String filter) throws Exception { + restUsuarioEncuestaMockMvc + .perform(get(ENTITY_API_URL + "?sort=id,desc&" + filter)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.[*].id").value(hasItem(usuarioEncuesta.getId().intValue()))) + .andExpect(jsonPath("$.[*].rol").value(hasItem(DEFAULT_ROL.toString()))) + .andExpect(jsonPath("$.[*].estado").value(hasItem(DEFAULT_ESTADO.toString()))) + .andExpect(jsonPath("$.[*].fechaAgregado").value(hasItem(sameInstant(DEFAULT_FECHA_AGREGADO)))); + + // Check, that the count call also returns 1 + restUsuarioEncuestaMockMvc + .perform(get(ENTITY_API_URL + "/count?sort=id,desc&" + filter)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(content().string("1")); + } + + /** + * Executes the search, and checks that the default entity is not returned. + */ + private void defaultUsuarioEncuestaShouldNotBeFound(String filter) throws Exception { + restUsuarioEncuestaMockMvc + .perform(get(ENTITY_API_URL + "?sort=id,desc&" + filter)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$").isArray()) + .andExpect(jsonPath("$").isEmpty()); + + // Check, that the count call also returns 0 + restUsuarioEncuestaMockMvc + .perform(get(ENTITY_API_URL + "/count?sort=id,desc&" + filter)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(content().string("0")); + } + + @Test + @Transactional + void getNonExistingUsuarioEncuesta() throws Exception { + // Get the usuarioEncuesta + restUsuarioEncuestaMockMvc.perform(get(ENTITY_API_URL_ID, Long.MAX_VALUE)).andExpect(status().isNotFound()); + } + + @Test + @Transactional + void putNewUsuarioEncuesta() throws Exception { + // Initialize the database + usuarioEncuestaRepository.saveAndFlush(usuarioEncuesta); + + int databaseSizeBeforeUpdate = usuarioEncuestaRepository.findAll().size(); + + // Update the usuarioEncuesta + UsuarioEncuesta updatedUsuarioEncuesta = usuarioEncuestaRepository.findById(usuarioEncuesta.getId()).get(); + // Disconnect from session so that the updates on updatedUsuarioEncuesta are not directly saved in db + em.detach(updatedUsuarioEncuesta); + updatedUsuarioEncuesta.rol(UPDATED_ROL).estado(UPDATED_ESTADO).fechaAgregado(UPDATED_FECHA_AGREGADO); + + restUsuarioEncuestaMockMvc + .perform( + put(ENTITY_API_URL_ID, updatedUsuarioEncuesta.getId()) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(updatedUsuarioEncuesta)) + ) + .andExpect(status().isOk()); + + // Validate the UsuarioEncuesta in the database + List usuarioEncuestaList = usuarioEncuestaRepository.findAll(); + assertThat(usuarioEncuestaList).hasSize(databaseSizeBeforeUpdate); + UsuarioEncuesta testUsuarioEncuesta = usuarioEncuestaList.get(usuarioEncuestaList.size() - 1); + assertThat(testUsuarioEncuesta.getRol()).isEqualTo(UPDATED_ROL); + assertThat(testUsuarioEncuesta.getEstado()).isEqualTo(UPDATED_ESTADO); + assertThat(testUsuarioEncuesta.getFechaAgregado()).isEqualTo(UPDATED_FECHA_AGREGADO); + } + + @Test + @Transactional + void putNonExistingUsuarioEncuesta() throws Exception { + int databaseSizeBeforeUpdate = usuarioEncuestaRepository.findAll().size(); + usuarioEncuesta.setId(count.incrementAndGet()); + + // If the entity doesn't have an ID, it will throw BadRequestAlertException + restUsuarioEncuestaMockMvc + .perform( + put(ENTITY_API_URL_ID, usuarioEncuesta.getId()) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(usuarioEncuesta)) + ) + .andExpect(status().isBadRequest()); + + // Validate the UsuarioEncuesta in the database + List usuarioEncuestaList = usuarioEncuestaRepository.findAll(); + assertThat(usuarioEncuestaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void putWithIdMismatchUsuarioEncuesta() throws Exception { + int databaseSizeBeforeUpdate = usuarioEncuestaRepository.findAll().size(); + usuarioEncuesta.setId(count.incrementAndGet()); + + // If url ID doesn't match entity ID, it will throw BadRequestAlertException + restUsuarioEncuestaMockMvc + .perform( + put(ENTITY_API_URL_ID, count.incrementAndGet()) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(usuarioEncuesta)) + ) + .andExpect(status().isBadRequest()); + + // Validate the UsuarioEncuesta in the database + List usuarioEncuestaList = usuarioEncuestaRepository.findAll(); + assertThat(usuarioEncuestaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void putWithMissingIdPathParamUsuarioEncuesta() throws Exception { + int databaseSizeBeforeUpdate = usuarioEncuestaRepository.findAll().size(); + usuarioEncuesta.setId(count.incrementAndGet()); + + // If url ID doesn't match entity ID, it will throw BadRequestAlertException + restUsuarioEncuestaMockMvc + .perform( + put(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(usuarioEncuesta)) + ) + .andExpect(status().isMethodNotAllowed()); + + // Validate the UsuarioEncuesta in the database + List usuarioEncuestaList = usuarioEncuestaRepository.findAll(); + assertThat(usuarioEncuestaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void partialUpdateUsuarioEncuestaWithPatch() throws Exception { + // Initialize the database + usuarioEncuestaRepository.saveAndFlush(usuarioEncuesta); + + int databaseSizeBeforeUpdate = usuarioEncuestaRepository.findAll().size(); + + // Update the usuarioEncuesta using partial update + UsuarioEncuesta partialUpdatedUsuarioEncuesta = new UsuarioEncuesta(); + partialUpdatedUsuarioEncuesta.setId(usuarioEncuesta.getId()); + + partialUpdatedUsuarioEncuesta.rol(UPDATED_ROL).fechaAgregado(UPDATED_FECHA_AGREGADO); + + restUsuarioEncuestaMockMvc + .perform( + patch(ENTITY_API_URL_ID, partialUpdatedUsuarioEncuesta.getId()) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(partialUpdatedUsuarioEncuesta)) + ) + .andExpect(status().isOk()); + + // Validate the UsuarioEncuesta in the database + List usuarioEncuestaList = usuarioEncuestaRepository.findAll(); + assertThat(usuarioEncuestaList).hasSize(databaseSizeBeforeUpdate); + UsuarioEncuesta testUsuarioEncuesta = usuarioEncuestaList.get(usuarioEncuestaList.size() - 1); + assertThat(testUsuarioEncuesta.getRol()).isEqualTo(UPDATED_ROL); + assertThat(testUsuarioEncuesta.getEstado()).isEqualTo(DEFAULT_ESTADO); + assertThat(testUsuarioEncuesta.getFechaAgregado()).isEqualTo(UPDATED_FECHA_AGREGADO); + } + + @Test + @Transactional + void fullUpdateUsuarioEncuestaWithPatch() throws Exception { + // Initialize the database + usuarioEncuestaRepository.saveAndFlush(usuarioEncuesta); + + int databaseSizeBeforeUpdate = usuarioEncuestaRepository.findAll().size(); + + // Update the usuarioEncuesta using partial update + UsuarioEncuesta partialUpdatedUsuarioEncuesta = new UsuarioEncuesta(); + partialUpdatedUsuarioEncuesta.setId(usuarioEncuesta.getId()); + + partialUpdatedUsuarioEncuesta.rol(UPDATED_ROL).estado(UPDATED_ESTADO).fechaAgregado(UPDATED_FECHA_AGREGADO); + + restUsuarioEncuestaMockMvc + .perform( + patch(ENTITY_API_URL_ID, partialUpdatedUsuarioEncuesta.getId()) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(partialUpdatedUsuarioEncuesta)) + ) + .andExpect(status().isOk()); + + // Validate the UsuarioEncuesta in the database + List usuarioEncuestaList = usuarioEncuestaRepository.findAll(); + assertThat(usuarioEncuestaList).hasSize(databaseSizeBeforeUpdate); + UsuarioEncuesta testUsuarioEncuesta = usuarioEncuestaList.get(usuarioEncuestaList.size() - 1); + assertThat(testUsuarioEncuesta.getRol()).isEqualTo(UPDATED_ROL); + assertThat(testUsuarioEncuesta.getEstado()).isEqualTo(UPDATED_ESTADO); + assertThat(testUsuarioEncuesta.getFechaAgregado()).isEqualTo(UPDATED_FECHA_AGREGADO); + } + + @Test + @Transactional + void patchNonExistingUsuarioEncuesta() throws Exception { + int databaseSizeBeforeUpdate = usuarioEncuestaRepository.findAll().size(); + usuarioEncuesta.setId(count.incrementAndGet()); + + // If the entity doesn't have an ID, it will throw BadRequestAlertException + restUsuarioEncuestaMockMvc + .perform( + patch(ENTITY_API_URL_ID, usuarioEncuesta.getId()) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(usuarioEncuesta)) + ) + .andExpect(status().isBadRequest()); + + // Validate the UsuarioEncuesta in the database + List usuarioEncuestaList = usuarioEncuestaRepository.findAll(); + assertThat(usuarioEncuestaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void patchWithIdMismatchUsuarioEncuesta() throws Exception { + int databaseSizeBeforeUpdate = usuarioEncuestaRepository.findAll().size(); + usuarioEncuesta.setId(count.incrementAndGet()); + + // If url ID doesn't match entity ID, it will throw BadRequestAlertException + restUsuarioEncuestaMockMvc + .perform( + patch(ENTITY_API_URL_ID, count.incrementAndGet()) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(usuarioEncuesta)) + ) + .andExpect(status().isBadRequest()); + + // Validate the UsuarioEncuesta in the database + List usuarioEncuestaList = usuarioEncuestaRepository.findAll(); + assertThat(usuarioEncuestaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void patchWithMissingIdPathParamUsuarioEncuesta() throws Exception { + int databaseSizeBeforeUpdate = usuarioEncuestaRepository.findAll().size(); + usuarioEncuesta.setId(count.incrementAndGet()); + + // If url ID doesn't match entity ID, it will throw BadRequestAlertException + restUsuarioEncuestaMockMvc + .perform( + patch(ENTITY_API_URL) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(usuarioEncuesta)) + ) + .andExpect(status().isMethodNotAllowed()); + + // Validate the UsuarioEncuesta in the database + List usuarioEncuestaList = usuarioEncuestaRepository.findAll(); + assertThat(usuarioEncuestaList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void deleteUsuarioEncuesta() throws Exception { + // Initialize the database + usuarioEncuestaRepository.saveAndFlush(usuarioEncuesta); + + int databaseSizeBeforeDelete = usuarioEncuestaRepository.findAll().size(); + + // Delete the usuarioEncuesta + restUsuarioEncuestaMockMvc + .perform(delete(ENTITY_API_URL_ID, usuarioEncuesta.getId()).accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isNoContent()); + + // Validate the database contains one less item + List usuarioEncuestaList = usuarioEncuestaRepository.findAll(); + assertThat(usuarioEncuestaList).hasSize(databaseSizeBeforeDelete - 1); + } +} diff --git a/src/test/java/org/datasurvey/web/rest/UsuarioExtraResourceIT.java b/src/test/java/org/datasurvey/web/rest/UsuarioExtraResourceIT.java new file mode 100644 index 0000000..758bb89 --- /dev/null +++ b/src/test/java/org/datasurvey/web/rest/UsuarioExtraResourceIT.java @@ -0,0 +1,937 @@ +package org.datasurvey.web.rest; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.datasurvey.web.rest.TestUtil.sameInstant; +import static org.hamcrest.Matchers.hasItem; +import static org.mockito.Mockito.*; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +import java.time.Instant; +import java.time.ZoneId; +import java.time.ZoneOffset; +import java.time.ZonedDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; +import java.util.concurrent.atomic.AtomicLong; +import javax.persistence.EntityManager; +import org.datasurvey.IntegrationTest; +import org.datasurvey.domain.Encuesta; +import org.datasurvey.domain.Plantilla; +import org.datasurvey.domain.User; +import org.datasurvey.domain.UsuarioEncuesta; +import org.datasurvey.domain.UsuarioExtra; +import org.datasurvey.domain.enumeration.EstadoUsuario; +import org.datasurvey.repository.UsuarioExtraRepository; +import org.datasurvey.service.UsuarioExtraService; +import org.datasurvey.service.criteria.UsuarioExtraCriteria; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.http.MediaType; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.transaction.annotation.Transactional; + +/** + * Integration tests for the {@link UsuarioExtraResource} REST controller. + */ +@IntegrationTest +@ExtendWith(MockitoExtension.class) +@AutoConfigureMockMvc +@WithMockUser +class UsuarioExtraResourceIT { + + private static final String DEFAULT_NOMBRE = "AAAAAAAAAA"; + private static final String UPDATED_NOMBRE = "BBBBBBBBBB"; + + private static final String DEFAULT_ICONO_PERFIL = "AAAAAAAAAA"; + private static final String UPDATED_ICONO_PERFIL = "BBBBBBBBBB"; + + private static final ZonedDateTime DEFAULT_FECHA_NACIMIENTO = ZonedDateTime.ofInstant(Instant.ofEpochMilli(0L), ZoneOffset.UTC); + private static final ZonedDateTime UPDATED_FECHA_NACIMIENTO = ZonedDateTime.now(ZoneId.systemDefault()).withNano(0); + private static final ZonedDateTime SMALLER_FECHA_NACIMIENTO = ZonedDateTime.ofInstant(Instant.ofEpochMilli(-1L), ZoneOffset.UTC); + + private static final EstadoUsuario DEFAULT_ESTADO = EstadoUsuario.ACTIVE; + private static final EstadoUsuario UPDATED_ESTADO = EstadoUsuario.SUSPENDED; + + private static final String ENTITY_API_URL = "/api/usuario-extras"; + private static final String ENTITY_API_URL_ID = ENTITY_API_URL + "/{id}"; + + private static Random random = new Random(); + private static AtomicLong count = new AtomicLong(random.nextInt() + (2 * Integer.MAX_VALUE)); + + @Autowired + private UsuarioExtraRepository usuarioExtraRepository; + + @Mock + private UsuarioExtraRepository usuarioExtraRepositoryMock; + + @Mock + private UsuarioExtraService usuarioExtraServiceMock; + + @Autowired + private EntityManager em; + + @Autowired + private MockMvc restUsuarioExtraMockMvc; + + private UsuarioExtra usuarioExtra; + + /** + * Create an entity for this test. + * + * This is a static method, as tests for other entities might also need it, + * if they test an entity which requires the current entity. + */ + public static UsuarioExtra createEntity(EntityManager em) { + UsuarioExtra usuarioExtra = new UsuarioExtra() + .nombre(DEFAULT_NOMBRE) + .iconoPerfil(DEFAULT_ICONO_PERFIL) + .fechaNacimiento(DEFAULT_FECHA_NACIMIENTO) + .estado(DEFAULT_ESTADO); + return usuarioExtra; + } + + /** + * Create an updated entity for this test. + * + * This is a static method, as tests for other entities might also need it, + * if they test an entity which requires the current entity. + */ + public static UsuarioExtra createUpdatedEntity(EntityManager em) { + UsuarioExtra usuarioExtra = new UsuarioExtra() + .nombre(UPDATED_NOMBRE) + .iconoPerfil(UPDATED_ICONO_PERFIL) + .fechaNacimiento(UPDATED_FECHA_NACIMIENTO) + .estado(UPDATED_ESTADO); + return usuarioExtra; + } + + @BeforeEach + public void initTest() { + usuarioExtra = createEntity(em); + } + + @Test + @Transactional + void createUsuarioExtra() throws Exception { + int databaseSizeBeforeCreate = usuarioExtraRepository.findAll().size(); + // Create the UsuarioExtra + restUsuarioExtraMockMvc + .perform(post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(usuarioExtra))) + .andExpect(status().isCreated()); + + // Validate the UsuarioExtra in the database + List usuarioExtraList = usuarioExtraRepository.findAll(); + assertThat(usuarioExtraList).hasSize(databaseSizeBeforeCreate + 1); + UsuarioExtra testUsuarioExtra = usuarioExtraList.get(usuarioExtraList.size() - 1); + assertThat(testUsuarioExtra.getNombre()).isEqualTo(DEFAULT_NOMBRE); + assertThat(testUsuarioExtra.getIconoPerfil()).isEqualTo(DEFAULT_ICONO_PERFIL); + assertThat(testUsuarioExtra.getFechaNacimiento()).isEqualTo(DEFAULT_FECHA_NACIMIENTO); + assertThat(testUsuarioExtra.getEstado()).isEqualTo(DEFAULT_ESTADO); + } + + @Test + @Transactional + void createUsuarioExtraWithExistingId() throws Exception { + // Create the UsuarioExtra with an existing ID + usuarioExtra.setId(1L); + + int databaseSizeBeforeCreate = usuarioExtraRepository.findAll().size(); + + // An entity with an existing ID cannot be created, so this API call must fail + restUsuarioExtraMockMvc + .perform(post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(usuarioExtra))) + .andExpect(status().isBadRequest()); + + // Validate the UsuarioExtra in the database + List usuarioExtraList = usuarioExtraRepository.findAll(); + assertThat(usuarioExtraList).hasSize(databaseSizeBeforeCreate); + } + + @Test + @Transactional + void checkNombreIsRequired() throws Exception { + int databaseSizeBeforeTest = usuarioExtraRepository.findAll().size(); + // set the field null + usuarioExtra.setNombre(null); + + // Create the UsuarioExtra, which fails. + + restUsuarioExtraMockMvc + .perform(post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(usuarioExtra))) + .andExpect(status().isBadRequest()); + + List usuarioExtraList = usuarioExtraRepository.findAll(); + assertThat(usuarioExtraList).hasSize(databaseSizeBeforeTest); + } + + @Test + @Transactional + void checkEstadoIsRequired() throws Exception { + int databaseSizeBeforeTest = usuarioExtraRepository.findAll().size(); + // set the field null + usuarioExtra.setEstado(null); + + // Create the UsuarioExtra, which fails. + + restUsuarioExtraMockMvc + .perform(post(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(usuarioExtra))) + .andExpect(status().isBadRequest()); + + List usuarioExtraList = usuarioExtraRepository.findAll(); + assertThat(usuarioExtraList).hasSize(databaseSizeBeforeTest); + } + + @Test + @Transactional + void getAllUsuarioExtras() throws Exception { + // Initialize the database + usuarioExtraRepository.saveAndFlush(usuarioExtra); + + // Get all the usuarioExtraList + restUsuarioExtraMockMvc + .perform(get(ENTITY_API_URL + "?sort=id,desc")) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.[*].id").value(hasItem(usuarioExtra.getId().intValue()))) + .andExpect(jsonPath("$.[*].nombre").value(hasItem(DEFAULT_NOMBRE))) + .andExpect(jsonPath("$.[*].iconoPerfil").value(hasItem(DEFAULT_ICONO_PERFIL))) + .andExpect(jsonPath("$.[*].fechaNacimiento").value(hasItem(sameInstant(DEFAULT_FECHA_NACIMIENTO)))) + .andExpect(jsonPath("$.[*].estado").value(hasItem(DEFAULT_ESTADO.toString()))); + } + + @SuppressWarnings({ "unchecked" }) + void getAllUsuarioExtrasWithEagerRelationshipsIsEnabled() throws Exception { + when(usuarioExtraServiceMock.findAllWithEagerRelationships(any())).thenReturn(new PageImpl(new ArrayList<>())); + + restUsuarioExtraMockMvc.perform(get(ENTITY_API_URL + "?eagerload=true")).andExpect(status().isOk()); + + verify(usuarioExtraServiceMock, times(1)).findAllWithEagerRelationships(any()); + } + + @SuppressWarnings({ "unchecked" }) + void getAllUsuarioExtrasWithEagerRelationshipsIsNotEnabled() throws Exception { + when(usuarioExtraServiceMock.findAllWithEagerRelationships(any())).thenReturn(new PageImpl(new ArrayList<>())); + + restUsuarioExtraMockMvc.perform(get(ENTITY_API_URL + "?eagerload=true")).andExpect(status().isOk()); + + verify(usuarioExtraServiceMock, times(1)).findAllWithEagerRelationships(any()); + } + + @Test + @Transactional + void getUsuarioExtra() throws Exception { + // Initialize the database + usuarioExtraRepository.saveAndFlush(usuarioExtra); + + // Get the usuarioExtra + restUsuarioExtraMockMvc + .perform(get(ENTITY_API_URL_ID, usuarioExtra.getId())) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.id").value(usuarioExtra.getId().intValue())) + .andExpect(jsonPath("$.nombre").value(DEFAULT_NOMBRE)) + .andExpect(jsonPath("$.iconoPerfil").value(DEFAULT_ICONO_PERFIL)) + .andExpect(jsonPath("$.fechaNacimiento").value(sameInstant(DEFAULT_FECHA_NACIMIENTO))) + .andExpect(jsonPath("$.estado").value(DEFAULT_ESTADO.toString())); + } + + @Test + @Transactional + void getUsuarioExtrasByIdFiltering() throws Exception { + // Initialize the database + usuarioExtraRepository.saveAndFlush(usuarioExtra); + + Long id = usuarioExtra.getId(); + + defaultUsuarioExtraShouldBeFound("id.equals=" + id); + defaultUsuarioExtraShouldNotBeFound("id.notEquals=" + id); + + defaultUsuarioExtraShouldBeFound("id.greaterThanOrEqual=" + id); + defaultUsuarioExtraShouldNotBeFound("id.greaterThan=" + id); + + defaultUsuarioExtraShouldBeFound("id.lessThanOrEqual=" + id); + defaultUsuarioExtraShouldNotBeFound("id.lessThan=" + id); + } + + @Test + @Transactional + void getAllUsuarioExtrasByNombreIsEqualToSomething() throws Exception { + // Initialize the database + usuarioExtraRepository.saveAndFlush(usuarioExtra); + + // Get all the usuarioExtraList where nombre equals to DEFAULT_NOMBRE + defaultUsuarioExtraShouldBeFound("nombre.equals=" + DEFAULT_NOMBRE); + + // Get all the usuarioExtraList where nombre equals to UPDATED_NOMBRE + defaultUsuarioExtraShouldNotBeFound("nombre.equals=" + UPDATED_NOMBRE); + } + + @Test + @Transactional + void getAllUsuarioExtrasByNombreIsNotEqualToSomething() throws Exception { + // Initialize the database + usuarioExtraRepository.saveAndFlush(usuarioExtra); + + // Get all the usuarioExtraList where nombre not equals to DEFAULT_NOMBRE + defaultUsuarioExtraShouldNotBeFound("nombre.notEquals=" + DEFAULT_NOMBRE); + + // Get all the usuarioExtraList where nombre not equals to UPDATED_NOMBRE + defaultUsuarioExtraShouldBeFound("nombre.notEquals=" + UPDATED_NOMBRE); + } + + @Test + @Transactional + void getAllUsuarioExtrasByNombreIsInShouldWork() throws Exception { + // Initialize the database + usuarioExtraRepository.saveAndFlush(usuarioExtra); + + // Get all the usuarioExtraList where nombre in DEFAULT_NOMBRE or UPDATED_NOMBRE + defaultUsuarioExtraShouldBeFound("nombre.in=" + DEFAULT_NOMBRE + "," + UPDATED_NOMBRE); + + // Get all the usuarioExtraList where nombre equals to UPDATED_NOMBRE + defaultUsuarioExtraShouldNotBeFound("nombre.in=" + UPDATED_NOMBRE); + } + + @Test + @Transactional + void getAllUsuarioExtrasByNombreIsNullOrNotNull() throws Exception { + // Initialize the database + usuarioExtraRepository.saveAndFlush(usuarioExtra); + + // Get all the usuarioExtraList where nombre is not null + defaultUsuarioExtraShouldBeFound("nombre.specified=true"); + + // Get all the usuarioExtraList where nombre is null + defaultUsuarioExtraShouldNotBeFound("nombre.specified=false"); + } + + @Test + @Transactional + void getAllUsuarioExtrasByNombreContainsSomething() throws Exception { + // Initialize the database + usuarioExtraRepository.saveAndFlush(usuarioExtra); + + // Get all the usuarioExtraList where nombre contains DEFAULT_NOMBRE + defaultUsuarioExtraShouldBeFound("nombre.contains=" + DEFAULT_NOMBRE); + + // Get all the usuarioExtraList where nombre contains UPDATED_NOMBRE + defaultUsuarioExtraShouldNotBeFound("nombre.contains=" + UPDATED_NOMBRE); + } + + @Test + @Transactional + void getAllUsuarioExtrasByNombreNotContainsSomething() throws Exception { + // Initialize the database + usuarioExtraRepository.saveAndFlush(usuarioExtra); + + // Get all the usuarioExtraList where nombre does not contain DEFAULT_NOMBRE + defaultUsuarioExtraShouldNotBeFound("nombre.doesNotContain=" + DEFAULT_NOMBRE); + + // Get all the usuarioExtraList where nombre does not contain UPDATED_NOMBRE + defaultUsuarioExtraShouldBeFound("nombre.doesNotContain=" + UPDATED_NOMBRE); + } + + @Test + @Transactional + void getAllUsuarioExtrasByIconoPerfilIsEqualToSomething() throws Exception { + // Initialize the database + usuarioExtraRepository.saveAndFlush(usuarioExtra); + + // Get all the usuarioExtraList where iconoPerfil equals to DEFAULT_ICONO_PERFIL + defaultUsuarioExtraShouldBeFound("iconoPerfil.equals=" + DEFAULT_ICONO_PERFIL); + + // Get all the usuarioExtraList where iconoPerfil equals to UPDATED_ICONO_PERFIL + defaultUsuarioExtraShouldNotBeFound("iconoPerfil.equals=" + UPDATED_ICONO_PERFIL); + } + + @Test + @Transactional + void getAllUsuarioExtrasByIconoPerfilIsNotEqualToSomething() throws Exception { + // Initialize the database + usuarioExtraRepository.saveAndFlush(usuarioExtra); + + // Get all the usuarioExtraList where iconoPerfil not equals to DEFAULT_ICONO_PERFIL + defaultUsuarioExtraShouldNotBeFound("iconoPerfil.notEquals=" + DEFAULT_ICONO_PERFIL); + + // Get all the usuarioExtraList where iconoPerfil not equals to UPDATED_ICONO_PERFIL + defaultUsuarioExtraShouldBeFound("iconoPerfil.notEquals=" + UPDATED_ICONO_PERFIL); + } + + @Test + @Transactional + void getAllUsuarioExtrasByIconoPerfilIsInShouldWork() throws Exception { + // Initialize the database + usuarioExtraRepository.saveAndFlush(usuarioExtra); + + // Get all the usuarioExtraList where iconoPerfil in DEFAULT_ICONO_PERFIL or UPDATED_ICONO_PERFIL + defaultUsuarioExtraShouldBeFound("iconoPerfil.in=" + DEFAULT_ICONO_PERFIL + "," + UPDATED_ICONO_PERFIL); + + // Get all the usuarioExtraList where iconoPerfil equals to UPDATED_ICONO_PERFIL + defaultUsuarioExtraShouldNotBeFound("iconoPerfil.in=" + UPDATED_ICONO_PERFIL); + } + + @Test + @Transactional + void getAllUsuarioExtrasByIconoPerfilIsNullOrNotNull() throws Exception { + // Initialize the database + usuarioExtraRepository.saveAndFlush(usuarioExtra); + + // Get all the usuarioExtraList where iconoPerfil is not null + defaultUsuarioExtraShouldBeFound("iconoPerfil.specified=true"); + + // Get all the usuarioExtraList where iconoPerfil is null + defaultUsuarioExtraShouldNotBeFound("iconoPerfil.specified=false"); + } + + @Test + @Transactional + void getAllUsuarioExtrasByIconoPerfilContainsSomething() throws Exception { + // Initialize the database + usuarioExtraRepository.saveAndFlush(usuarioExtra); + + // Get all the usuarioExtraList where iconoPerfil contains DEFAULT_ICONO_PERFIL + defaultUsuarioExtraShouldBeFound("iconoPerfil.contains=" + DEFAULT_ICONO_PERFIL); + + // Get all the usuarioExtraList where iconoPerfil contains UPDATED_ICONO_PERFIL + defaultUsuarioExtraShouldNotBeFound("iconoPerfil.contains=" + UPDATED_ICONO_PERFIL); + } + + @Test + @Transactional + void getAllUsuarioExtrasByIconoPerfilNotContainsSomething() throws Exception { + // Initialize the database + usuarioExtraRepository.saveAndFlush(usuarioExtra); + + // Get all the usuarioExtraList where iconoPerfil does not contain DEFAULT_ICONO_PERFIL + defaultUsuarioExtraShouldNotBeFound("iconoPerfil.doesNotContain=" + DEFAULT_ICONO_PERFIL); + + // Get all the usuarioExtraList where iconoPerfil does not contain UPDATED_ICONO_PERFIL + defaultUsuarioExtraShouldBeFound("iconoPerfil.doesNotContain=" + UPDATED_ICONO_PERFIL); + } + + @Test + @Transactional + void getAllUsuarioExtrasByFechaNacimientoIsEqualToSomething() throws Exception { + // Initialize the database + usuarioExtraRepository.saveAndFlush(usuarioExtra); + + // Get all the usuarioExtraList where fechaNacimiento equals to DEFAULT_FECHA_NACIMIENTO + defaultUsuarioExtraShouldBeFound("fechaNacimiento.equals=" + DEFAULT_FECHA_NACIMIENTO); + + // Get all the usuarioExtraList where fechaNacimiento equals to UPDATED_FECHA_NACIMIENTO + defaultUsuarioExtraShouldNotBeFound("fechaNacimiento.equals=" + UPDATED_FECHA_NACIMIENTO); + } + + @Test + @Transactional + void getAllUsuarioExtrasByFechaNacimientoIsNotEqualToSomething() throws Exception { + // Initialize the database + usuarioExtraRepository.saveAndFlush(usuarioExtra); + + // Get all the usuarioExtraList where fechaNacimiento not equals to DEFAULT_FECHA_NACIMIENTO + defaultUsuarioExtraShouldNotBeFound("fechaNacimiento.notEquals=" + DEFAULT_FECHA_NACIMIENTO); + + // Get all the usuarioExtraList where fechaNacimiento not equals to UPDATED_FECHA_NACIMIENTO + defaultUsuarioExtraShouldBeFound("fechaNacimiento.notEquals=" + UPDATED_FECHA_NACIMIENTO); + } + + @Test + @Transactional + void getAllUsuarioExtrasByFechaNacimientoIsInShouldWork() throws Exception { + // Initialize the database + usuarioExtraRepository.saveAndFlush(usuarioExtra); + + // Get all the usuarioExtraList where fechaNacimiento in DEFAULT_FECHA_NACIMIENTO or UPDATED_FECHA_NACIMIENTO + defaultUsuarioExtraShouldBeFound("fechaNacimiento.in=" + DEFAULT_FECHA_NACIMIENTO + "," + UPDATED_FECHA_NACIMIENTO); + + // Get all the usuarioExtraList where fechaNacimiento equals to UPDATED_FECHA_NACIMIENTO + defaultUsuarioExtraShouldNotBeFound("fechaNacimiento.in=" + UPDATED_FECHA_NACIMIENTO); + } + + @Test + @Transactional + void getAllUsuarioExtrasByFechaNacimientoIsNullOrNotNull() throws Exception { + // Initialize the database + usuarioExtraRepository.saveAndFlush(usuarioExtra); + + // Get all the usuarioExtraList where fechaNacimiento is not null + defaultUsuarioExtraShouldBeFound("fechaNacimiento.specified=true"); + + // Get all the usuarioExtraList where fechaNacimiento is null + defaultUsuarioExtraShouldNotBeFound("fechaNacimiento.specified=false"); + } + + @Test + @Transactional + void getAllUsuarioExtrasByFechaNacimientoIsGreaterThanOrEqualToSomething() throws Exception { + // Initialize the database + usuarioExtraRepository.saveAndFlush(usuarioExtra); + + // Get all the usuarioExtraList where fechaNacimiento is greater than or equal to DEFAULT_FECHA_NACIMIENTO + defaultUsuarioExtraShouldBeFound("fechaNacimiento.greaterThanOrEqual=" + DEFAULT_FECHA_NACIMIENTO); + + // Get all the usuarioExtraList where fechaNacimiento is greater than or equal to UPDATED_FECHA_NACIMIENTO + defaultUsuarioExtraShouldNotBeFound("fechaNacimiento.greaterThanOrEqual=" + UPDATED_FECHA_NACIMIENTO); + } + + @Test + @Transactional + void getAllUsuarioExtrasByFechaNacimientoIsLessThanOrEqualToSomething() throws Exception { + // Initialize the database + usuarioExtraRepository.saveAndFlush(usuarioExtra); + + // Get all the usuarioExtraList where fechaNacimiento is less than or equal to DEFAULT_FECHA_NACIMIENTO + defaultUsuarioExtraShouldBeFound("fechaNacimiento.lessThanOrEqual=" + DEFAULT_FECHA_NACIMIENTO); + + // Get all the usuarioExtraList where fechaNacimiento is less than or equal to SMALLER_FECHA_NACIMIENTO + defaultUsuarioExtraShouldNotBeFound("fechaNacimiento.lessThanOrEqual=" + SMALLER_FECHA_NACIMIENTO); + } + + @Test + @Transactional + void getAllUsuarioExtrasByFechaNacimientoIsLessThanSomething() throws Exception { + // Initialize the database + usuarioExtraRepository.saveAndFlush(usuarioExtra); + + // Get all the usuarioExtraList where fechaNacimiento is less than DEFAULT_FECHA_NACIMIENTO + defaultUsuarioExtraShouldNotBeFound("fechaNacimiento.lessThan=" + DEFAULT_FECHA_NACIMIENTO); + + // Get all the usuarioExtraList where fechaNacimiento is less than UPDATED_FECHA_NACIMIENTO + defaultUsuarioExtraShouldBeFound("fechaNacimiento.lessThan=" + UPDATED_FECHA_NACIMIENTO); + } + + @Test + @Transactional + void getAllUsuarioExtrasByFechaNacimientoIsGreaterThanSomething() throws Exception { + // Initialize the database + usuarioExtraRepository.saveAndFlush(usuarioExtra); + + // Get all the usuarioExtraList where fechaNacimiento is greater than DEFAULT_FECHA_NACIMIENTO + defaultUsuarioExtraShouldNotBeFound("fechaNacimiento.greaterThan=" + DEFAULT_FECHA_NACIMIENTO); + + // Get all the usuarioExtraList where fechaNacimiento is greater than SMALLER_FECHA_NACIMIENTO + defaultUsuarioExtraShouldBeFound("fechaNacimiento.greaterThan=" + SMALLER_FECHA_NACIMIENTO); + } + + @Test + @Transactional + void getAllUsuarioExtrasByEstadoIsEqualToSomething() throws Exception { + // Initialize the database + usuarioExtraRepository.saveAndFlush(usuarioExtra); + + // Get all the usuarioExtraList where estado equals to DEFAULT_ESTADO + defaultUsuarioExtraShouldBeFound("estado.equals=" + DEFAULT_ESTADO); + + // Get all the usuarioExtraList where estado equals to UPDATED_ESTADO + defaultUsuarioExtraShouldNotBeFound("estado.equals=" + UPDATED_ESTADO); + } + + @Test + @Transactional + void getAllUsuarioExtrasByEstadoIsNotEqualToSomething() throws Exception { + // Initialize the database + usuarioExtraRepository.saveAndFlush(usuarioExtra); + + // Get all the usuarioExtraList where estado not equals to DEFAULT_ESTADO + defaultUsuarioExtraShouldNotBeFound("estado.notEquals=" + DEFAULT_ESTADO); + + // Get all the usuarioExtraList where estado not equals to UPDATED_ESTADO + defaultUsuarioExtraShouldBeFound("estado.notEquals=" + UPDATED_ESTADO); + } + + @Test + @Transactional + void getAllUsuarioExtrasByEstadoIsInShouldWork() throws Exception { + // Initialize the database + usuarioExtraRepository.saveAndFlush(usuarioExtra); + + // Get all the usuarioExtraList where estado in DEFAULT_ESTADO or UPDATED_ESTADO + defaultUsuarioExtraShouldBeFound("estado.in=" + DEFAULT_ESTADO + "," + UPDATED_ESTADO); + + // Get all the usuarioExtraList where estado equals to UPDATED_ESTADO + defaultUsuarioExtraShouldNotBeFound("estado.in=" + UPDATED_ESTADO); + } + + @Test + @Transactional + void getAllUsuarioExtrasByEstadoIsNullOrNotNull() throws Exception { + // Initialize the database + usuarioExtraRepository.saveAndFlush(usuarioExtra); + + // Get all the usuarioExtraList where estado is not null + defaultUsuarioExtraShouldBeFound("estado.specified=true"); + + // Get all the usuarioExtraList where estado is null + defaultUsuarioExtraShouldNotBeFound("estado.specified=false"); + } + + @Test + @Transactional + void getAllUsuarioExtrasByUserIsEqualToSomething() throws Exception { + // Initialize the database + usuarioExtraRepository.saveAndFlush(usuarioExtra); + User user = UserResourceIT.createEntity(em); + em.persist(user); + em.flush(); + usuarioExtra.setUser(user); + usuarioExtraRepository.saveAndFlush(usuarioExtra); + Long userId = user.getId(); + + // Get all the usuarioExtraList where user equals to userId + defaultUsuarioExtraShouldBeFound("userId.equals=" + userId); + + // Get all the usuarioExtraList where user equals to (userId + 1) + defaultUsuarioExtraShouldNotBeFound("userId.equals=" + (userId + 1)); + } + + @Test + @Transactional + void getAllUsuarioExtrasByEncuestaIsEqualToSomething() throws Exception { + // Initialize the database + usuarioExtraRepository.saveAndFlush(usuarioExtra); + Encuesta encuesta = EncuestaResourceIT.createEntity(em); + em.persist(encuesta); + em.flush(); + usuarioExtra.addEncuesta(encuesta); + usuarioExtraRepository.saveAndFlush(usuarioExtra); + Long encuestaId = encuesta.getId(); + + // Get all the usuarioExtraList where encuesta equals to encuestaId + defaultUsuarioExtraShouldBeFound("encuestaId.equals=" + encuestaId); + + // Get all the usuarioExtraList where encuesta equals to (encuestaId + 1) + defaultUsuarioExtraShouldNotBeFound("encuestaId.equals=" + (encuestaId + 1)); + } + + @Test + @Transactional + void getAllUsuarioExtrasByUsuarioEncuestaIsEqualToSomething() throws Exception { + // Initialize the database + usuarioExtraRepository.saveAndFlush(usuarioExtra); + UsuarioEncuesta usuarioEncuesta = UsuarioEncuestaResourceIT.createEntity(em); + em.persist(usuarioEncuesta); + em.flush(); + usuarioExtra.addUsuarioEncuesta(usuarioEncuesta); + usuarioExtraRepository.saveAndFlush(usuarioExtra); + Long usuarioEncuestaId = usuarioEncuesta.getId(); + + // Get all the usuarioExtraList where usuarioEncuesta equals to usuarioEncuestaId + defaultUsuarioExtraShouldBeFound("usuarioEncuestaId.equals=" + usuarioEncuestaId); + + // Get all the usuarioExtraList where usuarioEncuesta equals to (usuarioEncuestaId + 1) + defaultUsuarioExtraShouldNotBeFound("usuarioEncuestaId.equals=" + (usuarioEncuestaId + 1)); + } + + @Test + @Transactional + void getAllUsuarioExtrasByPlantillaIsEqualToSomething() throws Exception { + // Initialize the database + usuarioExtraRepository.saveAndFlush(usuarioExtra); + Plantilla plantilla = PlantillaResourceIT.createEntity(em); + em.persist(plantilla); + em.flush(); + usuarioExtra.addPlantilla(plantilla); + usuarioExtraRepository.saveAndFlush(usuarioExtra); + Long plantillaId = plantilla.getId(); + + // Get all the usuarioExtraList where plantilla equals to plantillaId + defaultUsuarioExtraShouldBeFound("plantillaId.equals=" + plantillaId); + + // Get all the usuarioExtraList where plantilla equals to (plantillaId + 1) + defaultUsuarioExtraShouldNotBeFound("plantillaId.equals=" + (plantillaId + 1)); + } + + /** + * Executes the search, and checks that the default entity is returned. + */ + private void defaultUsuarioExtraShouldBeFound(String filter) throws Exception { + restUsuarioExtraMockMvc + .perform(get(ENTITY_API_URL + "?sort=id,desc&" + filter)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$.[*].id").value(hasItem(usuarioExtra.getId().intValue()))) + .andExpect(jsonPath("$.[*].nombre").value(hasItem(DEFAULT_NOMBRE))) + .andExpect(jsonPath("$.[*].iconoPerfil").value(hasItem(DEFAULT_ICONO_PERFIL))) + .andExpect(jsonPath("$.[*].fechaNacimiento").value(hasItem(sameInstant(DEFAULT_FECHA_NACIMIENTO)))) + .andExpect(jsonPath("$.[*].estado").value(hasItem(DEFAULT_ESTADO.toString()))); + + // Check, that the count call also returns 1 + restUsuarioExtraMockMvc + .perform(get(ENTITY_API_URL + "/count?sort=id,desc&" + filter)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(content().string("1")); + } + + /** + * Executes the search, and checks that the default entity is not returned. + */ + private void defaultUsuarioExtraShouldNotBeFound(String filter) throws Exception { + restUsuarioExtraMockMvc + .perform(get(ENTITY_API_URL + "?sort=id,desc&" + filter)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(jsonPath("$").isArray()) + .andExpect(jsonPath("$").isEmpty()); + + // Check, that the count call also returns 0 + restUsuarioExtraMockMvc + .perform(get(ENTITY_API_URL + "/count?sort=id,desc&" + filter)) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE)) + .andExpect(content().string("0")); + } + + @Test + @Transactional + void getNonExistingUsuarioExtra() throws Exception { + // Get the usuarioExtra + restUsuarioExtraMockMvc.perform(get(ENTITY_API_URL_ID, Long.MAX_VALUE)).andExpect(status().isNotFound()); + } + + @Test + @Transactional + void putNewUsuarioExtra() throws Exception { + // Initialize the database + usuarioExtraRepository.saveAndFlush(usuarioExtra); + + int databaseSizeBeforeUpdate = usuarioExtraRepository.findAll().size(); + + // Update the usuarioExtra + UsuarioExtra updatedUsuarioExtra = usuarioExtraRepository.findById(usuarioExtra.getId()).get(); + // Disconnect from session so that the updates on updatedUsuarioExtra are not directly saved in db + em.detach(updatedUsuarioExtra); + updatedUsuarioExtra + .nombre(UPDATED_NOMBRE) + .iconoPerfil(UPDATED_ICONO_PERFIL) + .fechaNacimiento(UPDATED_FECHA_NACIMIENTO) + .estado(UPDATED_ESTADO); + + restUsuarioExtraMockMvc + .perform( + put(ENTITY_API_URL_ID, updatedUsuarioExtra.getId()) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(updatedUsuarioExtra)) + ) + .andExpect(status().isOk()); + + // Validate the UsuarioExtra in the database + List usuarioExtraList = usuarioExtraRepository.findAll(); + assertThat(usuarioExtraList).hasSize(databaseSizeBeforeUpdate); + UsuarioExtra testUsuarioExtra = usuarioExtraList.get(usuarioExtraList.size() - 1); + assertThat(testUsuarioExtra.getNombre()).isEqualTo(UPDATED_NOMBRE); + assertThat(testUsuarioExtra.getIconoPerfil()).isEqualTo(UPDATED_ICONO_PERFIL); + assertThat(testUsuarioExtra.getFechaNacimiento()).isEqualTo(UPDATED_FECHA_NACIMIENTO); + assertThat(testUsuarioExtra.getEstado()).isEqualTo(UPDATED_ESTADO); + } + + @Test + @Transactional + void putNonExistingUsuarioExtra() throws Exception { + int databaseSizeBeforeUpdate = usuarioExtraRepository.findAll().size(); + usuarioExtra.setId(count.incrementAndGet()); + + // If the entity doesn't have an ID, it will throw BadRequestAlertException + restUsuarioExtraMockMvc + .perform( + put(ENTITY_API_URL_ID, usuarioExtra.getId()) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(usuarioExtra)) + ) + .andExpect(status().isBadRequest()); + + // Validate the UsuarioExtra in the database + List usuarioExtraList = usuarioExtraRepository.findAll(); + assertThat(usuarioExtraList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void putWithIdMismatchUsuarioExtra() throws Exception { + int databaseSizeBeforeUpdate = usuarioExtraRepository.findAll().size(); + usuarioExtra.setId(count.incrementAndGet()); + + // If url ID doesn't match entity ID, it will throw BadRequestAlertException + restUsuarioExtraMockMvc + .perform( + put(ENTITY_API_URL_ID, count.incrementAndGet()) + .contentType(MediaType.APPLICATION_JSON) + .content(TestUtil.convertObjectToJsonBytes(usuarioExtra)) + ) + .andExpect(status().isBadRequest()); + + // Validate the UsuarioExtra in the database + List usuarioExtraList = usuarioExtraRepository.findAll(); + assertThat(usuarioExtraList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void putWithMissingIdPathParamUsuarioExtra() throws Exception { + int databaseSizeBeforeUpdate = usuarioExtraRepository.findAll().size(); + usuarioExtra.setId(count.incrementAndGet()); + + // If url ID doesn't match entity ID, it will throw BadRequestAlertException + restUsuarioExtraMockMvc + .perform(put(ENTITY_API_URL).contentType(MediaType.APPLICATION_JSON).content(TestUtil.convertObjectToJsonBytes(usuarioExtra))) + .andExpect(status().isMethodNotAllowed()); + + // Validate the UsuarioExtra in the database + List usuarioExtraList = usuarioExtraRepository.findAll(); + assertThat(usuarioExtraList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void partialUpdateUsuarioExtraWithPatch() throws Exception { + // Initialize the database + usuarioExtraRepository.saveAndFlush(usuarioExtra); + + int databaseSizeBeforeUpdate = usuarioExtraRepository.findAll().size(); + + // Update the usuarioExtra using partial update + UsuarioExtra partialUpdatedUsuarioExtra = new UsuarioExtra(); + partialUpdatedUsuarioExtra.setId(usuarioExtra.getId()); + + partialUpdatedUsuarioExtra.nombre(UPDATED_NOMBRE).fechaNacimiento(UPDATED_FECHA_NACIMIENTO).estado(UPDATED_ESTADO); + + restUsuarioExtraMockMvc + .perform( + patch(ENTITY_API_URL_ID, partialUpdatedUsuarioExtra.getId()) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(partialUpdatedUsuarioExtra)) + ) + .andExpect(status().isOk()); + + // Validate the UsuarioExtra in the database + List usuarioExtraList = usuarioExtraRepository.findAll(); + assertThat(usuarioExtraList).hasSize(databaseSizeBeforeUpdate); + UsuarioExtra testUsuarioExtra = usuarioExtraList.get(usuarioExtraList.size() - 1); + assertThat(testUsuarioExtra.getNombre()).isEqualTo(UPDATED_NOMBRE); + assertThat(testUsuarioExtra.getIconoPerfil()).isEqualTo(DEFAULT_ICONO_PERFIL); + assertThat(testUsuarioExtra.getFechaNacimiento()).isEqualTo(UPDATED_FECHA_NACIMIENTO); + assertThat(testUsuarioExtra.getEstado()).isEqualTo(UPDATED_ESTADO); + } + + @Test + @Transactional + void fullUpdateUsuarioExtraWithPatch() throws Exception { + // Initialize the database + usuarioExtraRepository.saveAndFlush(usuarioExtra); + + int databaseSizeBeforeUpdate = usuarioExtraRepository.findAll().size(); + + // Update the usuarioExtra using partial update + UsuarioExtra partialUpdatedUsuarioExtra = new UsuarioExtra(); + partialUpdatedUsuarioExtra.setId(usuarioExtra.getId()); + + partialUpdatedUsuarioExtra + .nombre(UPDATED_NOMBRE) + .iconoPerfil(UPDATED_ICONO_PERFIL) + .fechaNacimiento(UPDATED_FECHA_NACIMIENTO) + .estado(UPDATED_ESTADO); + + restUsuarioExtraMockMvc + .perform( + patch(ENTITY_API_URL_ID, partialUpdatedUsuarioExtra.getId()) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(partialUpdatedUsuarioExtra)) + ) + .andExpect(status().isOk()); + + // Validate the UsuarioExtra in the database + List usuarioExtraList = usuarioExtraRepository.findAll(); + assertThat(usuarioExtraList).hasSize(databaseSizeBeforeUpdate); + UsuarioExtra testUsuarioExtra = usuarioExtraList.get(usuarioExtraList.size() - 1); + assertThat(testUsuarioExtra.getNombre()).isEqualTo(UPDATED_NOMBRE); + assertThat(testUsuarioExtra.getIconoPerfil()).isEqualTo(UPDATED_ICONO_PERFIL); + assertThat(testUsuarioExtra.getFechaNacimiento()).isEqualTo(UPDATED_FECHA_NACIMIENTO); + assertThat(testUsuarioExtra.getEstado()).isEqualTo(UPDATED_ESTADO); + } + + @Test + @Transactional + void patchNonExistingUsuarioExtra() throws Exception { + int databaseSizeBeforeUpdate = usuarioExtraRepository.findAll().size(); + usuarioExtra.setId(count.incrementAndGet()); + + // If the entity doesn't have an ID, it will throw BadRequestAlertException + restUsuarioExtraMockMvc + .perform( + patch(ENTITY_API_URL_ID, usuarioExtra.getId()) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(usuarioExtra)) + ) + .andExpect(status().isBadRequest()); + + // Validate the UsuarioExtra in the database + List usuarioExtraList = usuarioExtraRepository.findAll(); + assertThat(usuarioExtraList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void patchWithIdMismatchUsuarioExtra() throws Exception { + int databaseSizeBeforeUpdate = usuarioExtraRepository.findAll().size(); + usuarioExtra.setId(count.incrementAndGet()); + + // If url ID doesn't match entity ID, it will throw BadRequestAlertException + restUsuarioExtraMockMvc + .perform( + patch(ENTITY_API_URL_ID, count.incrementAndGet()) + .contentType("application/merge-patch+json") + .content(TestUtil.convertObjectToJsonBytes(usuarioExtra)) + ) + .andExpect(status().isBadRequest()); + + // Validate the UsuarioExtra in the database + List usuarioExtraList = usuarioExtraRepository.findAll(); + assertThat(usuarioExtraList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void patchWithMissingIdPathParamUsuarioExtra() throws Exception { + int databaseSizeBeforeUpdate = usuarioExtraRepository.findAll().size(); + usuarioExtra.setId(count.incrementAndGet()); + + // If url ID doesn't match entity ID, it will throw BadRequestAlertException + restUsuarioExtraMockMvc + .perform( + patch(ENTITY_API_URL).contentType("application/merge-patch+json").content(TestUtil.convertObjectToJsonBytes(usuarioExtra)) + ) + .andExpect(status().isMethodNotAllowed()); + + // Validate the UsuarioExtra in the database + List usuarioExtraList = usuarioExtraRepository.findAll(); + assertThat(usuarioExtraList).hasSize(databaseSizeBeforeUpdate); + } + + @Test + @Transactional + void deleteUsuarioExtra() throws Exception { + // Initialize the database + usuarioExtraRepository.saveAndFlush(usuarioExtra); + + int databaseSizeBeforeDelete = usuarioExtraRepository.findAll().size(); + + // Delete the usuarioExtra + restUsuarioExtraMockMvc + .perform(delete(ENTITY_API_URL_ID, usuarioExtra.getId()).accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isNoContent()); + + // Validate the database contains one less item + List usuarioExtraList = usuarioExtraRepository.findAll(); + assertThat(usuarioExtraList).hasSize(databaseSizeBeforeDelete - 1); + } +} diff --git a/src/test/java/org/datasurvey/web/rest/WithUnauthenticatedMockUser.java b/src/test/java/org/datasurvey/web/rest/WithUnauthenticatedMockUser.java new file mode 100644 index 0000000..66be52d --- /dev/null +++ b/src/test/java/org/datasurvey/web/rest/WithUnauthenticatedMockUser.java @@ -0,0 +1,23 @@ +package org.datasurvey.web.rest; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.test.context.support.WithSecurityContext; +import org.springframework.security.test.context.support.WithSecurityContextFactory; + +@Target({ ElementType.METHOD, ElementType.TYPE }) +@Retention(RetentionPolicy.RUNTIME) +@WithSecurityContext(factory = WithUnauthenticatedMockUser.Factory.class) +public @interface WithUnauthenticatedMockUser { + class Factory implements WithSecurityContextFactory { + + @Override + public SecurityContext createSecurityContext(WithUnauthenticatedMockUser annotation) { + return SecurityContextHolder.createEmptyContext(); + } + } +} diff --git a/src/test/java/org/datasurvey/web/rest/errors/ExceptionTranslatorIT.java b/src/test/java/org/datasurvey/web/rest/errors/ExceptionTranslatorIT.java new file mode 100644 index 0000000..0fdbae9 --- /dev/null +++ b/src/test/java/org/datasurvey/web/rest/errors/ExceptionTranslatorIT.java @@ -0,0 +1,118 @@ +package org.datasurvey.web.rest.errors; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import org.datasurvey.IntegrationTest; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.web.servlet.MockMvc; + +/** + * Integration tests {@link ExceptionTranslator} controller advice. + */ +@WithMockUser +@AutoConfigureMockMvc +@IntegrationTest +class ExceptionTranslatorIT { + + @Autowired + private MockMvc mockMvc; + + @Test + void testConcurrencyFailure() throws Exception { + mockMvc + .perform(get("/api/exception-translator-test/concurrency-failure")) + .andExpect(status().isConflict()) + .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON)) + .andExpect(jsonPath("$.message").value(ErrorConstants.ERR_CONCURRENCY_FAILURE)); + } + + @Test + void testMethodArgumentNotValid() throws Exception { + mockMvc + .perform(post("/api/exception-translator-test/method-argument").content("{}").contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isBadRequest()) + .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON)) + .andExpect(jsonPath("$.message").value(ErrorConstants.ERR_VALIDATION)) + .andExpect(jsonPath("$.fieldErrors.[0].objectName").value("test")) + .andExpect(jsonPath("$.fieldErrors.[0].field").value("test")) + .andExpect(jsonPath("$.fieldErrors.[0].message").value("must not be null")); + } + + @Test + void testMissingServletRequestPartException() throws Exception { + mockMvc + .perform(get("/api/exception-translator-test/missing-servlet-request-part")) + .andExpect(status().isBadRequest()) + .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON)) + .andExpect(jsonPath("$.message").value("error.http.400")); + } + + @Test + void testMissingServletRequestParameterException() throws Exception { + mockMvc + .perform(get("/api/exception-translator-test/missing-servlet-request-parameter")) + .andExpect(status().isBadRequest()) + .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON)) + .andExpect(jsonPath("$.message").value("error.http.400")); + } + + @Test + void testAccessDenied() throws Exception { + mockMvc + .perform(get("/api/exception-translator-test/access-denied")) + .andExpect(status().isForbidden()) + .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON)) + .andExpect(jsonPath("$.message").value("error.http.403")) + .andExpect(jsonPath("$.detail").value("test access denied!")); + } + + @Test + void testUnauthorized() throws Exception { + mockMvc + .perform(get("/api/exception-translator-test/unauthorized")) + .andExpect(status().isUnauthorized()) + .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON)) + .andExpect(jsonPath("$.message").value("error.http.401")) + .andExpect(jsonPath("$.path").value("/api/exception-translator-test/unauthorized")) + .andExpect(jsonPath("$.detail").value("test authentication failed!")); + } + + @Test + void testMethodNotSupported() throws Exception { + mockMvc + .perform(post("/api/exception-translator-test/access-denied")) + .andExpect(status().isMethodNotAllowed()) + .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON)) + .andExpect(jsonPath("$.message").value("error.http.405")) + .andExpect(jsonPath("$.detail").value("Request method 'POST' not supported")); + } + + @Test + void testExceptionWithResponseStatus() throws Exception { + mockMvc + .perform(get("/api/exception-translator-test/response-status")) + .andExpect(status().isBadRequest()) + .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON)) + .andExpect(jsonPath("$.message").value("error.http.400")) + .andExpect(jsonPath("$.title").value("test response status")); + } + + @Test + void testInternalServerError() throws Exception { + mockMvc + .perform(get("/api/exception-translator-test/internal-server-error")) + .andExpect(status().isInternalServerError()) + .andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON)) + .andExpect(jsonPath("$.message").value("error.http.500")) + .andExpect(jsonPath("$.title").value("Internal Server Error")); + } +} diff --git a/src/test/java/org/datasurvey/web/rest/errors/ExceptionTranslatorTestController.java b/src/test/java/org/datasurvey/web/rest/errors/ExceptionTranslatorTestController.java new file mode 100644 index 0000000..23adc5c --- /dev/null +++ b/src/test/java/org/datasurvey/web/rest/errors/ExceptionTranslatorTestController.java @@ -0,0 +1,66 @@ +package org.datasurvey.web.rest.errors; + +import javax.validation.Valid; +import javax.validation.constraints.NotNull; +import org.springframework.dao.ConcurrencyFailureException; +import org.springframework.http.HttpStatus; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/api/exception-translator-test") +public class ExceptionTranslatorTestController { + + @GetMapping("/concurrency-failure") + public void concurrencyFailure() { + throw new ConcurrencyFailureException("test concurrency failure"); + } + + @PostMapping("/method-argument") + public void methodArgument(@Valid @RequestBody TestDTO testDTO) {} + + @GetMapping("/missing-servlet-request-part") + public void missingServletRequestPartException(@RequestPart String part) {} + + @GetMapping("/missing-servlet-request-parameter") + public void missingServletRequestParameterException(@RequestParam String param) {} + + @GetMapping("/access-denied") + public void accessdenied() { + throw new AccessDeniedException("test access denied!"); + } + + @GetMapping("/unauthorized") + public void unauthorized() { + throw new BadCredentialsException("test authentication failed!"); + } + + @GetMapping("/response-status") + public void exceptionWithResponseStatus() { + throw new TestResponseStatusException(); + } + + @GetMapping("/internal-server-error") + public void internalServerError() { + throw new RuntimeException(); + } + + public static class TestDTO { + + @NotNull + private String test; + + public String getTest() { + return test; + } + + public void setTest(String test) { + this.test = test; + } + } + + @ResponseStatus(value = HttpStatus.BAD_REQUEST, reason = "test response status") + @SuppressWarnings("serial") + public static class TestResponseStatusException extends RuntimeException {} +} diff --git a/src/test/resources/config/application-testcontainers.yml b/src/test/resources/config/application-testcontainers.yml new file mode 100644 index 0000000..d07f8fd --- /dev/null +++ b/src/test/resources/config/application-testcontainers.yml @@ -0,0 +1,27 @@ +# =================================================================== +# Spring Boot configuration. +# +# This configuration is used for unit/integration tests with testcontainers database containers. +# +# To activate this configuration launch integration tests with the 'testcontainers' profile +# +# More information on database containers: https://www.testcontainers.org/modules/databases/ +# =================================================================== + +spring: + datasource: + type: com.zaxxer.hikari.HikariDataSource + driver-class-name: org.testcontainers.jdbc.ContainerDatabaseDriver + url: jdbc:tc:mysql:8.0.25:///DataSurvey?useUnicode=true&characterEncoding=utf8&useSSL=false&useLegacyDatetimeCode=false&serverTimezone=${user.timezone}&TC_TMPFS=/testtmpfs:rw + username: root + password: + hikari: + poolName: Hikari + auto-commit: false + data-source-properties: + cachePrepStmts: true + prepStmtCacheSize: 250 + prepStmtCacheSqlLimit: 2048 + useServerPrepStmts: true + jpa: + database-platform: org.hibernate.dialect.MySQL8Dialect diff --git a/src/test/resources/config/application.yml b/src/test/resources/config/application.yml new file mode 100644 index 0000000..d5ca08a --- /dev/null +++ b/src/test/resources/config/application.yml @@ -0,0 +1,112 @@ +# =================================================================== +# Spring Boot configuration. +# +# This configuration is used for unit/integration tests. +# +# More information on profiles: https://www.jhipster.tech/profiles/ +# More information on configuration properties: https://www.jhipster.tech/common-application-properties/ +# =================================================================== + +# =================================================================== +# Standard Spring Boot properties. +# Full reference is available at: +# http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html +# =================================================================== + +spring: + profiles: + # Uncomment the following line to enable tests against production database type rather than H2, using Testcontainers + #active: testcontainers + application: + name: DataSurvey + datasource: + type: com.zaxxer.hikari.HikariDataSource + url: jdbc:h2:mem:datasurvey;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE + name: + username: + password: + hikari: + auto-commit: false + jackson: + serialization: + write-durations-as-timestamps: false + jpa: + database-platform: tech.jhipster.domain.util.FixedH2Dialect + open-in-view: false + hibernate: + ddl-auto: none + naming: + physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy + implicit-strategy: org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy + properties: + hibernate.id.new_generator_mappings: true + hibernate.connection.provider_disables_autocommit: true + hibernate.cache.use_second_level_cache: false + hibernate.cache.use_query_cache: false + hibernate.generate_statistics: false + hibernate.hbm2ddl.auto: validate + hibernate.jdbc.time_zone: UTC + hibernate.query.fail_on_pagination_over_collection_fetch: true + liquibase: + contexts: test + mail: + host: localhost + main: + allow-bean-definition-overriding: true + messages: + basename: i18n/messages + task: + execution: + thread-name-prefix: data-survey-task- + pool: + core-size: 1 + max-size: 50 + queue-capacity: 10000 + scheduling: + thread-name-prefix: data-survey-scheduling- + pool: + size: 1 + thymeleaf: + mode: HTML + +server: + port: 10344 + address: localhost + +# =================================================================== +# JHipster specific properties +# +# Full reference is available at: https://www.jhipster.tech/common-application-properties/ +# =================================================================== + +jhipster: + clientApp: + name: 'dataSurveyApp' + logging: + # To test json console appender + use-json-format: false + logstash: + enabled: false + host: localhost + port: 5000 + queue-size: 512 + mail: + from: test@localhost + base-url: http://127.0.0.1:8080 + security: + authentication: + jwt: + # This token must be encoded using Base64 (you can type `echo 'secret-key'|base64` on your command line) + base64-secret: ZjRmZGRhNzFhNDI5OTRmYjkzZmQ0NzI5Yzc3YTYyODBkMjFjZGY1OWMwNzY5YTJkOTA1ZDY3YzE1MWEwMGRkYzg4ZTNlOGUwNTAzMzdiMWVjNDA4NjFiY2JhNTNhYzhkZjQ3N2MyMmY5YzA5ZTFiNzIzMjJjMTg4MmFlNTUyOTY= + # Token is valid 24 hours + token-validity-in-seconds: 86400 +# =================================================================== +# Application specific properties +# Add your own application properties here, see the ApplicationProperties class +# to have type-safe configuration, like in the JHipsterProperties above +# +# More documentation is available at: +# https://www.jhipster.tech/common-application-properties/ +# =================================================================== + +# application: diff --git a/src/test/resources/i18n/messages_en.properties b/src/test/resources/i18n/messages_en.properties new file mode 100644 index 0000000..f19db86 --- /dev/null +++ b/src/test/resources/i18n/messages_en.properties @@ -0,0 +1 @@ +email.test.title=test title diff --git a/src/test/resources/i18n/messages_es.properties b/src/test/resources/i18n/messages_es.properties new file mode 100644 index 0000000..5282933 --- /dev/null +++ b/src/test/resources/i18n/messages_es.properties @@ -0,0 +1 @@ +email.test.title=ActivaciĆ³n de DataSurvey diff --git a/src/test/resources/logback.xml b/src/test/resources/logback.xml new file mode 100644 index 0000000..c2b7350 --- /dev/null +++ b/src/test/resources/logback.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + WARN + + + + diff --git a/src/test/resources/templates/mail/testEmail.html b/src/test/resources/templates/mail/testEmail.html new file mode 100644 index 0000000..a4ca16a --- /dev/null +++ b/src/test/resources/templates/mail/testEmail.html @@ -0,0 +1 @@ + diff --git a/tsconfig.app.json b/tsconfig.app.json new file mode 100644 index 0000000..88fe8c0 --- /dev/null +++ b/tsconfig.app.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./target/classes/static/app", + "types": [] + }, + "files": ["src/main/webapp/main.ts", "src/main/webapp/polyfills.ts"], + "include": ["src/main/webapp/**/*.d.ts"] +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..8b4175d --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "baseUrl": "src/main/webapp/", + "outDir": "./target/classes/static/", + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "sourceMap": true, + "declaration": false, + "downlevelIteration": true, + "experimentalDecorators": true, + "moduleResolution": "node", + "importHelpers": true, + "target": "es2017", + "module": "es2020", + "lib": ["es2018", "dom"] + }, + "angularCompilerOptions": { + "strictInjectionParameters": true, + "strictInputAccessModifiers": true, + "strictTemplates": true, + "preserveWhitespaces": true + } +} diff --git a/tsconfig.spec.json b/tsconfig.spec.json new file mode 100644 index 0000000..f990eb2 --- /dev/null +++ b/tsconfig.spec.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "emitDecoratorMetadata": true, + "outDir": "target/out-tsc/spec", + "types": ["jest", "node"] + }, + "files": ["src/main/webapp/polyfills.ts"], + "include": ["src/main/webapp/**/*.spec.ts", "src/main/webapp/**/*.d.ts"] +} diff --git a/webpack/environment.js b/webpack/environment.js new file mode 100644 index 0000000..a1b3950 --- /dev/null +++ b/webpack/environment.js @@ -0,0 +1,6 @@ +module.exports = { + __TIMESTAMP__: String(new Date().getTime()), + __VERSION__: process.env.hasOwnProperty('APP_VERSION') ? process.env.APP_VERSION : 'DEV', + __DEBUG_INFO_ENABLED__: false, + __SERVER_API_URL__: '', +}; diff --git a/webpack/logo-jhipster.png b/webpack/logo-jhipster.png new file mode 100644 index 0000000..e301aa9 Binary files /dev/null and b/webpack/logo-jhipster.png differ diff --git a/webpack/proxy.conf.js b/webpack/proxy.conf.js new file mode 100644 index 0000000..92ad8b4 --- /dev/null +++ b/webpack/proxy.conf.js @@ -0,0 +1,29 @@ +function setupProxy() { + const tls = process.env.TLS; + const conf = [ + { + context: [ + '/api', + '/services', + '/management', + '/swagger-resources', + '/v2/api-docs', + '/v3/api-docs', + '/h2-console', + '/auth', + '/health', + ], + target: `http${tls ? 's' : ''}://localhost:8080`, + secure: false, + changeOrigin: tls, + }, + { + context: ['/websocket'], + target: 'ws://127.0.0.1:8080', + ws: true, + }, + ]; + return conf; +} + +module.exports = setupProxy(); diff --git a/webpack/webpack.custom.js b/webpack/webpack.custom.js new file mode 100644 index 0000000..6eac884 --- /dev/null +++ b/webpack/webpack.custom.js @@ -0,0 +1,126 @@ +const webpack = require('webpack'); +const { merge } = require('webpack-merge'); +const path = require('path'); +const MergeJsonWebpackPlugin = require('merge-jsons-webpack-plugin'); +const BrowserSyncPlugin = require('browser-sync-webpack-plugin'); +const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; +const WebpackNotifierPlugin = require('webpack-notifier'); +const CopyWebpackPlugin = require('copy-webpack-plugin'); +const ESLintPlugin = require('eslint-webpack-plugin'); + +const environment = require('./environment'); + +const tls = process.env.TLS; + +module.exports = (config, options, targetOptions) => { + config.cache = { + // 1. Set cache type to filesystem + type: 'filesystem', + cacheDirectory: path.resolve(__dirname, '../target/webpack'), + buildDependencies: { + // 2. Add your config as buildDependency to get cache invalidation on config change + config: [ + __filename, + path.resolve(__dirname, 'webpack.custom.js'), + path.resolve(__dirname, '../angular.json'), + path.resolve(__dirname, '../tsconfig.app.json'), + path.resolve(__dirname, '../tsconfig.json'), + ], + }, + }; + + // PLUGINS + if (config.mode === 'development') { + config.plugins.push( + new ESLintPlugin({ + extensions: ['js', 'ts'], + }), + new WebpackNotifierPlugin({ + title: 'Data Survey', + contentImage: path.join(__dirname, 'logo-jhipster.png'), + }) + ); + } + if (targetOptions.target === 'serve' || config.watch) { + config.plugins.push( + new BrowserSyncPlugin( + { + host: 'localhost', + port: 9000, + https: tls, + proxy: { + target: `http${tls ? 's' : ''}://localhost:${targetOptions.target === 'serve' ? '4200' : '8080'}`, + ws: true, + proxyOptions: { + changeOrigin: false, //pass the Host header to the backend unchanged https://github.com/Browsersync/browser-sync/issues/430 + }, + }, + socket: { + clients: { + heartbeatTimeout: 60000, + }, + }, + /* + ghostMode: { // uncomment this part to disable BrowserSync ghostMode; https://github.com/jhipster/generator-jhipster/issues/11116 + clicks: false, + location: false, + forms: false, + scroll: false, + }, + */ + }, + { + reload: targetOptions.target === 'build', // enabled for build --watch + } + ) + ); + } + + if (config.mode === 'production') { + config.plugins.push( + new BundleAnalyzerPlugin({ + analyzerMode: 'static', + openAnalyzer: false, + // Webpack statistics in target folder + reportFilename: '../stats.html', + }) + ); + } + + const patterns = [ + // jhipster-needle-add-assets-to-webpack - JHipster will add/remove third-party resources in this array + ]; + + if (patterns.length > 0) { + config.plugins.push(new CopyWebpackPlugin({ patterns })); + } + + config.plugins.push( + new webpack.DefinePlugin({ + __TIMESTAMP__: JSON.stringify(environment.__TIMESTAMP__), + // APP_VERSION is passed as an environment variable from the Gradle / Maven build tasks. + __VERSION__: JSON.stringify(environment.__VERSION__), + __DEBUG_INFO_ENABLED__: environment.__DEBUG_INFO_ENABLED__ || config.mode === 'development', + // The root URL for API calls, ending with a '/' - for example: `"https://www.jhipster.tech:8081/myservice/"`. + // If this URL is left empty (""), then it will be relative to the current context. + // If you use an API server, in `prod` mode, you will need to enable CORS + // (see the `jhipster.cors` common JHipster property in the `application-*.yml` configurations) + __SERVER_API_URL__: JSON.stringify(environment.__SERVER_API_URL__), + }), + new MergeJsonWebpackPlugin({ + output: { + groupBy: [ + { pattern: './src/main/webapp/i18n/es/*.json', fileName: './i18n/es.json' }, + // jhipster-needle-i18n-language-webpack - JHipster will add/remove languages in this array + ], + }, + }) + ); + + config = merge( + config + // jhipster-needle-add-webpack-config - JHipster will add custom config + ); + + return config; +};