From 2e853d4478784db2ed1f2e173b6bc154368cfbd5 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 01:28:37 +0530 Subject: [PATCH 001/464] Create .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e10e727 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/.metadata/ From 8ad5ebbda91e5a9b81f067f499e57f21886e6b24 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 01:28:42 +0530 Subject: [PATCH 002/464] Create .gitignore --- DoConnect/.gitignore | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 DoConnect/.gitignore diff --git a/DoConnect/.gitignore b/DoConnect/.gitignore new file mode 100644 index 0000000..549e00a --- /dev/null +++ b/DoConnect/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ From 42e24a51e41770b23bfa4d38bb2e4e5567ff414f Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 01:28:45 +0530 Subject: [PATCH 003/464] Create maven-wrapper.jar --- DoConnect/.mvn/wrapper/maven-wrapper.jar | Bin 0 -> 58727 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 DoConnect/.mvn/wrapper/maven-wrapper.jar diff --git a/DoConnect/.mvn/wrapper/maven-wrapper.jar b/DoConnect/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..c1dd12f17644411d6e840bd5a10c6ecda0175f18 GIT binary patch literal 58727 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%0ANsA|A3-jj|r`KAo%oTajX3>^E` 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 YM{}PByk10KD_nuQ4E7Du?}+~TKh4V)`~Uy| literal 0 HcmV?d00001 From 4585134d327e1455038ada3db18d0486feb00971 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 01:28:48 +0530 Subject: [PATCH 004/464] Create maven-wrapper.properties --- DoConnect/.mvn/wrapper/maven-wrapper.properties | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 DoConnect/.mvn/wrapper/maven-wrapper.properties diff --git a/DoConnect/.mvn/wrapper/maven-wrapper.properties b/DoConnect/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..b74bf7f --- /dev/null +++ b/DoConnect/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,2 @@ +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.6/apache-maven-3.8.6-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar From d1d0cfbfe528fdd48ccea898dab74416eb15df29 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 01:28:51 +0530 Subject: [PATCH 005/464] Create mvnw --- DoConnect/mvnw | 316 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 316 insertions(+) create mode 100644 DoConnect/mvnw diff --git a/DoConnect/mvnw b/DoConnect/mvnw new file mode 100644 index 0000000..8a8fb22 --- /dev/null +++ b/DoConnect/mvnw @@ -0,0 +1,316 @@ +#!/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 +# +# https://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 /usr/local/etc/mavenrc ] ; then + . /usr/local/etc/mavenrc + fi + + 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="`\\unset -f command; \\command -v 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/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.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" || rm -f "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" || rm -f "$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 \ + $MAVEN_DEBUG_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" \ + "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" From f2f6f772047404b041863446ae2eab99d6d8da9d Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 01:28:53 +0530 Subject: [PATCH 006/464] Create mvnw.cmd --- DoConnect/mvnw.cmd | 188 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 188 insertions(+) create mode 100644 DoConnect/mvnw.cmd diff --git a/DoConnect/mvnw.cmd b/DoConnect/mvnw.cmd new file mode 100644 index 0000000..1d8ab01 --- /dev/null +++ b/DoConnect/mvnw.cmd @@ -0,0 +1,188 @@ +@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 https://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 "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* +if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\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/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + +FOR /F "usebackq 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%/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.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 "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" +if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\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% + +cmd /C exit /B %ERROR_CODE% From a4b4f3215e720249b4514599be6e0480c098cedd Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 01:28:56 +0530 Subject: [PATCH 007/464] Create pom.xml --- DoConnect/pom.xml | 80 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 DoConnect/pom.xml diff --git a/DoConnect/pom.xml b/DoConnect/pom.xml new file mode 100644 index 0000000..ec78161 --- /dev/null +++ b/DoConnect/pom.xml @@ -0,0 +1,80 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.7.3 + + + com.wipro.cp + doconnect + 0.0.1-SNAPSHOT + DoConnect + Demo project for Spring Boot + + 17 + + + + org.springframework.boot + spring-boot-starter-actuator + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-web + + + + mysql + mysql-connector-java + runtime + + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.boot + spring-boot-starter-security + + + org.springframework.boot + spring-boot-starter-validation + + + org.springframework.security + spring-security-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + + From 418df65336068a3263926a2a60f4cafb4a378811 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 01:29:03 +0530 Subject: [PATCH 008/464] Create UserController.java --- .../doconnect/controller/UserController.java | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/controller/UserController.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/UserController.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/UserController.java new file mode 100644 index 0000000..38fa0a4 --- /dev/null +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/UserController.java @@ -0,0 +1,80 @@ +package com.wipro.cp.doconnect.controller; + +import java.util.List; + +import javax.validation.Valid; +import javax.validation.constraints.Min; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import com.wipro.cp.doconnect.dto.StatusDTO; +import com.wipro.cp.doconnect.dto.UserRegisterDTO; +import com.wipro.cp.doconnect.dto.UserResponseDTO; +import com.wipro.cp.doconnect.dto.UserUpdateDTO; +import com.wipro.cp.doconnect.service.UserService; + +@RestController +@CrossOrigin +public class UserController { + + @Autowired + UserService userService; + + @GetMapping("/users") + public ResponseEntity> getAllUsers() { + return ResponseEntity.ok(userService.getAllUsers()); + } + + @GetMapping("/users/{id}") + public ResponseEntity getUserById(@PathVariable @Min(1) Long id) { + StatusDTO userStatus = userService.getUserById(id); + if (!userStatus.getIsValid()) { + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(userStatus.getStatusMessage()); + } + return ResponseEntity.ok(userStatus.getObject()); + } + + @PostMapping("/users") + public ResponseEntity createUser(@Valid @RequestBody UserRegisterDTO userRegisterDTO) { + StatusDTO userStatus = userService.createUser(userRegisterDTO); + if (!userStatus.getIsValid()) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(userStatus.getStatusMessage()); + } + return ResponseEntity.status(HttpStatus.CREATED).body(userStatus.getObject()); + } + + @PutMapping("/users/{id}") + public ResponseEntity updateUser(@Valid @RequestBody UserUpdateDTO userUpdateDTO, @PathVariable Long id) { + StatusDTO userStatus = userService.updateUser(userUpdateDTO, id); + if (!userStatus.getIsValid()) { + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(userStatus.getStatusMessage()); + } + return ResponseEntity.ok(userStatus.getObject()); + } + + @DeleteMapping("/users/{id}") + public ResponseEntity deleteUserById(@PathVariable @Min(1) Long id) { + boolean deleted = userService.deleteUserById(id); + if (deleted) { + return ResponseEntity.ok("User deleted successfully."); + } + return ResponseEntity.status(HttpStatus.NOT_FOUND).body("User with ID " + id + " does not exist."); + } + + @DeleteMapping("/users") + public ResponseEntity deleteAllUser() { + userService.deleteAllUsers(); + return ResponseEntity.ok("All users deleted successfully."); + } + +} From 46d8dbc4d4791d49d0d929e82e7f1fdff8025f62 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 01:29:06 +0530 Subject: [PATCH 009/464] Create DoConnectApplication.java --- .../wipro/cp/doconnect/DoConnectApplication.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/DoConnectApplication.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/DoConnectApplication.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/DoConnectApplication.java new file mode 100644 index 0000000..00f9b20 --- /dev/null +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/DoConnectApplication.java @@ -0,0 +1,13 @@ +package com.wipro.cp.doconnect; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class DoConnectApplication { + + public static void main(String[] args) { + SpringApplication.run(DoConnectApplication.class, args); + } + +} From feff95e1c037ec0f2f0a8ca8cc2cddbf0fc0e978 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 01:29:08 +0530 Subject: [PATCH 010/464] Create StatusDTO.java --- .../com/wipro/cp/doconnect/dto/StatusDTO.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/dto/StatusDTO.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/StatusDTO.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/StatusDTO.java new file mode 100644 index 0000000..4f1d7de --- /dev/null +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/StatusDTO.java @@ -0,0 +1,26 @@ +package com.wipro.cp.doconnect.dto; + +public class StatusDTO { + + private String statusMessage; + private boolean isValid; + private T object; + + public String getStatusMessage() { + return statusMessage; + } + public boolean getIsValid() { + return isValid; + } + public T getObject() { + return object; + } + + public StatusDTO(String statusMessage, boolean isValid, T object) { + super(); + this.statusMessage = statusMessage; + this.isValid = isValid; + this.object = object; + } + +} From 870dd24edecf35f6a29d05c43f985d01c03a782f Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 01:29:11 +0530 Subject: [PATCH 011/464] Create UserRegisterDTO.java --- .../cp/doconnect/dto/UserRegisterDTO.java | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserRegisterDTO.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserRegisterDTO.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserRegisterDTO.java new file mode 100644 index 0000000..328a164 --- /dev/null +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserRegisterDTO.java @@ -0,0 +1,54 @@ +package com.wipro.cp.doconnect.dto; + +public class UserRegisterDTO { + + private String username; + private String name; + private String email; + private String password; + private boolean isAdmin; + + public String getUsername() { + return username; + } + public void setUsername(String username) { + this.username = username; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public String getEmail() { + return email; + } + public void setEmail(String email) { + this.email = email; + } + public String getPassword() { + return password; + } + public void setPassword(String password) { + this.password = password; + } + public boolean getIsAdmin() { + return isAdmin; + } + public void setIsAdmin(boolean isAdmin) { + this.isAdmin = isAdmin; + } + + public UserRegisterDTO(String username, String name, String email, String password, boolean isAdmin) { + super(); + this.username = username; + this.name = name; + this.email = email; + this.password = password; + this.isAdmin = isAdmin; + } + public UserRegisterDTO() { + super(); + } + +} From 126cb60d71167179ec95fc978ea444332c0688af Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 01:29:13 +0530 Subject: [PATCH 012/464] Create UserResponseDTO.java --- .../cp/doconnect/dto/UserResponseDTO.java | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserResponseDTO.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserResponseDTO.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserResponseDTO.java new file mode 100644 index 0000000..7499c2a --- /dev/null +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserResponseDTO.java @@ -0,0 +1,36 @@ +package com.wipro.cp.doconnect.dto; + +public class UserResponseDTO { + + private Long id; + private String username; + private String name; + private String email; + private boolean isAdmin; + + public Long getId() { + return id; + } + public String getUsername() { + return username; + } + public String getName() { + return name; + } + public String getEmail() { + return email; + } + public boolean getIsAdmin() { + return isAdmin; + } + + public UserResponseDTO(Long id, String username, String name, String email, boolean isAdmin) { + super(); + this.id = id; + this.username = username; + this.name = name; + this.email = email; + this.isAdmin = isAdmin; + } + +} From 42ebb23c6e5c3d7b4be6e5526602922995e3d7c4 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 01:29:16 +0530 Subject: [PATCH 013/464] Create UserUpdateDTO.java --- .../wipro/cp/doconnect/dto/UserUpdateDTO.java | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserUpdateDTO.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserUpdateDTO.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserUpdateDTO.java new file mode 100644 index 0000000..93b6b37 --- /dev/null +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserUpdateDTO.java @@ -0,0 +1,31 @@ +package com.wipro.cp.doconnect.dto; + +public class UserUpdateDTO { + + private String name; + private boolean isAdmin; + + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public boolean getIsAdmin() { + return isAdmin; + } + public void setIsAdmin(boolean isAdmin) { + this.isAdmin = isAdmin; + } + + public UserUpdateDTO(String name, boolean isAdmin) { + super(); + this.name = name; + this.isAdmin = isAdmin; + } + + public UserUpdateDTO() { + super(); + } + +} From 28c0ffcf85de54b0f7abce26a25f5abbc324aab0 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 01:29:18 +0530 Subject: [PATCH 014/464] Create Answer.java --- .../com/wipro/cp/doconnect/entity/Answer.java | 108 ++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Answer.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Answer.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Answer.java new file mode 100644 index 0000000..f378c4d --- /dev/null +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Answer.java @@ -0,0 +1,108 @@ +package com.wipro.cp.doconnect.entity; + +import java.util.List; + +import javax.persistence.Column; +import javax.persistence.Convert; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +import com.wipro.cp.doconnect.util.ListToStringConverter; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Entity +@Data +@NoArgsConstructor +@AllArgsConstructor +@Table(name="answers") +public class Answer { + + @Id + @GeneratedValue(strategy=GenerationType.AUTO) + private long id; + + @NotNull + @NotEmpty + private String answer; + + @Column + @Convert(converter = ListToStringConverter.class) + private List images; + + @NotNull + @NotEmpty + private String postedBy; + + @NotNull + @NotEmpty + private String approvedBy; + + private boolean isApproved; + + public String getAnswer() { + return answer; + } + + public void setAnswer(String answer) { + this.answer = answer; + } + + public List getImages() { + return images; + } + + public void setImages(List images) { + this.images = images; + } + + public boolean getIsApproved() { + return isApproved; + } + + public void setIsApproved(boolean isApproved) { + this.isApproved = isApproved; + } + + public String getPostedBy() { + return postedBy; + } + + public void setPostedBy(String postedBy) { + this.postedBy = postedBy; + } + + public String getApprovedBy() { + return approvedBy; + } + + public void setApprovedBy(String approvedBy) { + this.approvedBy = approvedBy; + } + + public long getId() { + return id; + } + + public Answer(@NotNull @NotEmpty String answer, List images, @NotNull @NotEmpty String postedBy, + @NotNull @NotEmpty String approvedBy, boolean isApproved) { + super(); + this.answer = answer; + this.images = images; + this.postedBy = postedBy; + this.approvedBy = approvedBy; + this.isApproved = isApproved; + } + + public Answer() { + super(); + } + +} From a541f0c1c47a0a4168f3d30bf631d0c60ec6804c Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 01:29:20 +0530 Subject: [PATCH 015/464] Create Question.java --- .../wipro/cp/doconnect/entity/Question.java | 130 ++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Question.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Question.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Question.java new file mode 100644 index 0000000..9362107 --- /dev/null +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Question.java @@ -0,0 +1,130 @@ +package com.wipro.cp.doconnect.entity; + +import java.util.List; + +import javax.persistence.Column; +import javax.persistence.Convert; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.OneToMany; +import javax.persistence.Table; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +import com.wipro.cp.doconnect.util.ListToStringConverter; + +@Entity +@Table(name="questions") +public class Question { + + @Id + @GeneratedValue(strategy=GenerationType.AUTO) + private long id; + + @NotNull + @NotEmpty + private String question; + + @NotNull + @NotEmpty + private String topic; + + @Column + @Convert(converter = ListToStringConverter.class) + private List images; + + @NotNull + @NotEmpty + private String postedBy; + + @NotNull + @NotEmpty + private String approvedBy; + + private boolean isApproved; + + @OneToMany(orphanRemoval = true) + @JoinColumn(name="question_id") + private List answers; + + public String getQuestion() { + return question; + } + + public void setQuestion(String question) { + this.question = question; + } + + public String getTopic() { + return topic; + } + + public void setTopic(String topic) { + this.topic = topic; + } + + public List getImages() { + return images; + } + + public void setImages(List images) { + this.images = images; + } + + public String getPostedBy() { + return postedBy; + } + + public void setPostedBy(String postedBy) { + this.postedBy = postedBy; + } + + public String getApprovedBy() { + return approvedBy; + } + + public void setApprovedBy(String approvedBy) { + this.approvedBy = approvedBy; + } + + public boolean isApproved() { + return isApproved; + } + + public void setApproved(boolean isApproved) { + this.isApproved = isApproved; + } + + public List getAnswers() { + return answers; + } + + public void setAnswers(List answers) { + this.answers = answers; + } + + public long getId() { + return id; + } + + public Question(@NotNull @NotEmpty String question, @NotNull @NotEmpty String topic, List images, + @NotNull @NotEmpty String postedBy, @NotNull @NotEmpty String approvedBy, boolean isApproved, + List answers) { + super(); + this.question = question; + this.topic = topic; + this.images = images; + this.postedBy = postedBy; + this.approvedBy = approvedBy; + this.isApproved = isApproved; + this.answers = answers; + } + + public Question() { + super(); + } + +} From 788537567ffb85cbe5c4ca6b3caae88290ae4b02 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 01:29:22 +0530 Subject: [PATCH 016/464] Create User.java --- .../com/wipro/cp/doconnect/entity/User.java | 109 ++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/entity/User.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/User.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/User.java new file mode 100644 index 0000000..ba094eb --- /dev/null +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/User.java @@ -0,0 +1,109 @@ +package com.wipro.cp.doconnect.entity; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; +import javax.validation.constraints.Size; + +@Entity +@Table(name="users") +public class User { + + @Id + @GeneratedValue(strategy=GenerationType.AUTO) + private Long id; + + @NotNull + @NotEmpty + @Size(max = 512) + @Column(unique = true) + private String username; + + @NotNull + @NotEmpty + @Size(min = 8, max = 128) + private String password; + + @NotNull + @NotEmpty + @Size(max = 512) + private String name; + + @NotNull + @NotEmpty + @Pattern(regexp="[A-Za-z0-9._%-+]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}") + @Size(max = 512) + @Column(unique = true) + private String email; + + @NotNull + private boolean isAdmin; + + 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 String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public boolean getIsAdmin() { + return isAdmin; + } + + public void setIsAdmin(boolean isAdmin) { + this.isAdmin = isAdmin; + } + + public Long getId() { + return id; + } + + public User(@NotNull @NotEmpty @Size(max = 512) String username, + @NotNull @NotEmpty @Size(max = 512) String name, + @NotNull @NotEmpty @Size(min = 8, max = 128) String password, + @NotNull @NotEmpty @Pattern(regexp = "[A-Za-z0-9._%-+]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}") @Size(max = 512) String email, + @NotNull boolean isAdmin) { + super(); + this.username = username; + this.password = password; + this.name = name; + this.email = email; + this.isAdmin = isAdmin; + } + + public User() { + super(); + } + +} From 412192805250e954d1f8e578f69878366bf7db2e Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 01:29:25 +0530 Subject: [PATCH 017/464] Create AnswerRepository.java --- .../cp/doconnect/repository/AnswerRepository.java | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/repository/AnswerRepository.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/AnswerRepository.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/AnswerRepository.java new file mode 100644 index 0000000..e0eaabe --- /dev/null +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/AnswerRepository.java @@ -0,0 +1,11 @@ +package com.wipro.cp.doconnect.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import com.wipro.cp.doconnect.entity.Answer; + +@Repository +public interface AnswerRepository extends JpaRepository { + +} From 58545e9e44052ac52fc74ff668316c6d487d515d Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 01:29:28 +0530 Subject: [PATCH 018/464] Create QuestionRepository.java --- .../cp/doconnect/repository/QuestionRepository.java | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/repository/QuestionRepository.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/QuestionRepository.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/QuestionRepository.java new file mode 100644 index 0000000..05ea86e --- /dev/null +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/QuestionRepository.java @@ -0,0 +1,11 @@ +package com.wipro.cp.doconnect.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import com.wipro.cp.doconnect.entity.Question; + +@Repository +public interface QuestionRepository extends JpaRepository { + +} From d0f0e0370a9b0d3a5867ae202d79cf113d5974c1 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 01:29:30 +0530 Subject: [PATCH 019/464] Create UserRepository.java --- .../cp/doconnect/repository/UserRepository.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/repository/UserRepository.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/UserRepository.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/UserRepository.java new file mode 100644 index 0000000..329a370 --- /dev/null +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/UserRepository.java @@ -0,0 +1,17 @@ +package com.wipro.cp.doconnect.repository; + +import java.util.Optional; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import com.wipro.cp.doconnect.entity.User; + +@Repository +public interface UserRepository extends JpaRepository { + + Optional findByUsername(String username); + + boolean existsByUsername(String username); + +} From 6fb94ab8c73c321c74bdedbe3a0fa6b0148c231a Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 01:29:32 +0530 Subject: [PATCH 020/464] Create UserService.java --- .../cp/doconnect/service/UserService.java | 82 +++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/service/UserService.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/UserService.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/UserService.java new file mode 100644 index 0000000..fa778af --- /dev/null +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/UserService.java @@ -0,0 +1,82 @@ +package com.wipro.cp.doconnect.service; + +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; + +import com.wipro.cp.doconnect.dto.StatusDTO; +import com.wipro.cp.doconnect.dto.UserRegisterDTO; +import com.wipro.cp.doconnect.dto.UserResponseDTO; +import com.wipro.cp.doconnect.dto.UserUpdateDTO; +import com.wipro.cp.doconnect.entity.User; +import com.wipro.cp.doconnect.repository.UserRepository; + +@Service +public class UserService { + + @Autowired + private UserRepository userRepository; + + @Autowired + private PasswordEncoder bcryptEncoder; + + private UserResponseDTO convertUserToUserResponseDTO(User user) { + return new UserResponseDTO(user.getId(), user.getUsername(), user.getName(), user.getEmail(), user.getIsAdmin()); + } + + private StatusDTO convertOptionalUserToStatusDTOUserResponseDTO(Optional optionalUser, String statusMessage) { + if (optionalUser.isEmpty()) { + return new StatusDTO(statusMessage, false, null); + } + return new StatusDTO("", true, convertUserToUserResponseDTO(optionalUser.get())); + } + + public StatusDTO getUserByUsername(String username) { + return convertOptionalUserToStatusDTOUserResponseDTO(userRepository.findByUsername(username), "User with username " + username + " does not exist."); + } + + public StatusDTO createUser(UserRegisterDTO userRegisterDTO) { + if (userRepository.existsByUsername(userRegisterDTO.getUsername())) { + return new StatusDTO("User with username " + userRegisterDTO.getUsername() + " already exists. Please create user with different username.", false, null); + } + User user = new User(userRegisterDTO.getUsername(), userRegisterDTO.getName(), bcryptEncoder.encode(userRegisterDTO.getPassword()), userRegisterDTO.getEmail(), userRegisterDTO.getIsAdmin()); + return new StatusDTO("", true, convertUserToUserResponseDTO(userRepository.save(user))); + } + + public List getAllUsers() { + return userRepository.findAll().stream().map(user -> convertUserToUserResponseDTO(user)).collect(Collectors.toList()); + } + + public StatusDTO getUserById(Long id) { + return convertOptionalUserToStatusDTOUserResponseDTO(userRepository.findById(id), "User with ID " + id + " does not exist."); + } + + public StatusDTO updateUser(UserUpdateDTO userUpdateDTO, Long id) { + Optional optionalUser = userRepository.findById(id); + if (optionalUser.isEmpty()) { + return new StatusDTO("User with ID " + id + " does not exist.", false, null); + } + User user = optionalUser.get(); + user.setIsAdmin(userUpdateDTO.getIsAdmin()); + user.setName(userUpdateDTO.getName()); + return new StatusDTO("", true, convertUserToUserResponseDTO(userRepository.save(user))); + } + + public boolean deleteUserById(Long id) { + Optional optionalUser = userRepository.findById(id); + if (optionalUser.isEmpty()) { + return false; + } + userRepository.deleteById(id); + return true; + } + + public void deleteAllUsers() { + userRepository.deleteAllInBatch(); + } + +} From ba124aff4ffb53b35c9346c7441e1037b0b0f6f0 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 01:29:34 +0530 Subject: [PATCH 021/464] Create ListToStringConverter.java --- .../doconnect/util/ListToStringConverter.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/util/ListToStringConverter.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/util/ListToStringConverter.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/util/ListToStringConverter.java new file mode 100644 index 0000000..6cae220 --- /dev/null +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/util/ListToStringConverter.java @@ -0,0 +1,19 @@ +package com.wipro.cp.doconnect.util; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import javax.persistence.AttributeConverter; + +public class ListToStringConverter implements AttributeConverter, String> { + @Override + public String convertToDatabaseColumn(List attribute) { + return attribute == null ? null : String.join(",",attribute); + } + + @Override + public List convertToEntityAttribute(String dbData) { + return dbData == null ? Collections.emptyList() : Arrays.asList(dbData.split(",")); + } +} From a6fc75b229b88fced0df2766400c91ff7e9c0714 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 01:29:38 +0530 Subject: [PATCH 022/464] Create application.properties --- DoConnect/src/main/resources/application.properties | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 DoConnect/src/main/resources/application.properties diff --git a/DoConnect/src/main/resources/application.properties b/DoConnect/src/main/resources/application.properties new file mode 100644 index 0000000..2d280fe --- /dev/null +++ b/DoConnect/src/main/resources/application.properties @@ -0,0 +1,12 @@ +server.port=9090 + +spring.datasource.url=jdbc:mysql://localhost:3306/do_connect?createDatabaseIfNotExist=true&useSSL=false +spring.datasource.username=root +spring.datasource.password=Password@12345 +spring.jpa.hibernate.ddl-auto=update +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect +spring.jpa.open-in-view=false + +jwt.secret=devashishpathrabe + +spring.main.allow-circular-references=true From 305ba3637f060f784b59a20d5276d800a99cd986 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 01:29:40 +0530 Subject: [PATCH 023/464] Create DoConnectApplicationTests.java --- .../cp/doconnect/DoConnectApplicationTests.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 DoConnect/src/test/java/com/wipro/cp/doconnect/DoConnectApplicationTests.java diff --git a/DoConnect/src/test/java/com/wipro/cp/doconnect/DoConnectApplicationTests.java b/DoConnect/src/test/java/com/wipro/cp/doconnect/DoConnectApplicationTests.java new file mode 100644 index 0000000..df78148 --- /dev/null +++ b/DoConnect/src/test/java/com/wipro/cp/doconnect/DoConnectApplicationTests.java @@ -0,0 +1,13 @@ +package com.wipro.cp.doconnect; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class DoConnectApplicationTests { + + @Test + void contextLoads() { + } + +} From 5dcce07a79ccf52e08c983fcbb17245b5b42e531 Mon Sep 17 00:00:00 2001 From: ravi0818 Date: Wed, 24 Aug 2022 10:59:46 +0530 Subject: [PATCH 024/464] initial commit with structure --- .gitignore | 42 ++++++++++++++++++++++++++++++++++++++++++ do_connect_frontend | 1 + 2 files changed, 43 insertions(+) create mode 100644 .gitignore create mode 160000 do_connect_frontend diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fc6db14 --- /dev/null +++ b/.gitignore @@ -0,0 +1,42 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# Compiled output +/do_connect_frontend/dist +/do_connect_frontend/tmp +/do_connect_frontend/out-tsc +/do_connect_frontend/bazel-out + +# Node +/do_connect_frontend/node_modules +npm-debug.log +yarn-error.log + +# IDEs and editors +.idea/ +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# Visual Studio Code +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +.history/* + +# Miscellaneous +/do_connect_frontend/.angular/cache +.sass-cache/ +/do_connect_frontend/connect.lock +/do_connect_frontend/coverage +/do_connect_frontend/libpeerconnection.log +testem.log +/do_connect_frontend/typings + +# System files +.DS_Store +Thumbs.db diff --git a/do_connect_frontend b/do_connect_frontend new file mode 160000 index 0000000..48e56dd --- /dev/null +++ b/do_connect_frontend @@ -0,0 +1 @@ +Subproject commit 48e56ddd875c4155d1bca297cc7139ef2b3fe0ad From fc1f5648b83381cccf5101007bed44c5084e460c Mon Sep 17 00:00:00 2001 From: ravi0818 Date: Wed, 24 Aug 2022 11:05:09 +0530 Subject: [PATCH 025/464] git repo fixed --- do_connect_frontend | 1 - 1 file changed, 1 deletion(-) delete mode 160000 do_connect_frontend diff --git a/do_connect_frontend b/do_connect_frontend deleted file mode 160000 index 48e56dd..0000000 --- a/do_connect_frontend +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 48e56ddd875c4155d1bca297cc7139ef2b3fe0ad From 5e21f66af24c13e0957c4dd1f7fa7bf6bef8bac9 Mon Sep 17 00:00:00 2001 From: ravi0818 Date: Wed, 24 Aug 2022 11:09:24 +0530 Subject: [PATCH 026/464] structure updated --- do_connect_frontend/.browserslistrc | 16 + do_connect_frontend/.editorconfig | 16 + do_connect_frontend/.gitignore | 42 + do_connect_frontend/.vscode/extensions.json | 4 + do_connect_frontend/.vscode/launch.json | 20 + do_connect_frontend/.vscode/tasks.json | 42 + do_connect_frontend/README.md | 27 + do_connect_frontend/angular.json | 95 + do_connect_frontend/db.json | 10 + do_connect_frontend/karma.conf.js | 44 + do_connect_frontend/package-lock.json | 20971 ++++++++++++++++ do_connect_frontend/package.json | 41 + .../src/app/app-routing.module.ts | 21 + do_connect_frontend/src/app/app.component.css | 0 .../src/app/app.component.html | 20 + .../src/app/app.component.spec.ts | 35 + do_connect_frontend/src/app/app.component.ts | 10 + do_connect_frontend/src/app/app.module.ts | 38 + .../src/app/dashboard/dashboard.component.css | 15 + .../app/dashboard/dashboard.component.html | 85 + .../app/dashboard/dashboard.component.spec.ts | 23 + .../src/app/dashboard/dashboard.component.ts | 30 + .../src/app/footer/footer.component.css | 3 + .../src/app/footer/footer.component.html | 29 + .../src/app/footer/footer.component.spec.ts | 23 + .../src/app/footer/footer.component.ts | 15 + .../src/app/home/home.component.css | 15 + .../src/app/home/home.component.html | 16 + .../src/app/home/home.component.spec.ts | 23 + .../src/app/home/home.component.ts | 39 + .../src/app/login/login.component.css | 16 + .../src/app/login/login.component.html | 52 + .../src/app/login/login.component.spec.ts | 23 + .../src/app/login/login.component.ts | 35 + .../src/app/navbar/navbar.component.css | 3 + .../src/app/navbar/navbar.component.html | 36 + .../src/app/navbar/navbar.component.spec.ts | 23 + .../src/app/navbar/navbar.component.ts | 13 + .../page-not-found.component.css | 0 .../page-not-found.component.html | 3 + .../page-not-found.component.spec.ts | 23 + .../page-not-found.component.ts | 15 + .../src/app/register/register.component.css | 17 + .../src/app/register/register.component.html | 50 + .../app/register/register.component.spec.ts | 23 + .../src/app/register/register.component.ts | 35 + .../src/app/service/user.service.spec.ts | 16 + .../src/app/service/user.service.ts | 53 + do_connect_frontend/src/assets/.gitkeep | 0 .../src/environments/environment.prod.ts | 3 + .../src/environments/environment.ts | 16 + do_connect_frontend/src/favicon.ico | Bin 0 -> 948 bytes do_connect_frontend/src/index.html | 13 + do_connect_frontend/src/main.ts | 12 + do_connect_frontend/src/polyfills.ts | 53 + do_connect_frontend/src/styles.css | 1 + do_connect_frontend/src/test.ts | 26 + do_connect_frontend/tsconfig.app.json | 15 + do_connect_frontend/tsconfig.json | 32 + do_connect_frontend/tsconfig.spec.json | 18 + 60 files changed, 22393 insertions(+) create mode 100644 do_connect_frontend/.browserslistrc create mode 100644 do_connect_frontend/.editorconfig create mode 100644 do_connect_frontend/.gitignore create mode 100644 do_connect_frontend/.vscode/extensions.json create mode 100644 do_connect_frontend/.vscode/launch.json create mode 100644 do_connect_frontend/.vscode/tasks.json create mode 100644 do_connect_frontend/README.md create mode 100644 do_connect_frontend/angular.json create mode 100644 do_connect_frontend/db.json create mode 100644 do_connect_frontend/karma.conf.js create mode 100644 do_connect_frontend/package-lock.json create mode 100644 do_connect_frontend/package.json create mode 100644 do_connect_frontend/src/app/app-routing.module.ts create mode 100644 do_connect_frontend/src/app/app.component.css create mode 100644 do_connect_frontend/src/app/app.component.html create mode 100644 do_connect_frontend/src/app/app.component.spec.ts create mode 100644 do_connect_frontend/src/app/app.component.ts create mode 100644 do_connect_frontend/src/app/app.module.ts create mode 100644 do_connect_frontend/src/app/dashboard/dashboard.component.css create mode 100644 do_connect_frontend/src/app/dashboard/dashboard.component.html create mode 100644 do_connect_frontend/src/app/dashboard/dashboard.component.spec.ts create mode 100644 do_connect_frontend/src/app/dashboard/dashboard.component.ts create mode 100644 do_connect_frontend/src/app/footer/footer.component.css create mode 100644 do_connect_frontend/src/app/footer/footer.component.html create mode 100644 do_connect_frontend/src/app/footer/footer.component.spec.ts create mode 100644 do_connect_frontend/src/app/footer/footer.component.ts create mode 100644 do_connect_frontend/src/app/home/home.component.css create mode 100644 do_connect_frontend/src/app/home/home.component.html create mode 100644 do_connect_frontend/src/app/home/home.component.spec.ts create mode 100644 do_connect_frontend/src/app/home/home.component.ts create mode 100644 do_connect_frontend/src/app/login/login.component.css create mode 100644 do_connect_frontend/src/app/login/login.component.html create mode 100644 do_connect_frontend/src/app/login/login.component.spec.ts create mode 100644 do_connect_frontend/src/app/login/login.component.ts create mode 100644 do_connect_frontend/src/app/navbar/navbar.component.css create mode 100644 do_connect_frontend/src/app/navbar/navbar.component.html create mode 100644 do_connect_frontend/src/app/navbar/navbar.component.spec.ts create mode 100644 do_connect_frontend/src/app/navbar/navbar.component.ts create mode 100644 do_connect_frontend/src/app/page-not-found/page-not-found.component.css create mode 100644 do_connect_frontend/src/app/page-not-found/page-not-found.component.html create mode 100644 do_connect_frontend/src/app/page-not-found/page-not-found.component.spec.ts create mode 100644 do_connect_frontend/src/app/page-not-found/page-not-found.component.ts create mode 100644 do_connect_frontend/src/app/register/register.component.css create mode 100644 do_connect_frontend/src/app/register/register.component.html create mode 100644 do_connect_frontend/src/app/register/register.component.spec.ts create mode 100644 do_connect_frontend/src/app/register/register.component.ts create mode 100644 do_connect_frontend/src/app/service/user.service.spec.ts create mode 100644 do_connect_frontend/src/app/service/user.service.ts create mode 100644 do_connect_frontend/src/assets/.gitkeep create mode 100644 do_connect_frontend/src/environments/environment.prod.ts create mode 100644 do_connect_frontend/src/environments/environment.ts create mode 100644 do_connect_frontend/src/favicon.ico create mode 100644 do_connect_frontend/src/index.html create mode 100644 do_connect_frontend/src/main.ts create mode 100644 do_connect_frontend/src/polyfills.ts create mode 100644 do_connect_frontend/src/styles.css create mode 100644 do_connect_frontend/src/test.ts create mode 100644 do_connect_frontend/tsconfig.app.json create mode 100644 do_connect_frontend/tsconfig.json create mode 100644 do_connect_frontend/tsconfig.spec.json diff --git a/do_connect_frontend/.browserslistrc b/do_connect_frontend/.browserslistrc new file mode 100644 index 0000000..4f9ac26 --- /dev/null +++ b/do_connect_frontend/.browserslistrc @@ -0,0 +1,16 @@ +# 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 diff --git a/do_connect_frontend/.editorconfig b/do_connect_frontend/.editorconfig new file mode 100644 index 0000000..59d9a3a --- /dev/null +++ b/do_connect_frontend/.editorconfig @@ -0,0 +1,16 @@ +# Editor configuration, see https://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.ts] +quote_type = single + +[*.md] +max_line_length = off +trim_trailing_whitespace = false diff --git a/do_connect_frontend/.gitignore b/do_connect_frontend/.gitignore new file mode 100644 index 0000000..0711527 --- /dev/null +++ b/do_connect_frontend/.gitignore @@ -0,0 +1,42 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# Compiled output +/dist +/tmp +/out-tsc +/bazel-out + +# Node +/node_modules +npm-debug.log +yarn-error.log + +# IDEs and editors +.idea/ +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# Visual Studio Code +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +.history/* + +# Miscellaneous +/.angular/cache +.sass-cache/ +/connect.lock +/coverage +/libpeerconnection.log +testem.log +/typings + +# System files +.DS_Store +Thumbs.db diff --git a/do_connect_frontend/.vscode/extensions.json b/do_connect_frontend/.vscode/extensions.json new file mode 100644 index 0000000..77b3745 --- /dev/null +++ b/do_connect_frontend/.vscode/extensions.json @@ -0,0 +1,4 @@ +{ + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=827846 + "recommendations": ["angular.ng-template"] +} diff --git a/do_connect_frontend/.vscode/launch.json b/do_connect_frontend/.vscode/launch.json new file mode 100644 index 0000000..740e35a --- /dev/null +++ b/do_connect_frontend/.vscode/launch.json @@ -0,0 +1,20 @@ +{ + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "ng serve", + "type": "pwa-chrome", + "request": "launch", + "preLaunchTask": "npm: start", + "url": "http://localhost:4200/" + }, + { + "name": "ng test", + "type": "chrome", + "request": "launch", + "preLaunchTask": "npm: test", + "url": "http://localhost:9876/debug.html" + } + ] +} diff --git a/do_connect_frontend/.vscode/tasks.json b/do_connect_frontend/.vscode/tasks.json new file mode 100644 index 0000000..a298b5b --- /dev/null +++ b/do_connect_frontend/.vscode/tasks.json @@ -0,0 +1,42 @@ +{ + // For more information, visit: https://go.microsoft.com/fwlink/?LinkId=733558 + "version": "2.0.0", + "tasks": [ + { + "type": "npm", + "script": "start", + "isBackground": true, + "problemMatcher": { + "owner": "typescript", + "pattern": "$tsc", + "background": { + "activeOnStart": true, + "beginsPattern": { + "regexp": "(.*?)" + }, + "endsPattern": { + "regexp": "bundle generation complete" + } + } + } + }, + { + "type": "npm", + "script": "test", + "isBackground": true, + "problemMatcher": { + "owner": "typescript", + "pattern": "$tsc", + "background": { + "activeOnStart": true, + "beginsPattern": { + "regexp": "(.*?)" + }, + "endsPattern": { + "regexp": "bundle generation complete" + } + } + } + } + ] +} diff --git a/do_connect_frontend/README.md b/do_connect_frontend/README.md new file mode 100644 index 0000000..843f334 --- /dev/null +++ b/do_connect_frontend/README.md @@ -0,0 +1,27 @@ +# AngularProject + +This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 14.0.4. + +## Development server + +Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The application will automatically reload if you change any of the source files. + +## Code scaffolding + +Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`. + +## Build + +Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. + +## Running unit tests + +Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). + +## Running end-to-end tests + +Run `ng e2e` to execute the end-to-end tests via a platform of your choice. To use this command, you need to first add a package that implements end-to-end testing capabilities. + +## Further help + +To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page. diff --git a/do_connect_frontend/angular.json b/do_connect_frontend/angular.json new file mode 100644 index 0000000..aab6ce6 --- /dev/null +++ b/do_connect_frontend/angular.json @@ -0,0 +1,95 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "angular-project": { + "projectType": "application", + "schematics": {}, + "root": "", + "sourceRoot": "src", + "prefix": "app", + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:browser", + "options": { + "outputPath": "dist/angular-project", + "index": "src/index.html", + "main": "src/main.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "tsconfig.app.json", + "assets": ["src/favicon.ico", "src/assets"], + "styles": [ + "node_modules/bootstrap/dist/css/bootstrap.min.css", + "node_modules/font-awesome/css/font-awesome.css", + "src/styles.css" + ], + "scripts": ["node_modules/bootstrap/dist/js/bootstrap.min.js"] + }, + "configurations": { + "production": { + "budgets": [ + { + "type": "initial", + "maximumWarning": "500kb", + "maximumError": "1mb" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "2kb", + "maximumError": "4kb" + } + ], + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.prod.ts" + } + ], + "outputHashing": "all" + }, + "development": { + "buildOptimizer": false, + "optimization": false, + "vendorChunk": true, + "extractLicenses": false, + "sourceMap": true, + "namedChunks": true + } + }, + "defaultConfiguration": "production" + }, + "serve": { + "builder": "@angular-devkit/build-angular:dev-server", + "configurations": { + "production": { + "browserTarget": "angular-project:build:production" + }, + "development": { + "browserTarget": "angular-project:build:development" + } + }, + "defaultConfiguration": "development" + }, + "extract-i18n": { + "builder": "@angular-devkit/build-angular:extract-i18n", + "options": { + "browserTarget": "angular-project:build" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "src/test.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "tsconfig.spec.json", + "karmaConfig": "karma.conf.js", + "assets": ["src/favicon.ico", "src/assets"], + "styles": ["src/styles.css"], + "scripts": [] + } + } + } + } + } +} diff --git a/do_connect_frontend/db.json b/do_connect_frontend/db.json new file mode 100644 index 0000000..253a8ad --- /dev/null +++ b/do_connect_frontend/db.json @@ -0,0 +1,10 @@ +{ + "users": [ + { + "name": "Ravi Kant Prasad", + "email": "rkprasad0818@gmail.com", + "password": "admin", + "id": 1 + } + ] +} \ No newline at end of file diff --git a/do_connect_frontend/karma.conf.js b/do_connect_frontend/karma.conf.js new file mode 100644 index 0000000..922c8d0 --- /dev/null +++ b/do_connect_frontend/karma.conf.js @@ -0,0 +1,44 @@ +// Karma configuration file, see link for more information +// https://karma-runner.github.io/1.0/config/configuration-file.html + +module.exports = function (config) { + config.set({ + basePath: '', + frameworks: ['jasmine', '@angular-devkit/build-angular'], + plugins: [ + require('karma-jasmine'), + require('karma-chrome-launcher'), + require('karma-jasmine-html-reporter'), + require('karma-coverage'), + require('@angular-devkit/build-angular/plugins/karma') + ], + client: { + jasmine: { + // you can add configuration options for Jasmine here + // the possible options are listed at https://jasmine.github.io/api/edge/Configuration.html + // for example, you can disable the random execution with `random: false` + // or set a specific seed with `seed: 4321` + }, + clearContext: false // leave Jasmine Spec Runner output visible in browser + }, + jasmineHtmlReporter: { + suppressAll: true // removes the duplicated traces + }, + coverageReporter: { + dir: require('path').join(__dirname, './coverage/angular-project'), + subdir: '.', + reporters: [ + { type: 'html' }, + { type: 'text-summary' } + ] + }, + reporters: ['progress', 'kjhtml'], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['Chrome'], + singleRun: false, + restartOnFileChange: true + }); +}; diff --git a/do_connect_frontend/package-lock.json b/do_connect_frontend/package-lock.json new file mode 100644 index 0000000..9f57754 --- /dev/null +++ b/do_connect_frontend/package-lock.json @@ -0,0 +1,20971 @@ +{ + "name": "angular-project", + "version": "0.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "angular-project", + "version": "0.0.0", + "dependencies": { + "@angular/animations": "^14.0.0", + "@angular/common": "^14.0.0", + "@angular/compiler": "^14.0.0", + "@angular/core": "^14.0.0", + "@angular/forms": "^14.0.0", + "@angular/platform-browser": "^14.0.0", + "@angular/platform-browser-dynamic": "^14.0.0", + "@angular/router": "^14.0.0", + "@kolkov/angular-editor": "^3.0.0-beta.0", + "angular-font-awesome": "^3.1.2", + "bootstrap": "^5.1.3", + "rxjs": "~7.5.0", + "tslib": "^2.3.0", + "zone.js": "~0.11.4" + }, + "devDependencies": { + "@angular-devkit/build-angular": "^14.0.4", + "@angular/cli": "~14.0.4", + "@angular/compiler-cli": "^14.0.0", + "@types/jasmine": "~4.0.0", + "jasmine-core": "~4.1.0", + "karma": "~6.3.0", + "karma-chrome-launcher": "~3.1.0", + "karma-coverage": "~2.2.0", + "karma-jasmine": "~5.0.0", + "karma-jasmine-html-reporter": "~1.7.0", + "typescript": "~4.7.2" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@angular-devkit/architect": { + "version": "0.1400.6", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1400.6.tgz", + "integrity": "sha512-POqWsCvo5O4/5dsPYGA68YU9x5k/xAU+a5h/QvhjeRJVCuYZ0IX97EPQ+w/tXRRL3kdwS6zfaIXR2p+U3F1DmA==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "14.0.6", + "rxjs": "6.6.7" + }, + "engines": { + "node": "^14.15.0 || >=16.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/architect/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/@angular-devkit/architect/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/@angular-devkit/build-angular": { + "version": "14.0.6", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-14.0.6.tgz", + "integrity": "sha512-xwLG37ta5qV1NrqdAFGa6t8lrNuoO1WYYEJ4LcHqid7sXlN4cpV88CzNoWn8ElDdEZwcjPOW81mPRLY663iudQ==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "2.2.0", + "@angular-devkit/architect": "0.1400.6", + "@angular-devkit/build-webpack": "0.1400.6", + "@angular-devkit/core": "14.0.6", + "@babel/core": "7.17.10", + "@babel/generator": "7.17.10", + "@babel/helper-annotate-as-pure": "7.16.7", + "@babel/plugin-proposal-async-generator-functions": "7.16.8", + "@babel/plugin-transform-async-to-generator": "7.16.8", + "@babel/plugin-transform-runtime": "7.17.10", + "@babel/preset-env": "7.17.10", + "@babel/runtime": "7.17.9", + "@babel/template": "7.16.7", + "@discoveryjs/json-ext": "0.5.7", + "@ngtools/webpack": "14.0.6", + "ansi-colors": "4.1.1", + "babel-loader": "8.2.5", + "babel-plugin-istanbul": "6.1.1", + "browserslist": "^4.9.1", + "cacache": "16.0.7", + "copy-webpack-plugin": "10.2.4", + "critters": "0.0.16", + "css-loader": "6.7.1", + "esbuild-wasm": "0.14.38", + "glob": "8.0.1", + "https-proxy-agent": "5.0.1", + "inquirer": "8.2.4", + "jsonc-parser": "3.0.0", + "karma-source-map-support": "1.4.0", + "less": "4.1.2", + "less-loader": "10.2.0", + "license-webpack-plugin": "4.0.2", + "loader-utils": "3.2.0", + "mini-css-extract-plugin": "2.6.0", + "minimatch": "5.0.1", + "open": "8.4.0", + "ora": "5.4.1", + "parse5-html-rewriting-stream": "6.0.1", + "piscina": "3.2.0", + "postcss": "8.4.13", + "postcss-import": "14.1.0", + "postcss-loader": "6.2.1", + "postcss-preset-env": "7.5.0", + "regenerator-runtime": "0.13.9", + "resolve-url-loader": "5.0.0", + "rxjs": "6.6.7", + "sass": "1.51.0", + "sass-loader": "12.6.0", + "semver": "7.3.7", + "source-map-loader": "3.0.1", + "source-map-support": "0.5.21", + "stylus": "0.57.0", + "stylus-loader": "6.2.0", + "terser": "5.13.1", + "text-table": "0.2.0", + "tree-kill": "1.2.2", + "tslib": "2.4.0", + "webpack": "5.72.1", + "webpack-dev-middleware": "5.3.1", + "webpack-dev-server": "4.9.0", + "webpack-merge": "5.8.0", + "webpack-subresource-integrity": "5.1.0" + }, + "engines": { + "node": "^14.15.0 || >=16.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "optionalDependencies": { + "esbuild": "0.14.38" + }, + "peerDependencies": { + "@angular/compiler-cli": "^14.0.0", + "@angular/localize": "^14.0.0", + "@angular/service-worker": "^14.0.0", + "karma": "^6.3.0", + "ng-packagr": "^14.0.0", + "protractor": "^7.0.0", + "tailwindcss": "^2.0.0 || ^3.0.0", + "typescript": ">=4.6.2 <4.8" + }, + "peerDependenciesMeta": { + "@angular/localize": { + "optional": true + }, + "@angular/service-worker": { + "optional": true + }, + "karma": { + "optional": true + }, + "ng-packagr": { + "optional": true + }, + "protractor": { + "optional": true + }, + "tailwindcss": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/@angular-devkit/build-angular/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==", + "dev": true + }, + "node_modules/@angular-devkit/build-webpack": { + "version": "0.1400.6", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1400.6.tgz", + "integrity": "sha512-3Zg+jST6a2Xj8s4IQ7XIH31Pv6/0XbKCbGC0W31fPRAxTKIeLfEJYkDXwnhpEY5ctYq3PR1/IXjZNlGoz0AhvQ==", + "dev": true, + "dependencies": { + "@angular-devkit/architect": "0.1400.6", + "rxjs": "6.6.7" + }, + "engines": { + "node": "^14.15.0 || >=16.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "webpack": "^5.30.0", + "webpack-dev-server": "^4.0.0" + } + }, + "node_modules/@angular-devkit/build-webpack/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/@angular-devkit/build-webpack/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/@angular-devkit/core": { + "version": "14.0.6", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-14.0.6.tgz", + "integrity": "sha512-b0U4D5jxAsx26F4YQu7XW+lpxLZT4ssdyMarbfIryeupznnGE+69F+U/G+FhTEMYbxrYRMGn/wYy6vcg57NYfQ==", + "dev": true, + "dependencies": { + "ajv": "8.11.0", + "ajv-formats": "2.1.1", + "jsonc-parser": "3.0.0", + "rxjs": "6.6.7", + "source-map": "0.7.3" + }, + "engines": { + "node": "^14.15.0 || >=16.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/core/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/@angular-devkit/core/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/@angular-devkit/schematics": { + "version": "14.0.6", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-14.0.6.tgz", + "integrity": "sha512-o7I5KBnz/fxYgVLZ+XIsaGZUDiQCqM89aaIPOg84Ij0Nr3N+f4NYq56PPRln7hAfV3m/3JpH+cgycaGND5wHHQ==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "14.0.6", + "jsonc-parser": "3.0.0", + "magic-string": "0.26.1", + "ora": "5.4.1", + "rxjs": "6.6.7" + }, + "engines": { + "node": "^14.15.0 || >=16.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/@angular-devkit/schematics/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/@angular/animations": { + "version": "14.0.6", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-14.0.6.tgz", + "integrity": "sha512-l363hFgj5Dxw6WKZkJRd77izOznCqJVrWhxfO9ERG0ShVUb/3WB9RSOUCVltDrTY5sFK+cw+slQYGH6AXgvMVQ==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^14.15.0 || >=16.10.0" + }, + "peerDependencies": { + "@angular/core": "14.0.6" + } + }, + "node_modules/@angular/cli": { + "version": "14.0.6", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-14.0.6.tgz", + "integrity": "sha512-q8iByoyVNLUOCosc5/wD9FkaM09d5HOic5RYSAg265pMgreQ/oQM1ajGRzzVWFhzw/RlUuon8ezZyAUAXfszCQ==", + "dev": true, + "dependencies": { + "@angular-devkit/architect": "0.1400.6", + "@angular-devkit/core": "14.0.6", + "@angular-devkit/schematics": "14.0.6", + "@schematics/angular": "14.0.6", + "@yarnpkg/lockfile": "1.1.0", + "ansi-colors": "4.1.1", + "debug": "4.3.4", + "ini": "3.0.0", + "inquirer": "8.2.4", + "jsonc-parser": "3.0.0", + "npm-package-arg": "9.0.2", + "npm-pick-manifest": "7.0.1", + "open": "8.4.0", + "ora": "5.4.1", + "pacote": "13.3.0", + "resolve": "1.22.0", + "semver": "7.3.7", + "symbol-observable": "4.0.0", + "uuid": "8.3.2", + "yargs": "17.4.1" + }, + "bin": { + "ng": "bin/ng.js" + }, + "engines": { + "node": "^14.15.0 || >=16.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/common": { + "version": "14.0.6", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-14.0.6.tgz", + "integrity": "sha512-AynjE7OOEfrdKmS3nu00tkf4g66cx97T6qhfaTvc3hKi45MreBcJkIMcSowF24peygvUN41htMJuq3WQLu92iQ==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^14.15.0 || >=16.10.0" + }, + "peerDependencies": { + "@angular/core": "14.0.6", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/compiler": { + "version": "14.0.6", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-14.0.6.tgz", + "integrity": "sha512-zYq3+Pg6m7NKivqEk+vNy+5ic5A+B0ReqIECjs10pVeXoWBxjvZAqG2ksrCQ0axtju2hA3lrFsDthLShWBEf4g==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^14.15.0 || >=16.10.0" + }, + "peerDependencies": { + "@angular/core": "14.0.6" + }, + "peerDependenciesMeta": { + "@angular/core": { + "optional": true + } + } + }, + "node_modules/@angular/compiler-cli": { + "version": "14.0.6", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-14.0.6.tgz", + "integrity": "sha512-w1ccZEzbRRqzMNaty0P4QliSslmR+9pBhDpKNfI+PsRqjJOnyC9tFdtZQLjcbnaM8W0yJLnCfZQ7KKXjnjzawg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.17.2", + "chokidar": "^3.0.0", + "convert-source-map": "^1.5.1", + "dependency-graph": "^0.11.0", + "magic-string": "^0.26.0", + "reflect-metadata": "^0.1.2", + "semver": "^7.0.0", + "sourcemap-codec": "^1.4.8", + "tslib": "^2.3.0", + "yargs": "^17.2.1" + }, + "bin": { + "ng-xi18n": "bundles/src/bin/ng_xi18n.js", + "ngc": "bundles/src/bin/ngc.js", + "ngcc": "bundles/ngcc/main-ngcc.js" + }, + "engines": { + "node": "^14.15.0 || >=16.10.0" + }, + "peerDependencies": { + "@angular/compiler": "14.0.6", + "typescript": ">=4.6.2 <4.8" + } + }, + "node_modules/@angular/core": { + "version": "14.0.6", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-14.0.6.tgz", + "integrity": "sha512-hyQ3s9Yrm3ejhumgAC9ENhMFmvmPlJkk1tEOjruyoiHwK4EOaDpI+GCNQIBUB1Z3B/QLMlgZeMXrULQztjSQwg==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^14.15.0 || >=16.10.0" + }, + "peerDependencies": { + "rxjs": "^6.5.3 || ^7.4.0", + "zone.js": "~0.11.4" + } + }, + "node_modules/@angular/forms": { + "version": "14.0.6", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-14.0.6.tgz", + "integrity": "sha512-ITa3A6pWecDgDjBTlwQnJnSOc1o35bIvRpTclLx/ysDbn4FB2tPy4iseCSrOlgdJHZjBcHBIxX27yYjWyBfIwQ==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^14.15.0 || >=16.10.0" + }, + "peerDependencies": { + "@angular/common": "14.0.6", + "@angular/core": "14.0.6", + "@angular/platform-browser": "14.0.6", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/platform-browser": { + "version": "14.0.6", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-14.0.6.tgz", + "integrity": "sha512-d9PS2E5HSgiKzItHzVdxdBoMeaOvlDo6ccSEXLYCGyJ9MykDjKvJPWy6GicilBPa8g4VGJpk9J+lbgXXAOkCFA==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^14.15.0 || >=16.10.0" + }, + "peerDependencies": { + "@angular/animations": "14.0.6", + "@angular/common": "14.0.6", + "@angular/core": "14.0.6" + }, + "peerDependenciesMeta": { + "@angular/animations": { + "optional": true + } + } + }, + "node_modules/@angular/platform-browser-dynamic": { + "version": "14.0.6", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-14.0.6.tgz", + "integrity": "sha512-iYWmzUDWO+qc7wN1ED3dIkvDjIBdSqh/gpFvLGyCUZBwzwZ45sJOT/YgCmLBzBsVV/2GhAhV0QL4ioVQ5Jy3UA==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^14.15.0 || >=16.10.0" + }, + "peerDependencies": { + "@angular/common": "14.0.6", + "@angular/compiler": "14.0.6", + "@angular/core": "14.0.6", + "@angular/platform-browser": "14.0.6" + } + }, + "node_modules/@angular/router": { + "version": "14.0.6", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-14.0.6.tgz", + "integrity": "sha512-FFLnaBuOASqUCbr8QIBX8Y+PbSSVrN6YFVI82bQDr2fesI+5UdLTfiEBUMizwnQ4choEtSd8542DjiEW8Rc+lA==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^14.15.0 || >=16.10.0" + }, + "peerDependencies": { + "@angular/common": "14.0.6", + "@angular/core": "14.0.6", + "@angular/platform-browser": "14.0.6", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@assemblyscript/loader": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz", + "integrity": "sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==", + "dev": true + }, + "node_modules/@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz", + "integrity": "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.17.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.10.tgz", + "integrity": "sha512-liKoppandF3ZcBnIYFjfSDHZLKdLHGJRkoWtG8zQyGJBQfIYobpnVGI5+pLBNtS6psFLDzyq8+h5HiVljW9PNA==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.10", + "@babel/helper-compilation-targets": "^7.17.10", + "@babel/helper-module-transforms": "^7.17.7", + "@babel/helpers": "^7.17.9", + "@babel/parser": "^7.17.10", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.10", + "@babel/types": "^7.17.10", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.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/generator": { + "version": "7.17.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.10.tgz", + "integrity": "sha512-46MJZZo9y3o4kmhBVc7zW7i8dtR1oIK/sdO5NcfcZRhTGYi+KKJRtHNgsU6c4VUcJmUNV/LQdebD/9Dlv4K+Tg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.17.10", + "@jridgewell/gen-mapping": "^0.1.0", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", + "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", + "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", + "dev": true, + "dependencies": { + "@babel/helper-explode-assignable-expression": "^7.18.6", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", + "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.18.8", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.20.2", + "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.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.9.tgz", + "integrity": "sha512-WvypNAYaVh23QcjpMR24CwZY2Nz6hqdOcFdPbNpV56hL5H6KiFheO7Xm1aPdlLQ7d5emYZX7VZwPp9x3z+2opw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-split-export-declaration": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz", + "integrity": "sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "regexpu-core": "^5.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", + "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", + "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-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-explode-assignable-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", + "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", + "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", + "dev": true, + "dependencies": { + "@babel/template": "^7.18.6", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name/node_modules/@babel/template": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", + "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.6", + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", + "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", + "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.18.6", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms/node_modules/@babel/template": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", + "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.6", + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", + "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz", + "integrity": "sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", + "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-wrap-function": "^7.18.9", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.9.tgz", + "integrity": "sha512-dNsWibVI4lNT6HiuOIBr1oyxo40HvIVmbwPUm3XZ7wMh4k2WxrxTqZwSqw/eEmXDS9np0ey5M2bz9tBmO9c+YQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", + "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz", + "integrity": "sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", + "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.9.tgz", + "integrity": "sha512-cG2ru3TRAL6a60tfQflpEfs4ldiPwF6YW3zfJiRgmoFVIaC1vGnBBgatfec+ZUziPHkHSaXAuEck3Cdkf3eRpQ==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.18.9", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function/node_modules/@babel/template": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", + "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.6", + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz", + "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers/node_modules/@babel/template": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", + "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.6", + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.9.tgz", + "integrity": "sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", + "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz", + "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", + "@babel/plugin-proposal-optional-chaining": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz", + "integrity": "sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-remap-async-to-generator": "^7.16.8", + "@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.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-static-block": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz", + "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@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.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", + "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@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.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", + "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9", + "@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.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", + "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@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.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz", + "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9", + "@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.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@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.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@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.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz", + "integrity": "sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.18.8", + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.18.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", + "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@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.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz", + "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", + "@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.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz", + "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@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-private-property-in-object/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "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-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-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-transform-arrow-functions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz", + "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz", + "integrity": "sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-remap-async-to-generator": "^7.16.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", + "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz", + "integrity": "sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.9.tgz", + "integrity": "sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-split-export-declaration": "^7.18.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz", + "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.9.tgz", + "integrity": "sha512-p5VCYNddPLkZTq4XymQIaIfZNJwT9YsjkPOhkVEqt6QIpQFZVM9IltqqYpOEkJoN1DPznmxUDyZ5CTZs/ZCuHA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", + "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", + "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", + "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", + "dev": true, + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", + "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", + "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", + "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", + "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.6.tgz", + "integrity": "sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "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.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz", + "integrity": "sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-simple-access": "^7.18.6", + "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.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.9.tgz", + "integrity": "sha512-zY/VSIbbqtoRoJKo2cDTewL364jSlZGvn0LKOf9ntbfxOvjfmyrdtEEOAdswOswhZEb8UH3jDkCKHd1sPgsS0A==", + "dev": true, + "dependencies": { + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-module-transforms": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-validator-identifier": "^7.18.6", + "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.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", + "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz", + "integrity": "sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", + "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", + "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz", + "integrity": "sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", + "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz", + "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "regenerator-transform": "^0.15.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", + "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.17.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.17.10.tgz", + "integrity": "sha512-6jrMilUAJhktTr56kACL8LnWC5hx3Lf27BS0R0DSyW/OoJfb/iTHeE96V3b1dgKG3FSFdd/0culnYWMkjcKCig==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.5.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "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.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", + "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.9.tgz", + "integrity": "sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", + "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", + "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", + "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.6.tgz", + "integrity": "sha512-XNRwQUXYMP7VLuy54cr/KS/WeL3AZeORhrmeZ7iewgu+X2eBqmpaLI/hzqr9ZxCeUoq0ASK4GUzSM0BDhZkLFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", + "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.17.10", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.17.10.tgz", + "integrity": "sha512-YNgyBHZQpeoBSRBg0xixsZzfT58Ze1iZrajvv0lJc70qDDGuGfonEnMGfWeSY0mQ3JTuCWFbMkzFRVafOyJx4g==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.17.10", + "@babel/helper-compilation-targets": "^7.17.10", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-option": "^7.16.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7", + "@babel/plugin-proposal-async-generator-functions": "^7.16.8", + "@babel/plugin-proposal-class-properties": "^7.16.7", + "@babel/plugin-proposal-class-static-block": "^7.17.6", + "@babel/plugin-proposal-dynamic-import": "^7.16.7", + "@babel/plugin-proposal-export-namespace-from": "^7.16.7", + "@babel/plugin-proposal-json-strings": "^7.16.7", + "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7", + "@babel/plugin-proposal-numeric-separator": "^7.16.7", + "@babel/plugin-proposal-object-rest-spread": "^7.17.3", + "@babel/plugin-proposal-optional-catch-binding": "^7.16.7", + "@babel/plugin-proposal-optional-chaining": "^7.16.7", + "@babel/plugin-proposal-private-methods": "^7.16.11", + "@babel/plugin-proposal-private-property-in-object": "^7.16.7", + "@babel/plugin-proposal-unicode-property-regex": "^7.16.7", + "@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.16.7", + "@babel/plugin-transform-async-to-generator": "^7.16.8", + "@babel/plugin-transform-block-scoped-functions": "^7.16.7", + "@babel/plugin-transform-block-scoping": "^7.16.7", + "@babel/plugin-transform-classes": "^7.16.7", + "@babel/plugin-transform-computed-properties": "^7.16.7", + "@babel/plugin-transform-destructuring": "^7.17.7", + "@babel/plugin-transform-dotall-regex": "^7.16.7", + "@babel/plugin-transform-duplicate-keys": "^7.16.7", + "@babel/plugin-transform-exponentiation-operator": "^7.16.7", + "@babel/plugin-transform-for-of": "^7.16.7", + "@babel/plugin-transform-function-name": "^7.16.7", + "@babel/plugin-transform-literals": "^7.16.7", + "@babel/plugin-transform-member-expression-literals": "^7.16.7", + "@babel/plugin-transform-modules-amd": "^7.16.7", + "@babel/plugin-transform-modules-commonjs": "^7.17.9", + "@babel/plugin-transform-modules-systemjs": "^7.17.8", + "@babel/plugin-transform-modules-umd": "^7.16.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.17.10", + "@babel/plugin-transform-new-target": "^7.16.7", + "@babel/plugin-transform-object-super": "^7.16.7", + "@babel/plugin-transform-parameters": "^7.16.7", + "@babel/plugin-transform-property-literals": "^7.16.7", + "@babel/plugin-transform-regenerator": "^7.17.9", + "@babel/plugin-transform-reserved-words": "^7.16.7", + "@babel/plugin-transform-shorthand-properties": "^7.16.7", + "@babel/plugin-transform-spread": "^7.16.7", + "@babel/plugin-transform-sticky-regex": "^7.16.7", + "@babel/plugin-transform-template-literals": "^7.16.7", + "@babel/plugin-transform-typeof-symbol": "^7.16.7", + "@babel/plugin-transform-unicode-escapes": "^7.16.7", + "@babel/plugin-transform-unicode-regex": "^7.16.7", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.17.10", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.5.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "core-js-compat": "^3.22.1", + "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.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "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.17.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.9.tgz", + "integrity": "sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.9.tgz", + "integrity": "sha512-LcPAnujXGwBgv3/WHv01pHtb2tihcyW1XuL9wd7jqh1Z8AQkTd+QVjMrMijrln0T7ED3UXLIy36P9Ao7W75rYg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.9", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.18.9", + "@babel/types": "^7.18.9", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/generator": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.9.tgz", + "integrity": "sha512-wt5Naw6lJrL1/SGkipMiFxJjtyczUWTP38deiP1PO60HsBjDeKk08CGC3S8iVuvf0FmTdgKwU1KIXzSKL1G0Ug==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.9", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz", + "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@csstools/postcss-color-function": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz", + "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==", + "dev": true, + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-font-format-keywords": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz", + "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-hwb-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz", + "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-ic-unit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz", + "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==", + "dev": true, + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz", + "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==", + "dev": true, + "dependencies": { + "@csstools/selector-specificity": "^2.0.0", + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-normalize-display-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz", + "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-oklab-function": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz", + "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==", + "dev": true, + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-progressive-custom-properties": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", + "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/@csstools/postcss-stepped-value-functions": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz", + "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-unset-value": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz", + "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==", + "dev": true, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/selector-specificity": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.0.2.tgz", + "integrity": "sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==", + "dev": true, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2", + "postcss-selector-parser": "^6.0.10" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "dev": true + }, + "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/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/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", + "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@kolkov/angular-editor": { + "version": "3.0.0-beta.0", + "resolved": "https://registry.npmjs.org/@kolkov/angular-editor/-/angular-editor-3.0.0-beta.0.tgz", + "integrity": "sha512-uUa8FW9lFskfL8rans7YRtUQIVK1Qj8bBT9q1MwPXFZ1t+/KfPk62FL5IuMfcnu28UfKl0J2AnGYwbQe4h+Etw==", + "dependencies": { + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/common": ">=13", + "@angular/core": ">=13" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", + "dev": true + }, + "node_modules/@ngtools/webpack": { + "version": "14.0.6", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-14.0.6.tgz", + "integrity": "sha512-mSmLqzRKxQgGiOhvJ8guvRLjXoTL17cVSWlL/Cz+Q3xc1bXa7537ZXBTQTEuZVU2ytdkniKc8l1HqXIx0pFNVQ==", + "dev": true, + "engines": { + "node": "^14.15.0 || >=16.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "@angular/compiler-cli": "^14.0.0", + "typescript": ">=4.6.2 <4.8", + "webpack": "^5.54.0" + } + }, + "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.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/fs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.0.tgz", + "integrity": "sha512-DmfBvNXGaetMxj9LTp8NAN9vEidXURrf5ZTslQzEAi/6GbW+4yjaLFQc6Tue5cpZ9Frlk4OBo/Snf1Bh/S7qTQ==", + "dev": true, + "dependencies": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@npmcli/git": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-3.0.1.tgz", + "integrity": "sha512-UU85F/T+F1oVn3IsB/L6k9zXIMpXBuUBE25QDH0SsURwT6IOBqkC7M16uqo2vVZIyji3X1K4XH9luip7YekH1A==", + "dev": true, + "dependencies": { + "@npmcli/promise-spawn": "^3.0.0", + "lru-cache": "^7.4.4", + "mkdirp": "^1.0.4", + "npm-pick-manifest": "^7.0.0", + "proc-log": "^2.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^2.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@npmcli/git/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/@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/move-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.0.tgz", + "integrity": "sha512-UR6D5f4KEGWJV6BGPH3Qb2EtgH+t+1XQ1Tt85c7qicN6cezzuHPdZwwAxqZr4JLtnQu0LZsTza/5gmNmSl8XLg==", + "dev": true, + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@npmcli/node-gyp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-2.0.0.tgz", + "integrity": "sha512-doNI35wIe3bBaEgrlPfdJPaCpUR89pJWep4Hq3aRdh6gKazIVWfs0jHttvSSoq47ZXgC7h73kDsUl8AoIQUB+A==", + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@npmcli/promise-spawn": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-3.0.0.tgz", + "integrity": "sha512-s9SgS+p3a9Eohe68cSI3fi+hpcZUmXq5P7w0kMlAsWVtR7XbK3ptkZqKT2cK1zLDObJ3sR+8P59sJE0w/KTL1g==", + "dev": true, + "dependencies": { + "infer-owner": "^1.0.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@npmcli/run-script": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-3.0.3.tgz", + "integrity": "sha512-ZXL6qgC5NjwfZJ2nET+ZSLEz/PJgJ/5CU90C2S66dZY4Jw73DasS4ZCXuy/KHWYP0imjJ4VtA+Gebb5BxxKp9Q==", + "dev": true, + "dependencies": { + "@npmcli/node-gyp": "^2.0.0", + "@npmcli/promise-spawn": "^3.0.0", + "node-gyp": "^8.4.1", + "read-package-json-fast": "^2.0.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.5.tgz", + "integrity": "sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw==", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@schematics/angular": { + "version": "14.0.6", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-14.0.6.tgz", + "integrity": "sha512-vc4N6AXANMHUfcj5hOIDwBj4HQUrVSs03ksnznJGt2gkg2ClzJkK5Vg4/QA6lJ09VWSVZCuZ2Kkaua4bsTf6AA==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "14.0.6", + "@angular-devkit/schematics": "14.0.6", + "jsonc-parser": "3.0.0" + }, + "engines": { + "node": "^14.15.0 || >=16.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.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/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/component-emitter": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz", + "integrity": "sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ==", + "dev": true + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", + "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", + "dev": true, + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "dev": true + }, + "node_modules/@types/cors": { + "version": "2.8.12", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", + "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", + "dev": true + }, + "node_modules/@types/eslint": { + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.5.tgz", + "integrity": "sha512-dhsC09y1gpJWnK+Ff4SGvCuSnk9DaU0BJZSzOwa6GVSg65XtTugLBITDAAzRU5duGBoXBHpdR/9jHGxJjNflJQ==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "dev": true + }, + "node_modules/@types/express": { + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", + "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.29", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.29.tgz", + "integrity": "sha512-uMd++6dMKS32EOuw1Uli3e3BPgdLIXmezcfHv7N4c1s3gkhikBplORPpMq3fuWkxncZN1reb16d5n8yhQ80x7Q==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "node_modules/@types/http-proxy": { + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", + "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/jasmine": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-4.0.3.tgz", + "integrity": "sha512-Opp1LvvEuZdk8fSSvchK2mZwhVrsNT0JgJE9Di6MjnaIpmEXM8TLCPPrVtNTYh8+5MPdY8j9bAHMu2SSfwpZJg==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, + "node_modules/@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, + "node_modules/@types/node": { + "version": "18.0.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.6.tgz", + "integrity": "sha512-/xUq6H2aQm261exT6iZTMifUySEt4GR5KX8eYyY+C4MSNPqSh9oNIP7tz2GLKTlFaiBbgZNxffoR3CVRG+cljw==", + "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/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true + }, + "node_modules/@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.13.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", + "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ws": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", + "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@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.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "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.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", + "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "dev": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "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/adjust-sourcemap-loader/node_modules/loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "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.2.1", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", + "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/agentkeepalive/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/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.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "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-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/angular-font-awesome": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/angular-font-awesome/-/angular-font-awesome-3.1.2.tgz", + "integrity": "sha512-fgNL2jdhBmapaCS9MrcI33LyoYHH4WL9gIL59y334wBnKDZB6JgDRiImbCoNchEm1wFBbVwr9b7cWuQkV0dwEg==", + "engines": { + "node": ">= 6.9.0", + "npm": ">= 3.0.0" + }, + "peerDependencies": { + "@angular/core": ">=2.0.0 || >=4.0.0 || >=5.0.0", + "font-awesome": "^4.7.0" + } + }, + "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-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "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": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true + }, + "node_modules/are-we-there-yet": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz", + "integrity": "sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw==", + "dev": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16" + } + }, + "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/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": "3.0.1", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz", + "integrity": "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/autoprefixer": { + "version": "10.4.7", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.7.tgz", + "integrity": "sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + ], + "dependencies": { + "browserslist": "^4.20.3", + "caniuse-lite": "^1.0.30001335", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/babel-loader": { + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz", + "integrity": "sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==", + "dev": true, + "dependencies": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^2.0.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/loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.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.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", + "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.3.1", + "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.5.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", + "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.1", + "core-js-compat": "^3.21.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", + "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true + }, + "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": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "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/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/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/body-parser": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", + "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.10.3", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/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/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/bonjour-service": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.13.tgz", + "integrity": "sha512-LWKRU/7EqDUC9CTAQtuZl5HzBALoCYwtLhffW3et7vZMwv3bWLpJf8bRYlMD5OCcDpTfnPgNCV4yo9ZIaJGMiA==", + "dev": true, + "dependencies": { + "array-flatten": "^2.1.2", + "dns-equal": "^1.0.0", + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/bootstrap": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.1.3.tgz", + "integrity": "sha512-fcQztozJ8jToQWXxVuEyXWW+dSo8AiXWKwiSSrKWsRB/Qt+Ewwza+JWoLKiTuQLaEPhdNAJ7+Dosc9DOIqNy7Q==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + }, + "peerDependencies": { + "@popperjs/core": "^2.10.2" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "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/browserslist": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.2.tgz", + "integrity": "sha512-MonuOgAtUB46uP5CezYbRaYKBNt2LxP0yX+Pmj4LkcDFGkn9Cbpi83d9sCjwQDErXsIJSzY5oKGDbgOlF/LPAA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001366", + "electron-to-chromium": "^1.4.188", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.4" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "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/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/builtins": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "dev": true, + "dependencies": { + "semver": "^7.0.0" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "16.0.7", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.0.7.tgz", + "integrity": "sha512-a4zfQpp5vm4Ipdvbj+ZrPonikRhm6WBEd4zT1Yc1DXsmAxrPgDwWBLF/u/wTVXSFPIgOJ1U3ghSa2Xm4s3h28w==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.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-lite": { + "version": "1.0.30001367", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001367.tgz", + "integrity": "sha512-XDgbeOHfifWV3GEES2B8rtsrADx4Jf+juKX2SICJcaUhjYBO3bR96kvEIHa15VU6ohtOhBZuPGGYGbXMRn0NCw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] + }, + "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==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "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/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "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/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.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", + "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", + "dev": true, + "engines": { + "node": ">=6" + }, + "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==", + "dev": true, + "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": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "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/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==", + "dev": true, + "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": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "dev": true + }, + "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/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "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/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": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "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": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "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": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-disposition/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/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==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "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": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "node_modules/copy-anything": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", + "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", + "dev": true, + "dependencies": { + "is-what": "^3.14.1" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-10.2.4.tgz", + "integrity": "sha512-xFVltahqlsRcyyJqQbDY6EYTtyQZF9rf+JPjwHObLdPFMEISqkFkr7mFoVOC6BfYS/dNThyoQKvziugm+OnwBg==", + "dev": true, + "dependencies": { + "fast-glob": "^3.2.7", + "glob-parent": "^6.0.1", + "globby": "^12.0.2", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 12.20.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/core-js-compat": { + "version": "3.23.5", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.23.5.tgz", + "integrity": "sha512-fHYozIFIxd+91IIbXJgWd/igXIc8Mf9is0fusswjnGIWVG96y2cwyUdlCkGOw6rMLHKAxg7xtCIVaHsyOUnJIg==", + "dev": true, + "dependencies": { + "browserslist": "^4.21.2", + "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.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "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/critters": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.16.tgz", + "integrity": "sha512-JwjgmO6i3y6RWtLYmXwO5jMd+maZt8Tnfu7VVISmEWyQqfLpB8soBswf8/2bu6SBXxtKA68Al3c+qIG1ApT68A==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "css-select": "^4.2.0", + "parse5": "^6.0.1", + "parse5-htmlparser2-tree-adapter": "^6.0.1", + "postcss": "^8.3.7", + "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.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "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/cross-spawn/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/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": "3.0.3", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", + "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "bin": { + "css-blank-pseudo": "dist/cli.cjs" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-has-pseudo": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", + "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "bin": { + "css-has-pseudo": "dist/cli.cjs" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-loader": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz", + "integrity": "sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==", + "dev": true, + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.7", + "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.2.0", + "semver": "^7.3.5" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/css-prefers-color-scheme": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", + "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", + "dev": true, + "bin": { + "css-prefers-color-scheme": "dist/cli.cjs" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "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": "6.6.3", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-6.6.3.tgz", + "integrity": "sha512-7GDvDSmE+20+WcSMhP17Q1EVWUrLlbxxpMDqG731n8P99JhnQZHR9YvtjPvEHfjFUjvQJvdpKCjlKOX+xe4UVA==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + }, + "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/custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", + "dev": true + }, + "node_modules/date-format": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.11.tgz", + "integrity": "sha512-VS20KRyorrbMCQmpdl2hg5KaOUsda1RbnsJg461FfrcyCUg+pkd0b40BSW4niQyTheww4DBXQnS7HwSrKkipLw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dev": true, + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==", + "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.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "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/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "node_modules/di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", + "dev": true + }, + "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/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", + "dev": true + }, + "node_modules/dns-packet": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", + "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", + "dev": true, + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==", + "dev": true, + "dependencies": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "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/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.4.194", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.194.tgz", + "integrity": "sha512-ola5UH0xAP1oYY0FFUsPvwtucEzCQHucXnT7PQ1zjHJMccZhCDktEugI++JUR3YuIs7Ff7afz+OVEhVAIMhLAQ==", + "dev": true + }, + "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==", + "dev": true + }, + "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/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "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/engine.io": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.0.tgz", + "integrity": "sha512-4KzwW3F3bk+KlzSOY57fj/Jx6LyRQ1nbcyIadehl+AnXjKT7gDO0ORdRi/84ixvMKTym6ZKuxvbzN62HDDU1Lg==", + "dev": true, + "dependencies": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.3", + "ws": "~8.2.3" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io-parser": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz", + "integrity": "sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", + "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==", + "dev": true + }, + "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, + "optional": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "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.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.14.38", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.38.tgz", + "integrity": "sha512-12fzJ0fsm7gVZX1YQ1InkOE5f9Tl7cgf6JPYXRJtPIoE0zkWAbHdPHVPPaLi9tYAcEBqheGzqLn/3RdTOyBfcA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "esbuild-android-64": "0.14.38", + "esbuild-android-arm64": "0.14.38", + "esbuild-darwin-64": "0.14.38", + "esbuild-darwin-arm64": "0.14.38", + "esbuild-freebsd-64": "0.14.38", + "esbuild-freebsd-arm64": "0.14.38", + "esbuild-linux-32": "0.14.38", + "esbuild-linux-64": "0.14.38", + "esbuild-linux-arm": "0.14.38", + "esbuild-linux-arm64": "0.14.38", + "esbuild-linux-mips64le": "0.14.38", + "esbuild-linux-ppc64le": "0.14.38", + "esbuild-linux-riscv64": "0.14.38", + "esbuild-linux-s390x": "0.14.38", + "esbuild-netbsd-64": "0.14.38", + "esbuild-openbsd-64": "0.14.38", + "esbuild-sunos-64": "0.14.38", + "esbuild-windows-32": "0.14.38", + "esbuild-windows-64": "0.14.38", + "esbuild-windows-arm64": "0.14.38" + } + }, + "node_modules/esbuild-android-64": { + "version": "0.14.38", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.38.tgz", + "integrity": "sha512-aRFxR3scRKkbmNuGAK+Gee3+yFxkTJO/cx83Dkyzo4CnQl/2zVSurtG6+G86EQIZ+w+VYngVyK7P3HyTBKu3nw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-android-arm64": { + "version": "0.14.38", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.38.tgz", + "integrity": "sha512-L2NgQRWuHFI89IIZIlpAcINy9FvBk6xFVZ7xGdOwIm8VyhX1vNCEqUJO3DPSSy945Gzdg98cxtNt8Grv1CsyhA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-64": { + "version": "0.14.38", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.38.tgz", + "integrity": "sha512-5JJvgXkX87Pd1Og0u/NJuO7TSqAikAcQQ74gyJ87bqWRVeouky84ICoV4sN6VV53aTW+NE87qLdGY4QA2S7KNA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-arm64": { + "version": "0.14.38", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.38.tgz", + "integrity": "sha512-eqF+OejMI3mC5Dlo9Kdq/Ilbki9sQBw3QlHW3wjLmsLh+quNfHmGMp3Ly1eWm981iGBMdbtSS9+LRvR2T8B3eQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-64": { + "version": "0.14.38", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.38.tgz", + "integrity": "sha512-epnPbhZUt93xV5cgeY36ZxPXDsQeO55DppzsIgWM8vgiG/Rz+qYDLmh5ts3e+Ln1wA9dQ+nZmVHw+RjaW3I5Ig==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-arm64": { + "version": "0.14.38", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.38.tgz", + "integrity": "sha512-/9icXUYJWherhk+y5fjPI5yNUdFPtXHQlwP7/K/zg8t8lQdHVj20SqU9/udQmeUo5pDFHMYzcEFfJqgOVeKNNQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-32": { + "version": "0.14.38", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.38.tgz", + "integrity": "sha512-QfgfeNHRFvr2XeHFzP8kOZVnal3QvST3A0cgq32ZrHjSMFTdgXhMhmWdKzRXP/PKcfv3e2OW9tT9PpcjNvaq6g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-64": { + "version": "0.14.38", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.38.tgz", + "integrity": "sha512-uuZHNmqcs+Bj1qiW9k/HZU3FtIHmYiuxZ/6Aa+/KHb/pFKr7R3aVqvxlAudYI9Fw3St0VCPfv7QBpUITSmBR1Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm": { + "version": "0.14.38", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.38.tgz", + "integrity": "sha512-FiFvQe8J3VKTDXG01JbvoVRXQ0x6UZwyrU4IaLBZeq39Bsbatd94Fuc3F1RGqPF5RbIWW7RvkVQjn79ejzysnA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm64": { + "version": "0.14.38", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.38.tgz", + "integrity": "sha512-HlMGZTEsBrXrivr64eZ/EO0NQM8H8DuSENRok9d+Jtvq8hOLzrxfsAT9U94K3KOGk2XgCmkaI2KD8hX7F97lvA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-mips64le": { + "version": "0.14.38", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.38.tgz", + "integrity": "sha512-qd1dLf2v7QBiI5wwfil9j0HG/5YMFBAmMVmdeokbNAMbcg49p25t6IlJFXAeLzogv1AvgaXRXvgFNhScYEUXGQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-ppc64le": { + "version": "0.14.38", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.38.tgz", + "integrity": "sha512-mnbEm7o69gTl60jSuK+nn+pRsRHGtDPfzhrqEUXyCl7CTOCLtWN2bhK8bgsdp6J/2NyS/wHBjs1x8aBWwP2X9Q==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-riscv64": { + "version": "0.14.38", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.38.tgz", + "integrity": "sha512-+p6YKYbuV72uikChRk14FSyNJZ4WfYkffj6Af0/Tw63/6TJX6TnIKE+6D3xtEc7DeDth1fjUOEqm+ApKFXbbVQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-s390x": { + "version": "0.14.38", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.38.tgz", + "integrity": "sha512-0zUsiDkGJiMHxBQ7JDU8jbaanUY975CdOW1YDrurjrM0vWHfjv9tLQsW9GSyEb/heSK1L5gaweRjzfUVBFoybQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-netbsd-64": { + "version": "0.14.38", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.38.tgz", + "integrity": "sha512-cljBAApVwkpnJZfnRVThpRBGzCi+a+V9Ofb1fVkKhtrPLDYlHLrSYGtmnoTVWDQdU516qYI8+wOgcGZ4XIZh0Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-openbsd-64": { + "version": "0.14.38", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.38.tgz", + "integrity": "sha512-CDswYr2PWPGEPpLDUO50mL3WO/07EMjnZDNKpmaxUPsrW+kVM3LoAqr/CE8UbzugpEiflYqJsGPLirThRB18IQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-sunos-64": { + "version": "0.14.38", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.38.tgz", + "integrity": "sha512-2mfIoYW58gKcC3bck0j7lD3RZkqYA7MmujFYmSn9l6TiIcAMpuEvqksO+ntBgbLep/eyjpgdplF7b+4T9VJGOA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-wasm": { + "version": "0.14.38", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.14.38.tgz", + "integrity": "sha512-mObTw5/3+KIOTShVgk3fuEn+INnHgOSbWJuGkInEZTWpUOh/+TCSgRxl5cDon4OkoaLU5rWm7R7Dkl/mJv8SGw==", + "dev": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-32": { + "version": "0.14.38", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.38.tgz", + "integrity": "sha512-L2BmEeFZATAvU+FJzJiRLFUP+d9RHN+QXpgaOrs2klshoAm1AE6Us4X6fS9k33Uy5SzScn2TpcgecbqJza1Hjw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-64": { + "version": "0.14.38", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.38.tgz", + "integrity": "sha512-Khy4wVmebnzue8aeSXLC+6clo/hRYeNIm0DyikoEqX+3w3rcvrhzpoix0S+MF9vzh6JFskkIGD7Zx47ODJNyCw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-arm64": { + "version": "0.14.38", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.38.tgz", + "integrity": "sha512-k3FGCNmHBkqdJXuJszdWciAH77PukEyDsdIryEHn9cKLQFxzhT39dSumeTuggaQcXY57UlmLGIkklWZo2qzHpw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "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": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.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/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/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.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "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": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter-asyncresource": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eventemitter-asyncresource/-/eventemitter-asyncresource-1.0.0.tgz", + "integrity": "sha512-39F7TBIV0G7gTelxwbEqnwhp90eqCPON1k0NwNfwhgKn4Co4ybUbj2pECcXT0B3ztRKZ7Pw1JujUUgmQJHcVAQ==", + "dev": true + }, + "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": "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/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/express": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", + "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", + "dev": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.0", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.10.3", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "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": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, + "node_modules/express/node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/express/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/express/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "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/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.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "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.6.0" + } + }, + "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/fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "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==", + "dev": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "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/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.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/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": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/finalhandler/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "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": "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/flatted": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz", + "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", + "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/font-awesome": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz", + "integrity": "sha512-U6kGnykA/6bFmg1M/oT9EkFeIYv7JlX3bozwQJWiiLz6L0w3F5vBVPxHlwyX/vtNq1ckcpRKOB9f2Qal/VtFpg==", + "peer": true, + "engines": { + "node": ">=0.10.3" + } + }, + "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/fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "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": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "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==", + "dev": true + }, + "node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "dev": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", + "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "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/glob": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.1.tgz", + "integrity": "sha512-cF7FYZZ47YzmCu7dDy50xSRRfO3ErRfrXuLZcNIuyiJEco0XSrGtuilG19L5xp3NcwTx7Gn+X6Tv3fmsUPTbow==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": ">=12" + }, + "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==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-12.2.0.tgz", + "integrity": "sha512-wiSuFQLZ+urS9x2gGPl1H5drc5twabmm4m2gTR27XDFyjUHJUNsS8o/2aKyIF6IoBaR630atdher0XJ5g6OMmA==", + "dev": true, + "dependencies": { + "array-union": "^3.0.1", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.7", + "ignore": "^5.1.9", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "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/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "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": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true + }, + "node_modules/hdr-histogram-js": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hdr-histogram-js/-/hdr-histogram-js-2.0.3.tgz", + "integrity": "sha512-Hkn78wwzWHNCp2uarhzQ2SGFLU3JY8SBDDd3TAABK4fc30wm+MuPOrg5QVFVfkKOQd6Bfz3ukJEI+q9sXEkK1g==", + "dev": true, + "dependencies": { + "@assemblyscript/loader": "^0.10.1", + "base64-js": "^1.2.0", + "pako": "^1.0.3" + } + }, + "node_modules/hdr-histogram-percentiles-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hdr-histogram-percentiles-obj/-/hdr-histogram-percentiles-obj-3.0.0.tgz", + "integrity": "sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw==", + "dev": true + }, + "node_modules/hosted-git-info": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.0.0.tgz", + "integrity": "sha512-rRnjWu0Bxj+nIfUOkz0695C0H6tRrN5iYIzYejb0tDEefe2AekHu/U5Kn9pEie5vsJqpNQU02az7TGSH3qpz4Q==", + "dev": true, + "dependencies": { + "lru-cache": "^7.5.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "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/html-entities": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", + "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", + "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-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": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true + }, + "node_modules/http-proxy": { + "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": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dev": true, + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "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": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dev": true, + "dependencies": { + "ms": "^2.0.0" + } + }, + "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.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "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/ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-walk": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-5.0.1.tgz", + "integrity": "sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==", + "dev": true, + "dependencies": { + "minimatch": "^5.0.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "dev": true, + "optional": true, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/immutable": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", + "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==", + "dev": true + }, + "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-fresh/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/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "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/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": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/ini": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-3.0.0.tgz", + "integrity": "sha512-TxYQaeNW/N8ymDvwAxPyRbhMBtnEwuvaTYpOQkFx1nSeusgezHniEc/l35Vo4iCq/mMiTJbpD7oYxN98hFlfmw==", + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/inquirer": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", + "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", + "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.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12.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.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "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/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", + "dev": true + }, + "node_modules/ipaddr.js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "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-core-module": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "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": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "dev": true + }, + "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-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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-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-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": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "dev": true, + "engines": { + "node": ">= 8.0.0" + }, + "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": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz", + "integrity": "sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.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.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "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.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jasmine-core": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.1.1.tgz", + "integrity": "sha512-lmUfT5XcK9KKvt3lLYzn93hc4MGzlUBowExFVgzbSW0ZCrdeyS574dfsyfRhxbg81Wj4gk+RxUiTnj7KBfDA1g==", + "dev": true + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "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/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "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/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "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-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/json5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "dev": true, + "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": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "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": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true, + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/karma": { + "version": "6.3.20", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.20.tgz", + "integrity": "sha512-HRNQhMuKOwKpjYlWiJP0DUrJOh+QjaI/DTaD8b9rEm4Il3tJ8MijutVZH4ts10LuUFst/CedwTS6vieCN8yTSw==", + "dev": true, + "dependencies": { + "@colors/colors": "1.5.0", + "body-parser": "^1.19.0", + "braces": "^3.0.2", + "chokidar": "^3.5.1", + "connect": "^3.7.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.1", + "glob": "^7.1.7", + "graceful-fs": "^4.2.6", + "http-proxy": "^1.18.1", + "isbinaryfile": "^4.0.8", + "lodash": "^4.17.21", + "log4js": "^6.4.1", + "mime": "^2.5.2", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.5", + "qjobs": "^1.2.0", + "range-parser": "^1.2.1", + "rimraf": "^3.0.2", + "socket.io": "^4.4.1", + "source-map": "^0.6.1", + "tmp": "^0.2.1", + "ua-parser-js": "^0.7.30", + "yargs": "^16.1.1" + }, + "bin": { + "karma": "bin/karma" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/karma-chrome-launcher": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.1.tgz", + "integrity": "sha512-hsIglcq1vtboGPAN+DGCISCFOxW+ZVnIqhDQcCMqqCp+4dmJ0Qpq5QAjkbA0X2L9Mi6OBkHi2Srrbmm7pUKkzQ==", + "dev": true, + "dependencies": { + "which": "^1.2.1" + } + }, + "node_modules/karma-coverage": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.2.0.tgz", + "integrity": "sha512-gPVdoZBNDZ08UCzdMHHhEImKrw1+PAOQOIiffv1YsvxFhBjqvo/SVXNk4tqn1SYqX0BJZT6S/59zgxiBe+9OuA==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.1", + "istanbul-reports": "^3.0.5", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/karma-coverage/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==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/karma-coverage/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/karma-jasmine": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-5.0.1.tgz", + "integrity": "sha512-FkL1Kk+JAKmim8VWU8RXKZBpl0lLI7J8LijM0/q7oP7emfB6QMZV1Az+JgqGKSLpF0tYaav+KUVFQroZUxQTHA==", + "dev": true, + "dependencies": { + "jasmine-core": "^4.1.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "karma": "^6.0.0" + } + }, + "node_modules/karma-jasmine-html-reporter": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.7.0.tgz", + "integrity": "sha512-pzum1TL7j90DTE86eFt48/s12hqwQuiD+e5aXx2Dc9wDEn2LfGq6RoAxEZZjFiN0RDSCOnosEKRZWxbQ+iMpQQ==", + "dev": true, + "peerDependencies": { + "jasmine-core": ">=3.8", + "karma": ">=0.9", + "karma-jasmine": ">=1.1" + } + }, + "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/karma/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==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/karma/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/karma/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/karma/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/karma/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/karma/node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/karma/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "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/karma/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==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "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/klona": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", + "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/less": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/less/-/less-4.1.2.tgz", + "integrity": "sha512-EoQp/Et7OSOVu0aJknJOtlXZsnr8XE8KwuzTHOLeVSEx8pVWUICc8Q0VYRHgzyjX78nMEyC/oztWFbgyhtNfDA==", + "dev": true, + "dependencies": { + "copy-anything": "^2.0.1", + "parse-node-version": "^1.0.1", + "tslib": "^2.3.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.2.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-10.2.0.tgz", + "integrity": "sha512-AV5KHWvCezW27GT90WATaDnfXBv99llDbtaj4bshq6DvAihMdNjaPDcUMa6EXKLRF+P2opFenJp89BXg91XLYg==", + "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/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "optional": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "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/license-webpack-plugin": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", + "integrity": "sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==", + "dev": true, + "dependencies": { + "webpack-sources": "^3.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-sources": { + "optional": true + } + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.0.tgz", + "integrity": "sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ==", + "dev": true, + "engines": { + "node": ">= 12.13.0" + } + }, + "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/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "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.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "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/log4js": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.6.0.tgz", + "integrity": "sha512-3v8R7fd45UB6THucSht6wN2/7AZEruQbXdjygPZcxt5TA/msO6si9CN5MefUuKXbYnJHTBnYcx4famwcyQd+sA==", + "dev": true, + "dependencies": { + "date-format": "^4.0.11", + "debug": "^4.3.4", + "flatted": "^3.2.5", + "rfdc": "^1.3.0", + "streamroller": "^3.1.1" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/lru-cache": { + "version": "7.13.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.13.1.tgz", + "integrity": "sha512-CHqbAq7NFlW3RSnoWXLJBxCWaZVBrfa9UEHId2M3AW8iEBurbqduNexEUCGc3SHc6iCYXNJCDi903LajSVAEPQ==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/magic-string": { + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.1.tgz", + "integrity": "sha512-ndThHmvgtieXe8J/VGPjG+Apu7v7ItcD5mhEIvOscWjPF/ccOiLxHaSuCAS2G+3x4GKsAbT8u7zdyamupui8Tg==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + }, + "engines": { + "node": ">=12" + } + }, + "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-fetch-happen": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", + "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "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": "^6.0.0", + "ssri": "^8.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/make-fetch-happen/node_modules/@npmcli/fs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "dev": true, + "dependencies": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "node_modules/make-fetch-happen/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/make-fetch-happen/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==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/make-fetch-happen/node_modules/cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^1.0.0", + "@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/make-fetch-happen/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/make-fetch-happen/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-fetch-happen/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/make-fetch-happen/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/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.7.tgz", + "integrity": "sha512-ygaiUSNalBX85388uskeCyhSAoOSgzBbtVCr9jA2RROssFL9Q19/ZXFqS+2Th2sr1ewNIWgFdLzLC3Yl1Zv+lw==", + "dev": true, + "dependencies": { + "fs-monkey": "^1.0.3" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true + }, + "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": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "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/mini-css-extract-plugin": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.0.tgz", + "integrity": "sha512-ndG8nxCEnAemsg4FSgS+yNyHKgkTB4nPKqCOgh65j3/30qqC5RaSQQXMm++Y6sb6E1zRSxPkztj9fqxhS1Eo6w==", + "dev": true, + "dependencies": { + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.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": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, + "node_modules/minipass": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz", + "integrity": "sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==", + "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.4.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", + "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", + "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/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/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dev": true, + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "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/nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/needle": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz", + "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==", + "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/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "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/nice-napi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", + "integrity": "sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "!win32" + ], + "dependencies": { + "node-addon-api": "^3.0.0", + "node-gyp-build": "^4.2.2" + } + }, + "node_modules/node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "dev": true, + "optional": true + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true, + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-gyp": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", + "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^9.1.0", + "nopt": "^5.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": ">= 10.12.0" + } + }, + "node_modules/node-gyp-build": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz", + "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==", + "dev": true, + "optional": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-gyp/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==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/node-gyp/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/node-gyp/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/node-gyp/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/node-releases": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "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": "4.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-4.0.0.tgz", + "integrity": "sha512-m+GL22VXJKkKbw62ZaBBjv8u6IE3UI4Mh5QakIqs3fWiKe0Xyi6L97hakwZK41/LD4R/2ly71Bayx0NLMwLA/g==", + "dev": true, + "dependencies": { + "hosted-git-info": "^5.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16" + } + }, + "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": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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": "5.0.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-5.0.0.tgz", + "integrity": "sha512-65lUsMI8ztHCxFz5ckCEC44DRvEGdZX5usQFriauxHEwt7upv1FKaQEmAtU0YnOAdwuNWCmk64xYiQABNrEyLA==", + "dev": true, + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "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": "9.0.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.0.2.tgz", + "integrity": "sha512-v/miORuX8cndiOheW8p2moNuPJ7QhcFh9WGlTorruG8hXSA23vMTEp5hTCmDxic0nD8KHhj/NQgFuySD3GYY3g==", + "dev": true, + "dependencies": { + "hosted-git-info": "^5.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm-packlist": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-5.1.1.tgz", + "integrity": "sha512-UfpSvQ5YKwctmodvPPkK6Fwk603aoVsf8AEbmVKAEECrfvL8SSe1A2YIwrJ6xmTHAITKPwwZsWo7WwEbNk0kxw==", + "dev": true, + "dependencies": { + "glob": "^8.0.1", + "ignore-walk": "^5.0.1", + "npm-bundled": "^1.1.2", + "npm-normalize-package-bin": "^1.0.1" + }, + "bin": { + "npm-packlist": "bin/index.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm-pick-manifest": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-7.0.1.tgz", + "integrity": "sha512-IA8+tuv8KujbsbLQvselW2XQgmXWS47t3CB0ZrzsRZ82DbDfkcFunOaPm4X7qNuhMfq+FmV7hQT4iFVpHqV7mg==", + "dev": true, + "dependencies": { + "npm-install-checks": "^5.0.0", + "npm-normalize-package-bin": "^1.0.1", + "npm-package-arg": "^9.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm-registry-fetch": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-13.3.0.tgz", + "integrity": "sha512-10LJQ/1+VhKrZjIuY9I/+gQTvumqqlgnsCufoXETHAPFTS3+M+Z5CFhZRDHGavmJ6rOye3UvNga88vl8n1r6gg==", + "dev": true, + "dependencies": { + "make-fetch-happen": "^10.0.6", + "minipass": "^3.1.6", + "minipass-fetch": "^2.0.3", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^9.0.1", + "proc-log": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm-registry-fetch/node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/npm-registry-fetch/node_modules/cacache": { + "version": "16.1.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.1.tgz", + "integrity": "sha512-VDKN+LHyCQXaaYZ7rA/qtkURU+/yYhviUdvqEv2LT6QPZU8jpyzEkEVAcKlKLt5dJ5BRp11ym8lo3NKLluEPLg==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm-registry-fetch/node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/npm-registry-fetch/node_modules/make-fetch-happen": { + "version": "10.1.8", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.1.8.tgz", + "integrity": "sha512-0ASJbG12Au6+N5I84W+8FhGS6iM8MyzvZady+zaQAu+6IOaESFzCLLD0AR1sAFF3Jufi8bxm586ABN6hWd3k7g==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm-registry-fetch/node_modules/minipass-fetch": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.0.tgz", + "integrity": "sha512-H9U4UVBGXEyyWJnqYDCLp1PwD8XIkJ4akNHp1aGVI+2Ym7wQMlxDKi4IB4JbmyU+pl9pEs/cVrK6cOuvmbK4Sg==", + "dev": true, + "dependencies": { + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/npm-registry-fetch/node_modules/socks-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "dev": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "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": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "dev": true, + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "dev": true, + "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.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/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.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "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": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "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/open": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "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/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.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "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/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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/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/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-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dev": true, + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-retry/node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "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": "13.3.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-13.3.0.tgz", + "integrity": "sha512-auhJAUlfC2TALo6I0s1vFoPvVFgWGx+uz/PnIojTTgkGwlK3Np8sGJ0ghfFhiuzJXTZoTycMLk8uLskdntPbDw==", + "dev": true, + "dependencies": { + "@npmcli/git": "^3.0.0", + "@npmcli/installed-package-contents": "^1.0.7", + "@npmcli/promise-spawn": "^3.0.0", + "@npmcli/run-script": "^3.0.1", + "cacache": "^16.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "infer-owner": "^1.0.4", + "minipass": "^3.1.6", + "mkdirp": "^1.0.4", + "npm-package-arg": "^9.0.0", + "npm-packlist": "^5.0.0", + "npm-pick-manifest": "^7.0.0", + "npm-registry-fetch": "^13.0.1", + "proc-log": "^2.0.0", + "promise-retry": "^2.0.1", + "read-package-json": "^5.0.0", + "read-package-json-fast": "^2.0.3", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "lib/bin.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "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-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/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/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": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true + }, + "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": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "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/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "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": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/piscina": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-3.2.0.tgz", + "integrity": "sha512-yn/jMdHRw+q2ZJhFhyqsmANcbF6V2QwmD84c6xRau+QpQOmtrBCoRGdvTfeuFDYXB5W2m6MfLkjkvQa9lUSmIA==", + "dev": true, + "dependencies": { + "eventemitter-asyncresource": "^1.0.0", + "hdr-histogram-js": "^2.0.1", + "hdr-histogram-percentiles-obj": "^3.0.0" + }, + "optionalDependencies": { + "nice-napi": "^1.0.2" + } + }, + "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/postcss": { + "version": "8.4.13", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.13.tgz", + "integrity": "sha512-jtL6eTBrza5MPzy8oJLFuUscHDXTV5KcLlqAWHl5q5WYRfnNRGSmOZmOZ1T6Gy7A99mOZfqungmZMpMmCVJ8ZA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "dependencies": { + "nanoid": "^3.3.3", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-attribute-case-insensitive": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz", + "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-clamp": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", + "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=7.6.0" + }, + "peerDependencies": { + "postcss": "^8.4.6" + } + }, + "node_modules/postcss-color-functional-notation": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz", + "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-color-hex-alpha": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz", + "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-color-rebeccapurple": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz", + "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-custom-media": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz", + "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/postcss-custom-properties": { + "version": "12.1.8", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.8.tgz", + "integrity": "sha512-8rbj8kVu00RQh2fQF81oBqtduiANu4MIxhyf0HbbStgPtnFlWn0yiaYTpLHrPnJbffVY1s9apWsIoVZcc68FxA==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-selectors": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz", + "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/postcss-dir-pseudo-class": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz", + "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-double-position-gradients": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz", + "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==", + "dev": true, + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-env-function": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", + "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-visible": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", + "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-within": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", + "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-font-variant": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", + "dev": true, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-gap-properties": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz", + "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==", + "dev": true, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-image-set-function": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz", + "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-import": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", + "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", + "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": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", + "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", + "dev": true, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-lab-function": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz", + "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==", + "dev": true, + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-loader": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", + "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", + "dev": true, + "dependencies": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.5", + "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": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", + "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", + "dev": true, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-media-minmax": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", + "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "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": "10.1.10", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.1.10.tgz", + "integrity": "sha512-lqd7LXCq0gWc0wKXtoKDru5wEUNjm3OryLVNRZ8OnW8km6fSNUuFrjEhU3nklxXE2jvd4qrox566acgh+xQt8w==", + "dev": true, + "dependencies": { + "@csstools/selector-specificity": "^2.0.0", + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-opacity-percentage": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.2.tgz", + "integrity": "sha512-lyUfF7miG+yewZ8EAk9XUBIlrHyUE6fijnesuz+Mj5zrIHIEw6KcIZSOk/elVMqzLvREmXB83Zi/5QpNRYd47w==", + "dev": true, + "funding": [ + { + "type": "kofi", + "url": "https://ko-fi.com/mrcgrtz" + }, + { + "type": "liberapay", + "url": "https://liberapay.com/mrcgrtz" + } + ], + "engines": { + "node": "^12 || ^14 || >=16" + } + }, + "node_modules/postcss-overflow-shorthand": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz", + "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-page-break": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "dev": true, + "peerDependencies": { + "postcss": "^8" + } + }, + "node_modules/postcss-place": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz", + "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-preset-env": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.5.0.tgz", + "integrity": "sha512-0BJzWEfCdTtK2R3EiKKSdkE51/DI/BwnhlnicSW482Ym6/DGHud8K0wGLcdjip1epVX0HKo4c8zzTeV/SkiejQ==", + "dev": true, + "dependencies": { + "@csstools/postcss-color-function": "^1.1.0", + "@csstools/postcss-font-format-keywords": "^1.0.0", + "@csstools/postcss-hwb-function": "^1.0.0", + "@csstools/postcss-ic-unit": "^1.0.0", + "@csstools/postcss-is-pseudo-class": "^2.0.2", + "@csstools/postcss-normalize-display-values": "^1.0.0", + "@csstools/postcss-oklab-function": "^1.1.0", + "@csstools/postcss-progressive-custom-properties": "^1.3.0", + "@csstools/postcss-stepped-value-functions": "^1.0.0", + "@csstools/postcss-unset-value": "^1.0.0", + "autoprefixer": "^10.4.6", + "browserslist": "^4.20.3", + "css-blank-pseudo": "^3.0.3", + "css-has-pseudo": "^3.0.4", + "css-prefers-color-scheme": "^6.0.3", + "cssdb": "^6.6.1", + "postcss-attribute-case-insensitive": "^5.0.0", + "postcss-clamp": "^4.1.0", + "postcss-color-functional-notation": "^4.2.2", + "postcss-color-hex-alpha": "^8.0.3", + "postcss-color-rebeccapurple": "^7.0.2", + "postcss-custom-media": "^8.0.0", + "postcss-custom-properties": "^12.1.7", + "postcss-custom-selectors": "^6.0.0", + "postcss-dir-pseudo-class": "^6.0.4", + "postcss-double-position-gradients": "^3.1.1", + "postcss-env-function": "^4.0.6", + "postcss-focus-visible": "^6.0.4", + "postcss-focus-within": "^5.0.4", + "postcss-font-variant": "^5.0.0", + "postcss-gap-properties": "^3.0.3", + "postcss-image-set-function": "^4.0.6", + "postcss-initial": "^4.0.1", + "postcss-lab-function": "^4.2.0", + "postcss-logical": "^5.0.4", + "postcss-media-minmax": "^5.0.0", + "postcss-nesting": "^10.1.4", + "postcss-opacity-percentage": "^1.1.2", + "postcss-overflow-shorthand": "^3.0.3", + "postcss-page-break": "^3.0.4", + "postcss-place": "^7.0.4", + "postcss-pseudo-class-any-link": "^7.1.2", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^5.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-pseudo-class-any-link": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz", + "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-replace-overflow-wrap": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "dev": true, + "peerDependencies": { + "postcss": "^8.0.3" + } + }, + "node_modules/postcss-selector-not": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-5.0.0.tgz", + "integrity": "sha512-/2K3A4TCP9orP4TNS7u3tGdRFVKqz/E6pX3aGnriPG0jU78of8wsUcqE4QAhWEU0d+WnMSF93Ah3F//vUtK+iQ==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "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/proc-log": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-2.0.1.tgz", + "integrity": "sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==", + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "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/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "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/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/proxy-addr/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/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true, + "optional": true + }, + "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/qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "dev": true, + "engines": { + "node": ">=0.9" + } + }, + "node_modules/qs": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/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.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/read-package-json": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-5.0.1.tgz", + "integrity": "sha512-MALHuNgYWdGW3gKzuNMuYtcSSZbGQm94fAp16xt8VsYTLBjUSc55bLMKe6gzpWue0Tfi6CBgwCSdDAqutGDhMg==", + "dev": true, + "dependencies": { + "glob": "^8.0.1", + "json-parse-even-better-errors": "^2.3.1", + "normalize-package-data": "^4.0.0", + "npm-normalize-package-bin": "^1.0.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/read-package-json-fast": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz", + "integrity": "sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==", + "dev": true, + "dependencies": { + "json-parse-even-better-errors": "^2.3.0", + "npm-normalize-package-bin": "^1.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "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/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/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": "10.0.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", + "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", + "dev": true + }, + "node_modules/regenerator-transform": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", + "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "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/regexpu-core": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.1.0.tgz", + "integrity": "sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.0.1", + "regjsgen": "^0.6.0", + "regjsparser": "^0.8.2", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", + "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==", + "dev": true + }, + "node_modules/regjsparser": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", + "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", + "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": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "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/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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-url-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", + "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", + "dev": true, + "dependencies": { + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.14", + "source-map": "0.6.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/resolve-url-loader/node_modules/loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "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/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/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "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/rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "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/rimraf/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==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "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/rxjs": { + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.6.tgz", + "integrity": "sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "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==", + "dev": true + }, + "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.51.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.51.0.tgz", + "integrity": "sha512-haGdpTgywJTvHC2b91GSq+clTKGbtkkZmVAb82jZQN/wTy6qs8DdFm2lhEQbEwrY0QDRgSQ3xDurqM977C3noA==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/sass-loader": { + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", + "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==", + "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 || ^7.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + } + } + }, + "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/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/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/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/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true + }, + "node_modules/selfsigned": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.1.tgz", + "integrity": "sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ==", + "dev": true, + "dependencies": { + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "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/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/send/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/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/send/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "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": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "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/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "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": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "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-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "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/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socket.io": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.1.tgz", + "integrity": "sha512-0y9pnIso5a9i+lJmsCdtmTTgJFFSvNQKDnPQRz28mGNnxbmqYg2QPtJTLFxhymFZhAIn50eHAKzJeiNaKr+yUQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.2", + "engine.io": "~6.2.0", + "socket.io-adapter": "~2.4.0", + "socket.io-parser": "~4.0.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz", + "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg==", + "dev": true + }, + "node_modules/socket.io-parser": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.5.tgz", + "integrity": "sha512-sNjbT9dX63nqUFIOv95tTVm6elyIU4RvB1m8dOeZt+IgWwcWklFDOdmGcfo3zSiRsnR/3pJkjY5lfoGqEe4Eig==", + "dev": true, + "dependencies": { + "@types/component-emitter": "^1.2.10", + "component-emitter": "~1.3.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/socks": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.0.tgz", + "integrity": "sha512-scnOe9y4VuiNUULJN72GrM26BNOjVsfPXI+j+98PkyEfsIXroa5ofyjT+FzGvn/xHs73U2JtoBYAVx9Hl4quSA==", + "dev": true, + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", + "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", + "dev": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "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": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-loader": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.1.tgz", + "integrity": "sha512-Vp1UsfyPvgujKQzi4pyDiTOnE3E4H+yHvkVRN3c/9PJmQS4CQJExvcDvaX/D+RV+xQben9HJ56jMJS3CgUeWyA==", + "dev": true, + "dependencies": { + "abab": "^2.0.5", + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.1" + }, + "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==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "dev": true, + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "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/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/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.11", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", + "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", + "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/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/ssri": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "dev": true, + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/streamroller": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.1.tgz", + "integrity": "sha512-iPhtd9unZ6zKdWgMeYGfSBuqCngyJy1B/GPi/lTpwGpa3bajuX30GjUVd0/Tn/Xhg0mr4DOSENozz9Y06qyonQ==", + "dev": true, + "dependencies": { + "date-format": "^4.0.10", + "debug": "^4.3.4", + "fs-extra": "^10.1.0" + }, + "engines": { + "node": ">=8.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-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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/stylus": { + "version": "0.57.0", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.57.0.tgz", + "integrity": "sha512-yOI6G8WYfr0q8v8rRvE91wbxFU+rJPo760Va4MF6K0I6BZjO4r+xSynkvyPBP9tV1CIEUeRsiidjIs2rzb1CnQ==", + "dev": true, + "dependencies": { + "css": "^3.0.0", + "debug": "^4.3.2", + "glob": "^7.1.6", + "safer-buffer": "^2.1.2", + "sax": "~1.2.4", + "source-map": "^0.7.3" + }, + "bin": { + "stylus": "bin/stylus" + }, + "engines": { + "node": "*" + } + }, + "node_modules/stylus-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-6.2.0.tgz", + "integrity": "sha512-5dsDc7qVQGRoc6pvCL20eYgRUxepZ9FpeK28XhdXaIPP6kXr6nI1zAAKFQgP5OBkOfKaURp4WUpJzspg1f01Gg==", + "dev": true, + "dependencies": { + "fast-glob": "^3.2.7", + "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/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/stylus/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/stylus/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "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==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "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/terser": { + "version": "5.13.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.13.1.tgz", + "integrity": "sha512-hn4WKOfwnwbYfe48NgrQjqNOH9jzLqRcIfbYytOXCOv46LBfWr9bDS17MQqOi+BWGD0sJK3Sj5NC/gJjiojaoA==", + "dev": true, + "dependencies": { + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map": "~0.8.0-beta.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz", + "integrity": "sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.7", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", + "terser": "^5.7.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "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/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/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.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "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/node_modules/source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "dev": true, + "dependencies": { + "whatwg-url": "^7.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "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/test-exclude/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==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "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/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/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "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/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "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/typed-assert": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", + "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", + "dev": true + }, + "node_modules/typescript": { + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/ua-parser-js": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz", + "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + } + ], + "engines": { + "node": "*" + } + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", + "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", + "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", + "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "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/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "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/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": "4.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz", + "integrity": "sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==", + "dev": true, + "dependencies": { + "builtins": "^5.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "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": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "node_modules/webpack": { + "version": "5.72.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.72.1.tgz", + "integrity": "sha512-dXG5zXCLspQR4krZVR6QgajnZOjW2K/djHvdcRaDQvsjV9z9vaW6+ja5dZOYbqBBjF6kGXka/2ZyxNdc+8Jung==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.4.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.9.3", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.3.1", + "webpack-sources": "^3.2.3" + }, + "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-dev-middleware": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.1.tgz", + "integrity": "sha512-81EujCKkyles2wphtdrnPg/QqegC/AtqNH//mQkBYSMqwFVCQrxM6ktB2O/SPlZy7LqeEfTbV3cZARGQz6umhg==", + "dev": true, + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.1", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.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/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.0.tgz", + "integrity": "sha512-+Nlb39iQSOSsFv0lWUuUTim3jDQO8nhK3E68f//J2r5rIcp4lULHXz2oZ0UVdEeWXEh5lSzYUlzarZhDAeAVQw==", + "dev": true, + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.1", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.0.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.21", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.4.2" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", + "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "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-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-subresource-integrity": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz", + "integrity": "sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==", + "dev": true, + "dependencies": { + "typed-assert": "^1.0.8" + }, + "engines": { + "node": ">= 12" + }, + "peerDependencies": { + "html-webpack-plugin": ">= 5.0.0-beta.1 < 6", + "webpack": "^5.12.0" + }, + "peerDependenciesMeta": { + "html-webpack-plugin": { + "optional": true + } + } + }, + "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/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/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.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "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/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 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/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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/ws": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "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": "17.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.4.1.tgz", + "integrity": "sha512-WSZD9jgobAg3ZKuCQZSa3g9QOJeCCqLoLAykiWgmXnDo9EPnn4RPf5qVTtzgOx66o6/oqhcA5tHtJXpG8pMt3g==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", + "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/zone.js": { + "version": "0.11.6", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.6.tgz", + "integrity": "sha512-umJqFtKyZlPli669gB1gOrRE9hxUUGkZr7mo878z+NEBJZZixJkKeVYfnoLa7g25SseUDc92OZrMKKHySyJrFg==", + "dependencies": { + "tslib": "^2.3.0" + } + } + }, + "dependencies": { + "@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@angular-devkit/architect": { + "version": "0.1400.6", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1400.6.tgz", + "integrity": "sha512-POqWsCvo5O4/5dsPYGA68YU9x5k/xAU+a5h/QvhjeRJVCuYZ0IX97EPQ+w/tXRRL3kdwS6zfaIXR2p+U3F1DmA==", + "dev": true, + "requires": { + "@angular-devkit/core": "14.0.6", + "rxjs": "6.6.7" + }, + "dependencies": { + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "@angular-devkit/build-angular": { + "version": "14.0.6", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-14.0.6.tgz", + "integrity": "sha512-xwLG37ta5qV1NrqdAFGa6t8lrNuoO1WYYEJ4LcHqid7sXlN4cpV88CzNoWn8ElDdEZwcjPOW81mPRLY663iudQ==", + "dev": true, + "requires": { + "@ampproject/remapping": "2.2.0", + "@angular-devkit/architect": "0.1400.6", + "@angular-devkit/build-webpack": "0.1400.6", + "@angular-devkit/core": "14.0.6", + "@babel/core": "7.17.10", + "@babel/generator": "7.17.10", + "@babel/helper-annotate-as-pure": "7.16.7", + "@babel/plugin-proposal-async-generator-functions": "7.16.8", + "@babel/plugin-transform-async-to-generator": "7.16.8", + "@babel/plugin-transform-runtime": "7.17.10", + "@babel/preset-env": "7.17.10", + "@babel/runtime": "7.17.9", + "@babel/template": "7.16.7", + "@discoveryjs/json-ext": "0.5.7", + "@ngtools/webpack": "14.0.6", + "ansi-colors": "4.1.1", + "babel-loader": "8.2.5", + "babel-plugin-istanbul": "6.1.1", + "browserslist": "^4.9.1", + "cacache": "16.0.7", + "copy-webpack-plugin": "10.2.4", + "critters": "0.0.16", + "css-loader": "6.7.1", + "esbuild": "0.14.38", + "esbuild-wasm": "0.14.38", + "glob": "8.0.1", + "https-proxy-agent": "5.0.1", + "inquirer": "8.2.4", + "jsonc-parser": "3.0.0", + "karma-source-map-support": "1.4.0", + "less": "4.1.2", + "less-loader": "10.2.0", + "license-webpack-plugin": "4.0.2", + "loader-utils": "3.2.0", + "mini-css-extract-plugin": "2.6.0", + "minimatch": "5.0.1", + "open": "8.4.0", + "ora": "5.4.1", + "parse5-html-rewriting-stream": "6.0.1", + "piscina": "3.2.0", + "postcss": "8.4.13", + "postcss-import": "14.1.0", + "postcss-loader": "6.2.1", + "postcss-preset-env": "7.5.0", + "regenerator-runtime": "0.13.9", + "resolve-url-loader": "5.0.0", + "rxjs": "6.6.7", + "sass": "1.51.0", + "sass-loader": "12.6.0", + "semver": "7.3.7", + "source-map-loader": "3.0.1", + "source-map-support": "0.5.21", + "stylus": "0.57.0", + "stylus-loader": "6.2.0", + "terser": "5.13.1", + "text-table": "0.2.0", + "tree-kill": "1.2.2", + "tslib": "2.4.0", + "webpack": "5.72.1", + "webpack-dev-middleware": "5.3.1", + "webpack-dev-server": "4.9.0", + "webpack-merge": "5.8.0", + "webpack-subresource-integrity": "5.1.0" + }, + "dependencies": { + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "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==", + "dev": true + } + } + } + } + }, + "@angular-devkit/build-webpack": { + "version": "0.1400.6", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1400.6.tgz", + "integrity": "sha512-3Zg+jST6a2Xj8s4IQ7XIH31Pv6/0XbKCbGC0W31fPRAxTKIeLfEJYkDXwnhpEY5ctYq3PR1/IXjZNlGoz0AhvQ==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.1400.6", + "rxjs": "6.6.7" + }, + "dependencies": { + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "@angular-devkit/core": { + "version": "14.0.6", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-14.0.6.tgz", + "integrity": "sha512-b0U4D5jxAsx26F4YQu7XW+lpxLZT4ssdyMarbfIryeupznnGE+69F+U/G+FhTEMYbxrYRMGn/wYy6vcg57NYfQ==", + "dev": true, + "requires": { + "ajv": "8.11.0", + "ajv-formats": "2.1.1", + "jsonc-parser": "3.0.0", + "rxjs": "6.6.7", + "source-map": "0.7.3" + }, + "dependencies": { + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "@angular-devkit/schematics": { + "version": "14.0.6", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-14.0.6.tgz", + "integrity": "sha512-o7I5KBnz/fxYgVLZ+XIsaGZUDiQCqM89aaIPOg84Ij0Nr3N+f4NYq56PPRln7hAfV3m/3JpH+cgycaGND5wHHQ==", + "dev": true, + "requires": { + "@angular-devkit/core": "14.0.6", + "jsonc-parser": "3.0.0", + "magic-string": "0.26.1", + "ora": "5.4.1", + "rxjs": "6.6.7" + }, + "dependencies": { + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "@angular/animations": { + "version": "14.0.6", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-14.0.6.tgz", + "integrity": "sha512-l363hFgj5Dxw6WKZkJRd77izOznCqJVrWhxfO9ERG0ShVUb/3WB9RSOUCVltDrTY5sFK+cw+slQYGH6AXgvMVQ==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@angular/cli": { + "version": "14.0.6", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-14.0.6.tgz", + "integrity": "sha512-q8iByoyVNLUOCosc5/wD9FkaM09d5HOic5RYSAg265pMgreQ/oQM1ajGRzzVWFhzw/RlUuon8ezZyAUAXfszCQ==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.1400.6", + "@angular-devkit/core": "14.0.6", + "@angular-devkit/schematics": "14.0.6", + "@schematics/angular": "14.0.6", + "@yarnpkg/lockfile": "1.1.0", + "ansi-colors": "4.1.1", + "debug": "4.3.4", + "ini": "3.0.0", + "inquirer": "8.2.4", + "jsonc-parser": "3.0.0", + "npm-package-arg": "9.0.2", + "npm-pick-manifest": "7.0.1", + "open": "8.4.0", + "ora": "5.4.1", + "pacote": "13.3.0", + "resolve": "1.22.0", + "semver": "7.3.7", + "symbol-observable": "4.0.0", + "uuid": "8.3.2", + "yargs": "17.4.1" + } + }, + "@angular/common": { + "version": "14.0.6", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-14.0.6.tgz", + "integrity": "sha512-AynjE7OOEfrdKmS3nu00tkf4g66cx97T6qhfaTvc3hKi45MreBcJkIMcSowF24peygvUN41htMJuq3WQLu92iQ==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@angular/compiler": { + "version": "14.0.6", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-14.0.6.tgz", + "integrity": "sha512-zYq3+Pg6m7NKivqEk+vNy+5ic5A+B0ReqIECjs10pVeXoWBxjvZAqG2ksrCQ0axtju2hA3lrFsDthLShWBEf4g==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@angular/compiler-cli": { + "version": "14.0.6", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-14.0.6.tgz", + "integrity": "sha512-w1ccZEzbRRqzMNaty0P4QliSslmR+9pBhDpKNfI+PsRqjJOnyC9tFdtZQLjcbnaM8W0yJLnCfZQ7KKXjnjzawg==", + "dev": true, + "requires": { + "@babel/core": "^7.17.2", + "chokidar": "^3.0.0", + "convert-source-map": "^1.5.1", + "dependency-graph": "^0.11.0", + "magic-string": "^0.26.0", + "reflect-metadata": "^0.1.2", + "semver": "^7.0.0", + "sourcemap-codec": "^1.4.8", + "tslib": "^2.3.0", + "yargs": "^17.2.1" + } + }, + "@angular/core": { + "version": "14.0.6", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-14.0.6.tgz", + "integrity": "sha512-hyQ3s9Yrm3ejhumgAC9ENhMFmvmPlJkk1tEOjruyoiHwK4EOaDpI+GCNQIBUB1Z3B/QLMlgZeMXrULQztjSQwg==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@angular/forms": { + "version": "14.0.6", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-14.0.6.tgz", + "integrity": "sha512-ITa3A6pWecDgDjBTlwQnJnSOc1o35bIvRpTclLx/ysDbn4FB2tPy4iseCSrOlgdJHZjBcHBIxX27yYjWyBfIwQ==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@angular/platform-browser": { + "version": "14.0.6", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-14.0.6.tgz", + "integrity": "sha512-d9PS2E5HSgiKzItHzVdxdBoMeaOvlDo6ccSEXLYCGyJ9MykDjKvJPWy6GicilBPa8g4VGJpk9J+lbgXXAOkCFA==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@angular/platform-browser-dynamic": { + "version": "14.0.6", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-14.0.6.tgz", + "integrity": "sha512-iYWmzUDWO+qc7wN1ED3dIkvDjIBdSqh/gpFvLGyCUZBwzwZ45sJOT/YgCmLBzBsVV/2GhAhV0QL4ioVQ5Jy3UA==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@angular/router": { + "version": "14.0.6", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-14.0.6.tgz", + "integrity": "sha512-FFLnaBuOASqUCbr8QIBX8Y+PbSSVrN6YFVI82bQDr2fesI+5UdLTfiEBUMizwnQ4choEtSd8542DjiEW8Rc+lA==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@assemblyscript/loader": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz", + "integrity": "sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==", + "dev": true + }, + "@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "requires": { + "@babel/highlight": "^7.18.6" + } + }, + "@babel/compat-data": { + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz", + "integrity": "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==", + "dev": true + }, + "@babel/core": { + "version": "7.17.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.10.tgz", + "integrity": "sha512-liKoppandF3ZcBnIYFjfSDHZLKdLHGJRkoWtG8zQyGJBQfIYobpnVGI5+pLBNtS6psFLDzyq8+h5HiVljW9PNA==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.10", + "@babel/helper-compilation-targets": "^7.17.10", + "@babel/helper-module-transforms": "^7.17.7", + "@babel/helpers": "^7.17.9", + "@babel/parser": "^7.17.10", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.10", + "@babel/types": "^7.17.10", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "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/generator": { + "version": "7.17.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.10.tgz", + "integrity": "sha512-46MJZZo9y3o4kmhBVc7zW7i8dtR1oIK/sdO5NcfcZRhTGYi+KKJRtHNgsU6c4VUcJmUNV/LQdebD/9Dlv4K+Tg==", + "dev": true, + "requires": { + "@babel/types": "^7.17.10", + "@jridgewell/gen-mapping": "^0.1.0", + "jsesc": "^2.5.1" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", + "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", + "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.18.6", + "@babel/types": "^7.18.9" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", + "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.18.8", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.20.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/helper-create-class-features-plugin": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.9.tgz", + "integrity": "sha512-WvypNAYaVh23QcjpMR24CwZY2Nz6hqdOcFdPbNpV56hL5H6KiFheO7Xm1aPdlLQ7d5emYZX7VZwPp9x3z+2opw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-split-export-declaration": "^7.18.6" + }, + "dependencies": { + "@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + } + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz", + "integrity": "sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "regexpu-core": "^5.1.0" + }, + "dependencies": { + "@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + } + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", + "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", + "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-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "dev": true + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", + "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-function-name": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", + "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", + "dev": true, + "requires": { + "@babel/template": "^7.18.6", + "@babel/types": "^7.18.9" + }, + "dependencies": { + "@babel/template": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", + "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.6", + "@babel/types": "^7.18.6" + } + } + } + }, + "@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", + "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", + "dev": true, + "requires": { + "@babel/types": "^7.18.9" + } + }, + "@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-module-transforms": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", + "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.18.6", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" + }, + "dependencies": { + "@babel/template": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", + "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.6", + "@babel/types": "^7.18.6" + } + } + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", + "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz", + "integrity": "sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==", + "dev": true + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", + "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-wrap-function": "^7.18.9", + "@babel/types": "^7.18.9" + }, + "dependencies": { + "@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + } + } + }, + "@babel/helper-replace-supers": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.9.tgz", + "integrity": "sha512-dNsWibVI4lNT6HiuOIBr1oyxo40HvIVmbwPUm3XZ7wMh4k2WxrxTqZwSqw/eEmXDS9np0ey5M2bz9tBmO9c+YQ==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" + } + }, + "@babel/helper-simple-access": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", + "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz", + "integrity": "sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==", + "dev": true, + "requires": { + "@babel/types": "^7.18.9" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", + "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.9.tgz", + "integrity": "sha512-cG2ru3TRAL6a60tfQflpEfs4ldiPwF6YW3zfJiRgmoFVIaC1vGnBBgatfec+ZUziPHkHSaXAuEck3Cdkf3eRpQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.18.9", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" + }, + "dependencies": { + "@babel/template": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", + "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.6", + "@babel/types": "^7.18.6" + } + } + } + }, + "@babel/helpers": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz", + "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==", + "dev": true, + "requires": { + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" + }, + "dependencies": { + "@babel/template": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", + "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.6", + "@babel/types": "^7.18.6" + } + } + } + }, + "@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.9.tgz", + "integrity": "sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg==", + "dev": true + }, + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", + "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz", + "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", + "@babel/plugin-proposal-optional-chaining": "^7.18.9" + } + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz", + "integrity": "sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-remap-async-to-generator": "^7.16.8", + "@babel/plugin-syntax-async-generators": "^7.8.4" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-proposal-class-static-block": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz", + "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", + "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + } + }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", + "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", + "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-json-strings": "^7.8.3" + } + }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz", + "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz", + "integrity": "sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.18.8", + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.18.8" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", + "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz", + "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz", + "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "dependencies": { + "@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + } + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@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-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-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-transform-arrow-functions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz", + "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz", + "integrity": "sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-remap-async-to-generator": "^7.16.8" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", + "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz", + "integrity": "sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.9.tgz", + "integrity": "sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-split-export-declaration": "^7.18.6", + "globals": "^11.1.0" + }, + "dependencies": { + "@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + } + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz", + "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.9.tgz", + "integrity": "sha512-p5VCYNddPLkZTq4XymQIaIfZNJwT9YsjkPOhkVEqt6QIpQFZVM9IltqqYpOEkJoN1DPznmxUDyZ5CTZs/ZCuHA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", + "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", + "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", + "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", + "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", + "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", + "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", + "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.6.tgz", + "integrity": "sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz", + "integrity": "sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-simple-access": "^7.18.6", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.9.tgz", + "integrity": "sha512-zY/VSIbbqtoRoJKo2cDTewL364jSlZGvn0LKOf9ntbfxOvjfmyrdtEEOAdswOswhZEb8UH3jDkCKHd1sPgsS0A==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-module-transforms": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-validator-identifier": "^7.18.6", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", + "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz", + "integrity": "sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", + "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", + "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz", + "integrity": "sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", + "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz", + "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "regenerator-transform": "^0.15.0" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", + "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.17.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.17.10.tgz", + "integrity": "sha512-6jrMilUAJhktTr56kACL8LnWC5hx3Lf27BS0R0DSyW/OoJfb/iTHeE96V3b1dgKG3FSFdd/0culnYWMkjcKCig==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.5.0", + "babel-plugin-polyfill-regenerator": "^0.3.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/plugin-transform-shorthand-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", + "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.9.tgz", + "integrity": "sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", + "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", + "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", + "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.6.tgz", + "integrity": "sha512-XNRwQUXYMP7VLuy54cr/KS/WeL3AZeORhrmeZ7iewgu+X2eBqmpaLI/hzqr9ZxCeUoq0ASK4GUzSM0BDhZkLFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", + "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/preset-env": { + "version": "7.17.10", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.17.10.tgz", + "integrity": "sha512-YNgyBHZQpeoBSRBg0xixsZzfT58Ze1iZrajvv0lJc70qDDGuGfonEnMGfWeSY0mQ3JTuCWFbMkzFRVafOyJx4g==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.17.10", + "@babel/helper-compilation-targets": "^7.17.10", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-option": "^7.16.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7", + "@babel/plugin-proposal-async-generator-functions": "^7.16.8", + "@babel/plugin-proposal-class-properties": "^7.16.7", + "@babel/plugin-proposal-class-static-block": "^7.17.6", + "@babel/plugin-proposal-dynamic-import": "^7.16.7", + "@babel/plugin-proposal-export-namespace-from": "^7.16.7", + "@babel/plugin-proposal-json-strings": "^7.16.7", + "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7", + "@babel/plugin-proposal-numeric-separator": "^7.16.7", + "@babel/plugin-proposal-object-rest-spread": "^7.17.3", + "@babel/plugin-proposal-optional-catch-binding": "^7.16.7", + "@babel/plugin-proposal-optional-chaining": "^7.16.7", + "@babel/plugin-proposal-private-methods": "^7.16.11", + "@babel/plugin-proposal-private-property-in-object": "^7.16.7", + "@babel/plugin-proposal-unicode-property-regex": "^7.16.7", + "@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.16.7", + "@babel/plugin-transform-async-to-generator": "^7.16.8", + "@babel/plugin-transform-block-scoped-functions": "^7.16.7", + "@babel/plugin-transform-block-scoping": "^7.16.7", + "@babel/plugin-transform-classes": "^7.16.7", + "@babel/plugin-transform-computed-properties": "^7.16.7", + "@babel/plugin-transform-destructuring": "^7.17.7", + "@babel/plugin-transform-dotall-regex": "^7.16.7", + "@babel/plugin-transform-duplicate-keys": "^7.16.7", + "@babel/plugin-transform-exponentiation-operator": "^7.16.7", + "@babel/plugin-transform-for-of": "^7.16.7", + "@babel/plugin-transform-function-name": "^7.16.7", + "@babel/plugin-transform-literals": "^7.16.7", + "@babel/plugin-transform-member-expression-literals": "^7.16.7", + "@babel/plugin-transform-modules-amd": "^7.16.7", + "@babel/plugin-transform-modules-commonjs": "^7.17.9", + "@babel/plugin-transform-modules-systemjs": "^7.17.8", + "@babel/plugin-transform-modules-umd": "^7.16.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.17.10", + "@babel/plugin-transform-new-target": "^7.16.7", + "@babel/plugin-transform-object-super": "^7.16.7", + "@babel/plugin-transform-parameters": "^7.16.7", + "@babel/plugin-transform-property-literals": "^7.16.7", + "@babel/plugin-transform-regenerator": "^7.17.9", + "@babel/plugin-transform-reserved-words": "^7.16.7", + "@babel/plugin-transform-shorthand-properties": "^7.16.7", + "@babel/plugin-transform-spread": "^7.16.7", + "@babel/plugin-transform-sticky-regex": "^7.16.7", + "@babel/plugin-transform-template-literals": "^7.16.7", + "@babel/plugin-transform-typeof-symbol": "^7.16.7", + "@babel/plugin-transform-unicode-escapes": "^7.16.7", + "@babel/plugin-transform-unicode-regex": "^7.16.7", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.17.10", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.5.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "core-js-compat": "^3.22.1", + "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.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "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.17.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.9.tgz", + "integrity": "sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/traverse": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.9.tgz", + "integrity": "sha512-LcPAnujXGwBgv3/WHv01pHtb2tihcyW1XuL9wd7jqh1Z8AQkTd+QVjMrMijrln0T7ED3UXLIy36P9Ao7W75rYg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.9", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.18.9", + "@babel/types": "^7.18.9", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "dependencies": { + "@babel/generator": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.9.tgz", + "integrity": "sha512-wt5Naw6lJrL1/SGkipMiFxJjtyczUWTP38deiP1PO60HsBjDeKk08CGC3S8iVuvf0FmTdgKwU1KIXzSKL1G0Ug==", + "dev": true, + "requires": { + "@babel/types": "^7.18.9", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + } + }, + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } + } + }, + "@babel/types": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz", + "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "to-fast-properties": "^2.0.0" + } + }, + "@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true + }, + "@csstools/postcss-color-function": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz", + "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==", + "dev": true, + "requires": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-font-format-keywords": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz", + "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-hwb-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz", + "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-ic-unit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz", + "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==", + "dev": true, + "requires": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-is-pseudo-class": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz", + "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==", + "dev": true, + "requires": { + "@csstools/selector-specificity": "^2.0.0", + "postcss-selector-parser": "^6.0.10" + } + }, + "@csstools/postcss-normalize-display-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz", + "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-oklab-function": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz", + "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==", + "dev": true, + "requires": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-progressive-custom-properties": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", + "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-stepped-value-functions": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz", + "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-unset-value": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz", + "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==", + "dev": true, + "requires": {} + }, + "@csstools/selector-specificity": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.0.2.tgz", + "integrity": "sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==", + "dev": true, + "requires": {} + }, + "@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true + }, + "@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "dev": true + }, + "@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" + } + }, + "@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 + }, + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", + "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@kolkov/angular-editor": { + "version": "3.0.0-beta.0", + "resolved": "https://registry.npmjs.org/@kolkov/angular-editor/-/angular-editor-3.0.0-beta.0.tgz", + "integrity": "sha512-uUa8FW9lFskfL8rans7YRtUQIVK1Qj8bBT9q1MwPXFZ1t+/KfPk62FL5IuMfcnu28UfKl0J2AnGYwbQe4h+Etw==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", + "dev": true + }, + "@ngtools/webpack": { + "version": "14.0.6", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-14.0.6.tgz", + "integrity": "sha512-mSmLqzRKxQgGiOhvJ8guvRLjXoTL17cVSWlL/Cz+Q3xc1bXa7537ZXBTQTEuZVU2ytdkniKc8l1HqXIx0pFNVQ==", + "dev": true, + "requires": {} + }, + "@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.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@npmcli/fs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.0.tgz", + "integrity": "sha512-DmfBvNXGaetMxj9LTp8NAN9vEidXURrf5ZTslQzEAi/6GbW+4yjaLFQc6Tue5cpZ9Frlk4OBo/Snf1Bh/S7qTQ==", + "dev": true, + "requires": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + } + }, + "@npmcli/git": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-3.0.1.tgz", + "integrity": "sha512-UU85F/T+F1oVn3IsB/L6k9zXIMpXBuUBE25QDH0SsURwT6IOBqkC7M16uqo2vVZIyji3X1K4XH9luip7YekH1A==", + "dev": true, + "requires": { + "@npmcli/promise-spawn": "^3.0.0", + "lru-cache": "^7.4.4", + "mkdirp": "^1.0.4", + "npm-pick-manifest": "^7.0.0", + "proc-log": "^2.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^2.0.2" + }, + "dependencies": { + "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" + } + } + } + }, + "@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/move-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.0.tgz", + "integrity": "sha512-UR6D5f4KEGWJV6BGPH3Qb2EtgH+t+1XQ1Tt85c7qicN6cezzuHPdZwwAxqZr4JLtnQu0LZsTza/5gmNmSl8XLg==", + "dev": true, + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + } + }, + "@npmcli/node-gyp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-2.0.0.tgz", + "integrity": "sha512-doNI35wIe3bBaEgrlPfdJPaCpUR89pJWep4Hq3aRdh6gKazIVWfs0jHttvSSoq47ZXgC7h73kDsUl8AoIQUB+A==", + "dev": true + }, + "@npmcli/promise-spawn": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-3.0.0.tgz", + "integrity": "sha512-s9SgS+p3a9Eohe68cSI3fi+hpcZUmXq5P7w0kMlAsWVtR7XbK3ptkZqKT2cK1zLDObJ3sR+8P59sJE0w/KTL1g==", + "dev": true, + "requires": { + "infer-owner": "^1.0.4" + } + }, + "@npmcli/run-script": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-3.0.3.tgz", + "integrity": "sha512-ZXL6qgC5NjwfZJ2nET+ZSLEz/PJgJ/5CU90C2S66dZY4Jw73DasS4ZCXuy/KHWYP0imjJ4VtA+Gebb5BxxKp9Q==", + "dev": true, + "requires": { + "@npmcli/node-gyp": "^2.0.0", + "@npmcli/promise-spawn": "^3.0.0", + "node-gyp": "^8.4.1", + "read-package-json-fast": "^2.0.3" + } + }, + "@popperjs/core": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.5.tgz", + "integrity": "sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw==", + "peer": true + }, + "@schematics/angular": { + "version": "14.0.6", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-14.0.6.tgz", + "integrity": "sha512-vc4N6AXANMHUfcj5hOIDwBj4HQUrVSs03ksnznJGt2gkg2ClzJkK5Vg4/QA6lJ09VWSVZCuZ2Kkaua4bsTf6AA==", + "dev": true, + "requires": { + "@angular-devkit/core": "14.0.6", + "@angular-devkit/schematics": "14.0.6", + "jsonc-parser": "3.0.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 + }, + "@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/bonjour": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/component-emitter": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz", + "integrity": "sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ==", + "dev": true + }, + "@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/connect-history-api-fallback": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", + "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", + "dev": true, + "requires": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "dev": true + }, + "@types/cors": { + "version": "2.8.12", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", + "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", + "dev": true + }, + "@types/eslint": { + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.5.tgz", + "integrity": "sha512-dhsC09y1gpJWnK+Ff4SGvCuSnk9DaU0BJZSzOwa6GVSg65XtTugLBITDAAzRU5duGBoXBHpdR/9jHGxJjNflJQ==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "dev": true, + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "dev": true + }, + "@types/express": { + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", + "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "dev": true, + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.29", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.29.tgz", + "integrity": "sha512-uMd++6dMKS32EOuw1Uli3e3BPgdLIXmezcfHv7N4c1s3gkhikBplORPpMq3fuWkxncZN1reb16d5n8yhQ80x7Q==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "@types/http-proxy": { + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", + "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/jasmine": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-4.0.3.tgz", + "integrity": "sha512-Opp1LvvEuZdk8fSSvchK2mZwhVrsNT0JgJE9Di6MjnaIpmEXM8TLCPPrVtNTYh8+5MPdY8j9bAHMu2SSfwpZJg==", + "dev": true + }, + "@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, + "@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, + "@types/node": { + "version": "18.0.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.6.tgz", + "integrity": "sha512-/xUq6H2aQm261exT6iZTMifUySEt4GR5KX8eYyY+C4MSNPqSh9oNIP7tz2GLKTlFaiBbgZNxffoR3CVRG+cljw==", + "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/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true + }, + "@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "dev": true, + "requires": { + "@types/express": "*" + } + }, + "@types/serve-static": { + "version": "1.13.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", + "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", + "dev": true, + "requires": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "@types/sockjs": { + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/ws": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", + "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@webassemblyjs/ast": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "dev": true, + "requires": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "dev": true + }, + "@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "dev": true, + "requires": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@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.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "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.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "acorn": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", + "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", + "dev": true + }, + "acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "dev": true, + "requires": {} + }, + "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" + }, + "dependencies": { + "loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + } + } + }, + "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.2.1", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", + "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + }, + "dependencies": { + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true + } + } + }, + "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.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "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.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "requires": { + "ajv": "^8.0.0" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "angular-font-awesome": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/angular-font-awesome/-/angular-font-awesome-3.1.2.tgz", + "integrity": "sha512-fgNL2jdhBmapaCS9MrcI33LyoYHH4WL9gIL59y334wBnKDZB6JgDRiImbCoNchEm1wFBbVwr9b7cWuQkV0dwEg==", + "requires": {} + }, + "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-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "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": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true + }, + "are-we-there-yet": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz", + "integrity": "sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + } + }, + "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" + } + }, + "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": "3.0.1", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz", + "integrity": "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==", + "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 + }, + "autoprefixer": { + "version": "10.4.7", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.7.tgz", + "integrity": "sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA==", + "dev": true, + "requires": { + "browserslist": "^4.20.3", + "caniuse-lite": "^1.0.30001335", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + } + }, + "babel-loader": { + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz", + "integrity": "sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==", + "dev": true, + "requires": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^2.0.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "dependencies": { + "loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + } + } + }, + "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.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + } + }, + "babel-plugin-polyfill-corejs2": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", + "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.3.1", + "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.5.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", + "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.3.1", + "core-js-compat": "^3.21.0" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", + "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.3.1" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "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": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "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 + }, + "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 + }, + "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" + } + }, + "body-parser": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", + "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.10.3", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "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": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "bonjour-service": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.13.tgz", + "integrity": "sha512-LWKRU/7EqDUC9CTAQtuZl5HzBALoCYwtLhffW3et7vZMwv3bWLpJf8bRYlMD5OCcDpTfnPgNCV4yo9ZIaJGMiA==", + "dev": true, + "requires": { + "array-flatten": "^2.1.2", + "dns-equal": "^1.0.0", + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "bootstrap": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.1.3.tgz", + "integrity": "sha512-fcQztozJ8jToQWXxVuEyXWW+dSo8AiXWKwiSSrKWsRB/Qt+Ewwza+JWoLKiTuQLaEPhdNAJ7+Dosc9DOIqNy7Q==", + "requires": {} + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "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" + } + }, + "browserslist": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.2.tgz", + "integrity": "sha512-MonuOgAtUB46uP5CezYbRaYKBNt2LxP0yX+Pmj4LkcDFGkn9Cbpi83d9sCjwQDErXsIJSzY5oKGDbgOlF/LPAA==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001366", + "electron-to-chromium": "^1.4.188", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.4" + } + }, + "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" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "builtins": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "dev": true, + "requires": { + "semver": "^7.0.0" + } + }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true + }, + "cacache": { + "version": "16.0.7", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.0.7.tgz", + "integrity": "sha512-a4zfQpp5vm4Ipdvbj+ZrPonikRhm6WBEd4zT1Yc1DXsmAxrPgDwWBLF/u/wTVXSFPIgOJ1U3ghSa2Xm4s3h28w==", + "dev": true, + "requires": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^1.1.1" + } + }, + "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-lite": { + "version": "1.0.30001367", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001367.tgz", + "integrity": "sha512-XDgbeOHfifWV3GEES2B8rtsrADx4Jf+juKX2SICJcaUhjYBO3bR96kvEIHa15VU6ohtOhBZuPGGYGbXMRn0NCw==", + "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==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "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 + }, + "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.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", + "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", + "dev": true + }, + "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==", + "dev": true, + "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": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "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" + } + }, + "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==", + "dev": true, + "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": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true + }, + "colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "dev": true + }, + "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 + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "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 + }, + "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": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "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": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "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": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "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": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true + }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "requires": { + "safe-buffer": "5.2.1" + }, + "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 + } + } + }, + "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==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "copy-anything": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", + "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", + "dev": true, + "requires": { + "is-what": "^3.14.1" + } + }, + "copy-webpack-plugin": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-10.2.4.tgz", + "integrity": "sha512-xFVltahqlsRcyyJqQbDY6EYTtyQZF9rf+JPjwHObLdPFMEISqkFkr7mFoVOC6BfYS/dNThyoQKvziugm+OnwBg==", + "dev": true, + "requires": { + "fast-glob": "^3.2.7", + "glob-parent": "^6.0.1", + "globby": "^12.0.2", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "dependencies": { + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + } + } + }, + "core-js-compat": { + "version": "3.23.5", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.23.5.tgz", + "integrity": "sha512-fHYozIFIxd+91IIbXJgWd/igXIc8Mf9is0fusswjnGIWVG96y2cwyUdlCkGOw6rMLHKAxg7xtCIVaHsyOUnJIg==", + "dev": true, + "requires": { + "browserslist": "^4.21.2", + "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.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "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" + } + }, + "critters": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.16.tgz", + "integrity": "sha512-JwjgmO6i3y6RWtLYmXwO5jMd+maZt8Tnfu7VVISmEWyQqfLpB8soBswf8/2bu6SBXxtKA68Al3c+qIG1ApT68A==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "css-select": "^4.2.0", + "parse5": "^6.0.1", + "parse5-htmlparser2-tree-adapter": "^6.0.1", + "postcss": "^8.3.7", + "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.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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" + }, + "dependencies": { + "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" + } + } + } + }, + "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": "3.0.3", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", + "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.9" + } + }, + "css-has-pseudo": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", + "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.9" + } + }, + "css-loader": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz", + "integrity": "sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==", + "dev": true, + "requires": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.7", + "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.2.0", + "semver": "^7.3.5" + } + }, + "css-prefers-color-scheme": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", + "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", + "dev": true, + "requires": {} + }, + "css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + } + }, + "css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true + }, + "cssdb": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-6.6.3.tgz", + "integrity": "sha512-7GDvDSmE+20+WcSMhP17Q1EVWUrLlbxxpMDqG731n8P99JhnQZHR9YvtjPvEHfjFUjvQJvdpKCjlKOX+xe4UVA==", + "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 + }, + "custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", + "dev": true + }, + "date-format": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.11.tgz", + "integrity": "sha512-VS20KRyorrbMCQmpdl2hg5KaOUsda1RbnsJg461FfrcyCUg+pkd0b40BSW4niQyTheww4DBXQnS7HwSrKkipLw==", + "dev": true + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==", + "dev": true + }, + "default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dev": true, + "requires": { + "execa": "^5.0.0" + } + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==", + "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.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true + }, + "dependency-graph": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", + "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", + "dev": true + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "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 + }, + "di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", + "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" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", + "dev": true + }, + "dns-packet": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", + "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", + "dev": true, + "requires": { + "@leichtgewicht/ip-codec": "^2.0.1" + } + }, + "dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==", + "dev": true, + "requires": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true + }, + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.4.194", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.194.tgz", + "integrity": "sha512-ola5UH0xAP1oYY0FFUsPvwtucEzCQHucXnT7PQ1zjHJMccZhCDktEugI++JUR3YuIs7Ff7afz+OVEhVAIMhLAQ==", + "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==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "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" + } + } + } + }, + "engine.io": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.0.tgz", + "integrity": "sha512-4KzwW3F3bk+KlzSOY57fj/Jx6LyRQ1nbcyIadehl+AnXjKT7gDO0ORdRi/84ixvMKTym6ZKuxvbzN62HDDU1Lg==", + "dev": true, + "requires": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.3", + "ws": "~8.2.3" + } + }, + "engine.io-parser": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz", + "integrity": "sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg==", + "dev": true + }, + "enhanced-resolve": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", + "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==", + "dev": true + }, + "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, + "optional": true, + "requires": { + "prr": "~1.0.1" + } + }, + "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.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "dev": true + }, + "esbuild": { + "version": "0.14.38", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.38.tgz", + "integrity": "sha512-12fzJ0fsm7gVZX1YQ1InkOE5f9Tl7cgf6JPYXRJtPIoE0zkWAbHdPHVPPaLi9tYAcEBqheGzqLn/3RdTOyBfcA==", + "dev": true, + "optional": true, + "requires": { + "esbuild-android-64": "0.14.38", + "esbuild-android-arm64": "0.14.38", + "esbuild-darwin-64": "0.14.38", + "esbuild-darwin-arm64": "0.14.38", + "esbuild-freebsd-64": "0.14.38", + "esbuild-freebsd-arm64": "0.14.38", + "esbuild-linux-32": "0.14.38", + "esbuild-linux-64": "0.14.38", + "esbuild-linux-arm": "0.14.38", + "esbuild-linux-arm64": "0.14.38", + "esbuild-linux-mips64le": "0.14.38", + "esbuild-linux-ppc64le": "0.14.38", + "esbuild-linux-riscv64": "0.14.38", + "esbuild-linux-s390x": "0.14.38", + "esbuild-netbsd-64": "0.14.38", + "esbuild-openbsd-64": "0.14.38", + "esbuild-sunos-64": "0.14.38", + "esbuild-windows-32": "0.14.38", + "esbuild-windows-64": "0.14.38", + "esbuild-windows-arm64": "0.14.38" + } + }, + "esbuild-android-64": { + "version": "0.14.38", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.38.tgz", + "integrity": "sha512-aRFxR3scRKkbmNuGAK+Gee3+yFxkTJO/cx83Dkyzo4CnQl/2zVSurtG6+G86EQIZ+w+VYngVyK7P3HyTBKu3nw==", + "dev": true, + "optional": true + }, + "esbuild-android-arm64": { + "version": "0.14.38", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.38.tgz", + "integrity": "sha512-L2NgQRWuHFI89IIZIlpAcINy9FvBk6xFVZ7xGdOwIm8VyhX1vNCEqUJO3DPSSy945Gzdg98cxtNt8Grv1CsyhA==", + "dev": true, + "optional": true + }, + "esbuild-darwin-64": { + "version": "0.14.38", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.38.tgz", + "integrity": "sha512-5JJvgXkX87Pd1Og0u/NJuO7TSqAikAcQQ74gyJ87bqWRVeouky84ICoV4sN6VV53aTW+NE87qLdGY4QA2S7KNA==", + "dev": true, + "optional": true + }, + "esbuild-darwin-arm64": { + "version": "0.14.38", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.38.tgz", + "integrity": "sha512-eqF+OejMI3mC5Dlo9Kdq/Ilbki9sQBw3QlHW3wjLmsLh+quNfHmGMp3Ly1eWm981iGBMdbtSS9+LRvR2T8B3eQ==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-64": { + "version": "0.14.38", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.38.tgz", + "integrity": "sha512-epnPbhZUt93xV5cgeY36ZxPXDsQeO55DppzsIgWM8vgiG/Rz+qYDLmh5ts3e+Ln1wA9dQ+nZmVHw+RjaW3I5Ig==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-arm64": { + "version": "0.14.38", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.38.tgz", + "integrity": "sha512-/9icXUYJWherhk+y5fjPI5yNUdFPtXHQlwP7/K/zg8t8lQdHVj20SqU9/udQmeUo5pDFHMYzcEFfJqgOVeKNNQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-32": { + "version": "0.14.38", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.38.tgz", + "integrity": "sha512-QfgfeNHRFvr2XeHFzP8kOZVnal3QvST3A0cgq32ZrHjSMFTdgXhMhmWdKzRXP/PKcfv3e2OW9tT9PpcjNvaq6g==", + "dev": true, + "optional": true + }, + "esbuild-linux-64": { + "version": "0.14.38", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.38.tgz", + "integrity": "sha512-uuZHNmqcs+Bj1qiW9k/HZU3FtIHmYiuxZ/6Aa+/KHb/pFKr7R3aVqvxlAudYI9Fw3St0VCPfv7QBpUITSmBR1Q==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm": { + "version": "0.14.38", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.38.tgz", + "integrity": "sha512-FiFvQe8J3VKTDXG01JbvoVRXQ0x6UZwyrU4IaLBZeq39Bsbatd94Fuc3F1RGqPF5RbIWW7RvkVQjn79ejzysnA==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm64": { + "version": "0.14.38", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.38.tgz", + "integrity": "sha512-HlMGZTEsBrXrivr64eZ/EO0NQM8H8DuSENRok9d+Jtvq8hOLzrxfsAT9U94K3KOGk2XgCmkaI2KD8hX7F97lvA==", + "dev": true, + "optional": true + }, + "esbuild-linux-mips64le": { + "version": "0.14.38", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.38.tgz", + "integrity": "sha512-qd1dLf2v7QBiI5wwfil9j0HG/5YMFBAmMVmdeokbNAMbcg49p25t6IlJFXAeLzogv1AvgaXRXvgFNhScYEUXGQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-ppc64le": { + "version": "0.14.38", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.38.tgz", + "integrity": "sha512-mnbEm7o69gTl60jSuK+nn+pRsRHGtDPfzhrqEUXyCl7CTOCLtWN2bhK8bgsdp6J/2NyS/wHBjs1x8aBWwP2X9Q==", + "dev": true, + "optional": true + }, + "esbuild-linux-riscv64": { + "version": "0.14.38", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.38.tgz", + "integrity": "sha512-+p6YKYbuV72uikChRk14FSyNJZ4WfYkffj6Af0/Tw63/6TJX6TnIKE+6D3xtEc7DeDth1fjUOEqm+ApKFXbbVQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-s390x": { + "version": "0.14.38", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.38.tgz", + "integrity": "sha512-0zUsiDkGJiMHxBQ7JDU8jbaanUY975CdOW1YDrurjrM0vWHfjv9tLQsW9GSyEb/heSK1L5gaweRjzfUVBFoybQ==", + "dev": true, + "optional": true + }, + "esbuild-netbsd-64": { + "version": "0.14.38", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.38.tgz", + "integrity": "sha512-cljBAApVwkpnJZfnRVThpRBGzCi+a+V9Ofb1fVkKhtrPLDYlHLrSYGtmnoTVWDQdU516qYI8+wOgcGZ4XIZh0Q==", + "dev": true, + "optional": true + }, + "esbuild-openbsd-64": { + "version": "0.14.38", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.38.tgz", + "integrity": "sha512-CDswYr2PWPGEPpLDUO50mL3WO/07EMjnZDNKpmaxUPsrW+kVM3LoAqr/CE8UbzugpEiflYqJsGPLirThRB18IQ==", + "dev": true, + "optional": true + }, + "esbuild-sunos-64": { + "version": "0.14.38", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.38.tgz", + "integrity": "sha512-2mfIoYW58gKcC3bck0j7lD3RZkqYA7MmujFYmSn9l6TiIcAMpuEvqksO+ntBgbLep/eyjpgdplF7b+4T9VJGOA==", + "dev": true, + "optional": true + }, + "esbuild-wasm": { + "version": "0.14.38", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.14.38.tgz", + "integrity": "sha512-mObTw5/3+KIOTShVgk3fuEn+INnHgOSbWJuGkInEZTWpUOh/+TCSgRxl5cDon4OkoaLU5rWm7R7Dkl/mJv8SGw==", + "dev": true + }, + "esbuild-windows-32": { + "version": "0.14.38", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.38.tgz", + "integrity": "sha512-L2BmEeFZATAvU+FJzJiRLFUP+d9RHN+QXpgaOrs2klshoAm1AE6Us4X6fS9k33Uy5SzScn2TpcgecbqJza1Hjw==", + "dev": true, + "optional": true + }, + "esbuild-windows-64": { + "version": "0.14.38", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.38.tgz", + "integrity": "sha512-Khy4wVmebnzue8aeSXLC+6clo/hRYeNIm0DyikoEqX+3w3rcvrhzpoix0S+MF9vzh6JFskkIGD7Zx47ODJNyCw==", + "dev": true, + "optional": true + }, + "esbuild-windows-arm64": { + "version": "0.14.38", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.38.tgz", + "integrity": "sha512-k3FGCNmHBkqdJXuJszdWciAH77PukEyDsdIryEHn9cKLQFxzhT39dSumeTuggaQcXY57UlmLGIkklWZo2qzHpw==", + "dev": true, + "optional": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "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" + } + }, + "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 + }, + "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.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "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": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true + }, + "eventemitter-asyncresource": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eventemitter-asyncresource/-/eventemitter-asyncresource-1.0.0.tgz", + "integrity": "sha512-39F7TBIV0G7gTelxwbEqnwhp90eqCPON1k0NwNfwhgKn4Co4ybUbj2pECcXT0B3ztRKZ7Pw1JujUUgmQJHcVAQ==", + "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": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true + }, + "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" + } + }, + "express": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", + "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", + "dev": true, + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.0", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.10.3", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "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": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "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.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "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 + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "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 + }, + "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" + } + }, + "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.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "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 + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "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==", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "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" + } + }, + "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.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" + }, + "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": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + } + } + }, + "find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "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" + } + }, + "flatted": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz", + "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==", + "dev": true + }, + "follow-redirects": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", + "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", + "dev": true + }, + "font-awesome": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz", + "integrity": "sha512-U6kGnykA/6bFmg1M/oT9EkFeIYv7JlX3bozwQJWiiLz6L0w3F5vBVPxHlwyX/vtNq1ckcpRKOB9f2Qal/VtFpg==", + "peer": true + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true + }, + "fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "dev": true + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true + }, + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.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": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "dev": true, + "requires": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + } + }, + "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==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", + "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "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 + }, + "glob": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.1.tgz", + "integrity": "sha512-cF7FYZZ47YzmCu7dDy50xSRRfO3ErRfrXuLZcNIuyiJEco0XSrGtuilG19L5xp3NcwTx7Gn+X6Tv3fmsUPTbow==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "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==", + "dev": true + }, + "globby": { + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-12.2.0.tgz", + "integrity": "sha512-wiSuFQLZ+urS9x2gGPl1H5drc5twabmm4m2gTR27XDFyjUHJUNsS8o/2aKyIF6IoBaR630atdher0XJ5g6OMmA==", + "dev": true, + "requires": { + "array-union": "^3.0.1", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.7", + "ignore": "^5.1.9", + "merge2": "^1.4.1", + "slash": "^4.0.0" + } + }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "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 + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true + }, + "hdr-histogram-js": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hdr-histogram-js/-/hdr-histogram-js-2.0.3.tgz", + "integrity": "sha512-Hkn78wwzWHNCp2uarhzQ2SGFLU3JY8SBDDd3TAABK4fc30wm+MuPOrg5QVFVfkKOQd6Bfz3ukJEI+q9sXEkK1g==", + "dev": true, + "requires": { + "@assemblyscript/loader": "^0.10.1", + "base64-js": "^1.2.0", + "pako": "^1.0.3" + } + }, + "hdr-histogram-percentiles-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hdr-histogram-percentiles-obj/-/hdr-histogram-percentiles-obj-3.0.0.tgz", + "integrity": "sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw==", + "dev": true + }, + "hosted-git-info": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.0.0.tgz", + "integrity": "sha512-rRnjWu0Bxj+nIfUOkz0695C0H6tRrN5iYIzYejb0tDEefe2AekHu/U5Kn9pEie5vsJqpNQU02az7TGSH3qpz4Q==", + "dev": true, + "requires": { + "lru-cache": "^7.5.1" + } + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "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" + } + } + } + }, + "html-entities": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", + "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", + "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-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": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "dependencies": { + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true + } + } + }, + "http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true + }, + "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": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dev": true, + "requires": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + } + }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "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": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dev": true, + "requires": { + "ms": "^2.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, + "requires": {} + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true + }, + "ignore-walk": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-5.0.1.tgz", + "integrity": "sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==", + "dev": true, + "requires": { + "minimatch": "^5.0.1" + } + }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "dev": true, + "optional": true + }, + "immutable": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", + "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==", + "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" + }, + "dependencies": { + "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 + } + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "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 + }, + "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": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "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==", + "dev": true + }, + "ini": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-3.0.0.tgz", + "integrity": "sha512-TxYQaeNW/N8ymDvwAxPyRbhMBtnEwuvaTYpOQkFx1nSeusgezHniEc/l35Vo4iCq/mMiTJbpD7oYxN98hFlfmw==", + "dev": true + }, + "inquirer": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", + "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", + "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.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^7.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.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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" + } + } + } + }, + "ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", + "dev": true + }, + "ipaddr.js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "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-core-module": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "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-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "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==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "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": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "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-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "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-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "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-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-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": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz", + "integrity": "sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==", + "dev": true, + "requires": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.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.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "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.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jasmine-core": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.1.1.tgz", + "integrity": "sha512-lmUfT5XcK9KKvt3lLYzn93hc4MGzlUBowExFVgzbSW0ZCrdeyS574dfsyfRhxbg81Wj4gk+RxUiTnj7KBfDA1g==", + "dev": true + }, + "jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "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" + } + } + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "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" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "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-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 + }, + "json5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "dev": true + }, + "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": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true + }, + "karma": { + "version": "6.3.20", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.20.tgz", + "integrity": "sha512-HRNQhMuKOwKpjYlWiJP0DUrJOh+QjaI/DTaD8b9rEm4Il3tJ8MijutVZH4ts10LuUFst/CedwTS6vieCN8yTSw==", + "dev": true, + "requires": { + "@colors/colors": "1.5.0", + "body-parser": "^1.19.0", + "braces": "^3.0.2", + "chokidar": "^3.5.1", + "connect": "^3.7.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.1", + "glob": "^7.1.7", + "graceful-fs": "^4.2.6", + "http-proxy": "^1.18.1", + "isbinaryfile": "^4.0.8", + "lodash": "^4.17.21", + "log4js": "^6.4.1", + "mime": "^2.5.2", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.5", + "qjobs": "^1.2.0", + "range-parser": "^1.2.1", + "rimraf": "^3.0.2", + "socket.io": "^4.4.1", + "source-map": "^0.6.1", + "tmp": "^0.2.1", + "ua-parser-js": "^0.7.30", + "yargs": "^16.1.1" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "requires": { + "minimist": "^1.2.6" + } + }, + "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 + }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "requires": { + "rimraf": "^3.0.0" + } + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "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==", + "dev": true + } + } + }, + "karma-chrome-launcher": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.1.tgz", + "integrity": "sha512-hsIglcq1vtboGPAN+DGCISCFOxW+ZVnIqhDQcCMqqCp+4dmJ0Qpq5QAjkbA0X2L9Mi6OBkHi2Srrbmm7pUKkzQ==", + "dev": true, + "requires": { + "which": "^1.2.1" + } + }, + "karma-coverage": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.2.0.tgz", + "integrity": "sha512-gPVdoZBNDZ08UCzdMHHhEImKrw1+PAOQOIiffv1YsvxFhBjqvo/SVXNk4tqn1SYqX0BJZT6S/59zgxiBe+9OuA==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.1", + "istanbul-reports": "^3.0.5", + "minimatch": "^3.0.4" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "karma-jasmine": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-5.0.1.tgz", + "integrity": "sha512-FkL1Kk+JAKmim8VWU8RXKZBpl0lLI7J8LijM0/q7oP7emfB6QMZV1Az+JgqGKSLpF0tYaav+KUVFQroZUxQTHA==", + "dev": true, + "requires": { + "jasmine-core": "^4.1.0" + } + }, + "karma-jasmine-html-reporter": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.7.0.tgz", + "integrity": "sha512-pzum1TL7j90DTE86eFt48/s12hqwQuiD+e5aXx2Dc9wDEn2LfGq6RoAxEZZjFiN0RDSCOnosEKRZWxbQ+iMpQQ==", + "dev": true, + "requires": {} + }, + "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" + } + }, + "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 + }, + "klona": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", + "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", + "dev": true + }, + "less": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/less/-/less-4.1.2.tgz", + "integrity": "sha512-EoQp/Et7OSOVu0aJknJOtlXZsnr8XE8KwuzTHOLeVSEx8pVWUICc8Q0VYRHgzyjX78nMEyC/oztWFbgyhtNfDA==", + "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": "^2.3.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" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "optional": true + }, + "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 + } + } + }, + "less-loader": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-10.2.0.tgz", + "integrity": "sha512-AV5KHWvCezW27GT90WATaDnfXBv99llDbtaj4bshq6DvAihMdNjaPDcUMa6EXKLRF+P2opFenJp89BXg91XLYg==", + "dev": true, + "requires": { + "klona": "^2.0.4" + } + }, + "license-webpack-plugin": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", + "integrity": "sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==", + "dev": true, + "requires": { + "webpack-sources": "^3.0.0" + } + }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true + }, + "loader-utils": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.0.tgz", + "integrity": "sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ==", + "dev": true + }, + "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" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "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.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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" + } + } + } + }, + "log4js": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.6.0.tgz", + "integrity": "sha512-3v8R7fd45UB6THucSht6wN2/7AZEruQbXdjygPZcxt5TA/msO6si9CN5MefUuKXbYnJHTBnYcx4famwcyQd+sA==", + "dev": true, + "requires": { + "date-format": "^4.0.11", + "debug": "^4.3.4", + "flatted": "^3.2.5", + "rfdc": "^1.3.0", + "streamroller": "^3.1.1" + } + }, + "lru-cache": { + "version": "7.13.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.13.1.tgz", + "integrity": "sha512-CHqbAq7NFlW3RSnoWXLJBxCWaZVBrfa9UEHId2M3AW8iEBurbqduNexEUCGc3SHc6iCYXNJCDi903LajSVAEPQ==", + "dev": true + }, + "magic-string": { + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.1.tgz", + "integrity": "sha512-ndThHmvgtieXe8J/VGPjG+Apu7v7ItcD5mhEIvOscWjPF/ccOiLxHaSuCAS2G+3x4GKsAbT8u7zdyamupui8Tg==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.8" + } + }, + "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-fetch-happen": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", + "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "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": "^6.0.0", + "ssri": "^8.0.0" + }, + "dependencies": { + "@npmcli/fs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "dev": true, + "requires": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "@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" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "dev": true, + "requires": { + "@npmcli/fs": "^1.0.0", + "@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" + } + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "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" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "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" + } + } + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true + }, + "memfs": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.7.tgz", + "integrity": "sha512-ygaiUSNalBX85388uskeCyhSAoOSgzBbtVCr9jA2RROssFL9Q19/ZXFqS+2Th2sr1ewNIWgFdLzLC3Yl1Zv+lw==", + "dev": true, + "requires": { + "fs-monkey": "^1.0.3" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "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": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "requires": { + "mime-db": "1.52.0" + } + }, + "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 + }, + "mini-css-extract-plugin": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.0.tgz", + "integrity": "sha512-ndG8nxCEnAemsg4FSgS+yNyHKgkTB4nPKqCOgh65j3/30qqC5RaSQQXMm++Y6sb6E1zRSxPkztj9fqxhS1Eo6w==", + "dev": true, + "requires": { + "schema-utils": "^4.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + } + } + }, + "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": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, + "minipass": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz", + "integrity": "sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==", + "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.4.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", + "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", + "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" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dev": true, + "requires": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + } + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "dev": true + }, + "needle": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz", + "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==", + "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" + } + } + } + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "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 + }, + "nice-napi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", + "integrity": "sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==", + "dev": true, + "optional": true, + "requires": { + "node-addon-api": "^3.0.0", + "node-gyp-build": "^4.2.2" + } + }, + "node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "dev": true, + "optional": true + }, + "node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true + }, + "node-gyp": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", + "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", + "dev": true, + "requires": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^9.1.0", + "nopt": "^5.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "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" + } + } + } + }, + "node-gyp-build": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz", + "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==", + "dev": true, + "optional": true + }, + "node-releases": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "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": "4.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-4.0.0.tgz", + "integrity": "sha512-m+GL22VXJKkKbw62ZaBBjv8u6IE3UI4Mh5QakIqs3fWiKe0Xyi6L97hakwZK41/LD4R/2ly71Bayx0NLMwLA/g==", + "dev": true, + "requires": { + "hosted-git-info": "^5.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + } + }, + "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": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "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": "5.0.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-5.0.0.tgz", + "integrity": "sha512-65lUsMI8ztHCxFz5ckCEC44DRvEGdZX5usQFriauxHEwt7upv1FKaQEmAtU0YnOAdwuNWCmk64xYiQABNrEyLA==", + "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": "9.0.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.0.2.tgz", + "integrity": "sha512-v/miORuX8cndiOheW8p2moNuPJ7QhcFh9WGlTorruG8hXSA23vMTEp5hTCmDxic0nD8KHhj/NQgFuySD3GYY3g==", + "dev": true, + "requires": { + "hosted-git-info": "^5.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^4.0.0" + } + }, + "npm-packlist": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-5.1.1.tgz", + "integrity": "sha512-UfpSvQ5YKwctmodvPPkK6Fwk603aoVsf8AEbmVKAEECrfvL8SSe1A2YIwrJ6xmTHAITKPwwZsWo7WwEbNk0kxw==", + "dev": true, + "requires": { + "glob": "^8.0.1", + "ignore-walk": "^5.0.1", + "npm-bundled": "^1.1.2", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-pick-manifest": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-7.0.1.tgz", + "integrity": "sha512-IA8+tuv8KujbsbLQvselW2XQgmXWS47t3CB0ZrzsRZ82DbDfkcFunOaPm4X7qNuhMfq+FmV7hQT4iFVpHqV7mg==", + "dev": true, + "requires": { + "npm-install-checks": "^5.0.0", + "npm-normalize-package-bin": "^1.0.1", + "npm-package-arg": "^9.0.0", + "semver": "^7.3.5" + } + }, + "npm-registry-fetch": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-13.3.0.tgz", + "integrity": "sha512-10LJQ/1+VhKrZjIuY9I/+gQTvumqqlgnsCufoXETHAPFTS3+M+Z5CFhZRDHGavmJ6rOye3UvNga88vl8n1r6gg==", + "dev": true, + "requires": { + "make-fetch-happen": "^10.0.6", + "minipass": "^3.1.6", + "minipass-fetch": "^2.0.3", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^9.0.1", + "proc-log": "^2.0.0" + }, + "dependencies": { + "@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true + }, + "cacache": { + "version": "16.1.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.1.tgz", + "integrity": "sha512-VDKN+LHyCQXaaYZ7rA/qtkURU+/yYhviUdvqEv2LT6QPZU8jpyzEkEVAcKlKLt5dJ5BRp11ym8lo3NKLluEPLg==", + "dev": true, + "requires": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^1.1.1" + } + }, + "http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + } + }, + "make-fetch-happen": { + "version": "10.1.8", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.1.8.tgz", + "integrity": "sha512-0ASJbG12Au6+N5I84W+8FhGS6iM8MyzvZady+zaQAu+6IOaESFzCLLD0AR1sAFF3Jufi8bxm586ABN6hWd3k7g==", + "dev": true, + "requires": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" + } + }, + "minipass-fetch": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.0.tgz", + "integrity": "sha512-H9U4UVBGXEyyWJnqYDCLp1PwD8XIkJ4akNHp1aGVI+2Ym7wQMlxDKi4IB4JbmyU+pl9pEs/cVrK6cOuvmbK4Sg==", + "dev": true, + "requires": { + "encoding": "^0.1.13", + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + } + }, + "socks-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "dev": true, + "requires": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + } + } + } + }, + "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": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "dev": true, + "requires": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + } + }, + "nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "requires": { + "boolbase": "^1.0.0" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true + }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "dev": true + }, + "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.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" + } + }, + "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.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "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": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "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" + } + }, + "open": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "dev": true, + "requires": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + } + }, + "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.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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" + } + } + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true + }, + "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" + } + }, + "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-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dev": true, + "requires": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "dependencies": { + "retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true + } + } + }, + "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": "13.3.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-13.3.0.tgz", + "integrity": "sha512-auhJAUlfC2TALo6I0s1vFoPvVFgWGx+uz/PnIojTTgkGwlK3Np8sGJ0ghfFhiuzJXTZoTycMLk8uLskdntPbDw==", + "dev": true, + "requires": { + "@npmcli/git": "^3.0.0", + "@npmcli/installed-package-contents": "^1.0.7", + "@npmcli/promise-spawn": "^3.0.0", + "@npmcli/run-script": "^3.0.1", + "cacache": "^16.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "infer-owner": "^1.0.4", + "minipass": "^3.1.6", + "mkdirp": "^1.0.4", + "npm-package-arg": "^9.0.0", + "npm-packlist": "^5.0.0", + "npm-pick-manifest": "^7.0.0", + "npm-registry-fetch": "^13.0.1", + "proc-log": "^2.0.0", + "promise-retry": "^2.0.1", + "read-package-json": "^5.0.0", + "read-package-json-fast": "^2.0.3", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11" + } + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "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-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" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "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": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "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==", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "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 + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true + }, + "piscina": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-3.2.0.tgz", + "integrity": "sha512-yn/jMdHRw+q2ZJhFhyqsmANcbF6V2QwmD84c6xRau+QpQOmtrBCoRGdvTfeuFDYXB5W2m6MfLkjkvQa9lUSmIA==", + "dev": true, + "requires": { + "eventemitter-asyncresource": "^1.0.0", + "hdr-histogram-js": "^2.0.1", + "hdr-histogram-percentiles-obj": "^3.0.0", + "nice-napi": "^1.0.2" + } + }, + "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" + } + }, + "postcss": { + "version": "8.4.13", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.13.tgz", + "integrity": "sha512-jtL6eTBrza5MPzy8oJLFuUscHDXTV5KcLlqAWHl5q5WYRfnNRGSmOZmOZ1T6Gy7A99mOZfqungmZMpMmCVJ8ZA==", + "dev": true, + "requires": { + "nanoid": "^3.3.3", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "postcss-attribute-case-insensitive": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz", + "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.10" + } + }, + "postcss-clamp": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", + "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-color-functional-notation": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz", + "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-color-hex-alpha": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz", + "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-color-rebeccapurple": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz", + "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-custom-media": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz", + "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-custom-properties": { + "version": "12.1.8", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.8.tgz", + "integrity": "sha512-8rbj8kVu00RQh2fQF81oBqtduiANu4MIxhyf0HbbStgPtnFlWn0yiaYTpLHrPnJbffVY1s9apWsIoVZcc68FxA==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-custom-selectors": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz", + "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.4" + } + }, + "postcss-dir-pseudo-class": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz", + "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.10" + } + }, + "postcss-double-position-gradients": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz", + "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==", + "dev": true, + "requires": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-env-function": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", + "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-focus-visible": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", + "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.9" + } + }, + "postcss-focus-within": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", + "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.9" + } + }, + "postcss-font-variant": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", + "dev": true, + "requires": {} + }, + "postcss-gap-properties": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz", + "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==", + "dev": true, + "requires": {} + }, + "postcss-image-set-function": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz", + "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-import": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", + "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + } + }, + "postcss-initial": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", + "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", + "dev": true, + "requires": {} + }, + "postcss-lab-function": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz", + "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==", + "dev": true, + "requires": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-loader": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", + "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", + "dev": true, + "requires": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.5", + "semver": "^7.3.5" + } + }, + "postcss-logical": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", + "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", + "dev": true, + "requires": {} + }, + "postcss-media-minmax": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", + "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", + "dev": true, + "requires": {} + }, + "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, + "requires": {} + }, + "postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "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": "10.1.10", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.1.10.tgz", + "integrity": "sha512-lqd7LXCq0gWc0wKXtoKDru5wEUNjm3OryLVNRZ8OnW8km6fSNUuFrjEhU3nklxXE2jvd4qrox566acgh+xQt8w==", + "dev": true, + "requires": { + "@csstools/selector-specificity": "^2.0.0", + "postcss-selector-parser": "^6.0.10" + } + }, + "postcss-opacity-percentage": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.2.tgz", + "integrity": "sha512-lyUfF7miG+yewZ8EAk9XUBIlrHyUE6fijnesuz+Mj5zrIHIEw6KcIZSOk/elVMqzLvREmXB83Zi/5QpNRYd47w==", + "dev": true + }, + "postcss-overflow-shorthand": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz", + "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-page-break": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "dev": true, + "requires": {} + }, + "postcss-place": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz", + "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-preset-env": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.5.0.tgz", + "integrity": "sha512-0BJzWEfCdTtK2R3EiKKSdkE51/DI/BwnhlnicSW482Ym6/DGHud8K0wGLcdjip1epVX0HKo4c8zzTeV/SkiejQ==", + "dev": true, + "requires": { + "@csstools/postcss-color-function": "^1.1.0", + "@csstools/postcss-font-format-keywords": "^1.0.0", + "@csstools/postcss-hwb-function": "^1.0.0", + "@csstools/postcss-ic-unit": "^1.0.0", + "@csstools/postcss-is-pseudo-class": "^2.0.2", + "@csstools/postcss-normalize-display-values": "^1.0.0", + "@csstools/postcss-oklab-function": "^1.1.0", + "@csstools/postcss-progressive-custom-properties": "^1.3.0", + "@csstools/postcss-stepped-value-functions": "^1.0.0", + "@csstools/postcss-unset-value": "^1.0.0", + "autoprefixer": "^10.4.6", + "browserslist": "^4.20.3", + "css-blank-pseudo": "^3.0.3", + "css-has-pseudo": "^3.0.4", + "css-prefers-color-scheme": "^6.0.3", + "cssdb": "^6.6.1", + "postcss-attribute-case-insensitive": "^5.0.0", + "postcss-clamp": "^4.1.0", + "postcss-color-functional-notation": "^4.2.2", + "postcss-color-hex-alpha": "^8.0.3", + "postcss-color-rebeccapurple": "^7.0.2", + "postcss-custom-media": "^8.0.0", + "postcss-custom-properties": "^12.1.7", + "postcss-custom-selectors": "^6.0.0", + "postcss-dir-pseudo-class": "^6.0.4", + "postcss-double-position-gradients": "^3.1.1", + "postcss-env-function": "^4.0.6", + "postcss-focus-visible": "^6.0.4", + "postcss-focus-within": "^5.0.4", + "postcss-font-variant": "^5.0.0", + "postcss-gap-properties": "^3.0.3", + "postcss-image-set-function": "^4.0.6", + "postcss-initial": "^4.0.1", + "postcss-lab-function": "^4.2.0", + "postcss-logical": "^5.0.4", + "postcss-media-minmax": "^5.0.0", + "postcss-nesting": "^10.1.4", + "postcss-opacity-percentage": "^1.1.2", + "postcss-overflow-shorthand": "^3.0.3", + "postcss-page-break": "^3.0.4", + "postcss-place": "^7.0.4", + "postcss-pseudo-class-any-link": "^7.1.2", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^5.0.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-pseudo-class-any-link": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz", + "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.10" + } + }, + "postcss-replace-overflow-wrap": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "dev": true, + "requires": {} + }, + "postcss-selector-not": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-5.0.0.tgz", + "integrity": "sha512-/2K3A4TCP9orP4TNS7u3tGdRFVKqz/E6pX3aGnriPG0jU78of8wsUcqE4QAhWEU0d+WnMSF93Ah3F//vUtK+iQ==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "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 + }, + "proc-log": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-2.0.1.tgz", + "integrity": "sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==", + "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 + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "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" + } + }, + "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" + }, + "dependencies": { + "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 + } + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true, + "optional": true + }, + "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 + }, + "qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "dev": true + }, + "qs": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + }, + "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 + }, + "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.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "requires": { + "pify": "^2.3.0" + } + }, + "read-package-json": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-5.0.1.tgz", + "integrity": "sha512-MALHuNgYWdGW3gKzuNMuYtcSSZbGQm94fAp16xt8VsYTLBjUSc55bLMKe6gzpWue0Tfi6CBgwCSdDAqutGDhMg==", + "dev": true, + "requires": { + "glob": "^8.0.1", + "json-parse-even-better-errors": "^2.3.1", + "normalize-package-data": "^4.0.0", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "read-package-json-fast": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz", + "integrity": "sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==", + "dev": true, + "requires": { + "json-parse-even-better-errors": "^2.3.0", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "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" + } + }, + "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" + } + }, + "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": "10.0.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", + "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", + "dev": true, + "requires": { + "regenerate": "^1.4.2" + } + }, + "regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", + "dev": true + }, + "regenerator-transform": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", + "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "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 + }, + "regexpu-core": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.1.0.tgz", + "integrity": "sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA==", + "dev": true, + "requires": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.0.1", + "regjsgen": "^0.6.0", + "regjsparser": "^0.8.2", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" + } + }, + "regjsgen": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", + "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==", + "dev": true + }, + "regjsparser": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", + "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", + "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": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true + } + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true + }, + "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 + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "resolve": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "dev": true, + "requires": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.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 + }, + "resolve-url-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", + "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", + "dev": true, + "requires": { + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.14", + "source-map": "0.6.1" + }, + "dependencies": { + "loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.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 + } + } + }, + "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" + } + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "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 + }, + "rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "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" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "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" + } + }, + "rxjs": { + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.6.tgz", + "integrity": "sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw==", + "requires": { + "tslib": "^2.1.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "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.51.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.51.0.tgz", + "integrity": "sha512-haGdpTgywJTvHC2b91GSq+clTKGbtkkZmVAb82jZQN/wTy6qs8DdFm2lhEQbEwrY0QDRgSQ3xDurqM977C3noA==", + "dev": true, + "requires": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + } + }, + "sass-loader": { + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", + "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==", + "dev": true, + "requires": { + "klona": "^2.0.4", + "neo-async": "^2.6.2" + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "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" + } + }, + "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, + "requires": {} + }, + "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 + } + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true + }, + "selfsigned": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.1.tgz", + "integrity": "sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ==", + "dev": true, + "requires": { + "node-forge": "^1" + } + }, + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.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" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "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": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "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" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "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": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "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 + } + } + }, + "serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "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 + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true + }, + "smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true + }, + "socket.io": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.1.tgz", + "integrity": "sha512-0y9pnIso5a9i+lJmsCdtmTTgJFFSvNQKDnPQRz28mGNnxbmqYg2QPtJTLFxhymFZhAIn50eHAKzJeiNaKr+yUQ==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.2", + "engine.io": "~6.2.0", + "socket.io-adapter": "~2.4.0", + "socket.io-parser": "~4.0.4" + } + }, + "socket.io-adapter": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz", + "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg==", + "dev": true + }, + "socket.io-parser": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.5.tgz", + "integrity": "sha512-sNjbT9dX63nqUFIOv95tTVm6elyIU4RvB1m8dOeZt+IgWwcWklFDOdmGcfo3zSiRsnR/3pJkjY5lfoGqEe4Eig==", + "dev": true, + "requires": { + "@types/component-emitter": "^1.2.10", + "component-emitter": "~1.3.0", + "debug": "~4.3.1" + } + }, + "sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "requires": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "socks": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.0.tgz", + "integrity": "sha512-scnOe9y4VuiNUULJN72GrM26BNOjVsfPXI+j+98PkyEfsIXroa5ofyjT+FzGvn/xHs73U2JtoBYAVx9Hl4quSA==", + "dev": true, + "requires": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + } + }, + "socks-proxy-agent": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", + "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", + "dev": true, + "requires": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + } + }, + "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": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true + }, + "source-map-loader": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.1.tgz", + "integrity": "sha512-Vp1UsfyPvgujKQzi4pyDiTOnE3E4H+yHvkVRN3c/9PJmQS4CQJExvcDvaX/D+RV+xQben9HJ56jMJS3CgUeWyA==", + "dev": true, + "requires": { + "abab": "^2.0.5", + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.1" + }, + "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.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "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 + } + } + }, + "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 + }, + "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.11", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", + "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", + "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" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "ssri": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "dev": true, + "requires": { + "minipass": "^3.1.1" + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true + }, + "streamroller": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.1.tgz", + "integrity": "sha512-iPhtd9unZ6zKdWgMeYGfSBuqCngyJy1B/GPi/lTpwGpa3bajuX30GjUVd0/Tn/Xhg0mr4DOSENozz9Y06qyonQ==", + "dev": true, + "requires": { + "date-format": "^4.0.10", + "debug": "^4.3.4", + "fs-extra": "^10.1.0" + } + }, + "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-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "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 + }, + "stylus": { + "version": "0.57.0", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.57.0.tgz", + "integrity": "sha512-yOI6G8WYfr0q8v8rRvE91wbxFU+rJPo760Va4MF6K0I6BZjO4r+xSynkvyPBP9tV1CIEUeRsiidjIs2rzb1CnQ==", + "dev": true, + "requires": { + "css": "^3.0.0", + "debug": "^4.3.2", + "glob": "^7.1.6", + "safer-buffer": "^2.1.2", + "sax": "~1.2.4", + "source-map": "^0.7.3" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "stylus-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-6.2.0.tgz", + "integrity": "sha512-5dsDc7qVQGRoc6pvCL20eYgRUxepZ9FpeK28XhdXaIPP6kXr6nI1zAAKFQgP5OBkOfKaURp4WUpJzspg1f01Gg==", + "dev": true, + "requires": { + "fast-glob": "^3.2.7", + "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==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "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 + }, + "tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true + }, + "tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "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" + } + }, + "terser": { + "version": "5.13.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.13.1.tgz", + "integrity": "sha512-hn4WKOfwnwbYfe48NgrQjqNOH9jzLqRcIfbYytOXCOv46LBfWr9bDS17MQqOi+BWGD0sJK3Sj5NC/gJjiojaoA==", + "dev": true, + "requires": { + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map": "~0.8.0-beta.0", + "source-map-support": "~0.5.20" + }, + "dependencies": { + "source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "dev": true, + "requires": { + "whatwg-url": "^7.0.0" + } + } + } + }, + "terser-webpack-plugin": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz", + "integrity": "sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.7", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", + "terser": "^5.7.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" + } + }, + "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, + "requires": {} + }, + "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.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "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" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "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 + }, + "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" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true + }, + "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.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true + }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "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 + }, + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "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" + } + }, + "typed-assert": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", + "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", + "dev": true + }, + "typescript": { + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", + "dev": true + }, + "ua-parser-js": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz", + "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==", + "dev": true + }, + "unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", + "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", + "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", + "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" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true + }, + "update-browserslist-db": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", + "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", + "dev": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, + "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" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "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 + }, + "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": "4.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz", + "integrity": "sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==", + "dev": true, + "requires": { + "builtins": "^5.0.0" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true + }, + "void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", + "dev": true + }, + "watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "requires": { + "glob-to-regexp": "^0.4.1", + "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": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "webpack": { + "version": "5.72.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.72.1.tgz", + "integrity": "sha512-dXG5zXCLspQR4krZVR6QgajnZOjW2K/djHvdcRaDQvsjV9z9vaW6+ja5dZOYbqBBjF6kGXka/2ZyxNdc+8Jung==", + "dev": true, + "requires": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.4.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.9.3", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.3.1", + "webpack-sources": "^3.2.3" + }, + "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" + } + }, + "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, + "requires": {} + }, + "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.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "webpack-dev-middleware": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.1.tgz", + "integrity": "sha512-81EujCKkyles2wphtdrnPg/QqegC/AtqNH//mQkBYSMqwFVCQrxM6ktB2O/SPlZy7LqeEfTbV3cZARGQz6umhg==", + "dev": true, + "requires": { + "colorette": "^2.0.10", + "memfs": "^3.4.1", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + } + } + }, + "webpack-dev-server": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.0.tgz", + "integrity": "sha512-+Nlb39iQSOSsFv0lWUuUTim3jDQO8nhK3E68f//J2r5rIcp4lULHXz2oZ0UVdEeWXEh5lSzYUlzarZhDAeAVQw==", + "dev": true, + "requires": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.1", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.0.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.21", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.4.2" + }, + "dependencies": { + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + }, + "ws": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", + "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", + "dev": true, + "requires": {} + } + } + }, + "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-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true + }, + "webpack-subresource-integrity": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz", + "integrity": "sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==", + "dev": true, + "requires": { + "typed-assert": "^1.0.8" + } + }, + "websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "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==", + "dev": true + }, + "whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "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" + } + }, + "wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "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==", + "dev": true, + "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==", + "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 + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "ws": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", + "dev": true, + "requires": {} + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "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": "17.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.4.1.tgz", + "integrity": "sha512-WSZD9jgobAg3ZKuCQZSa3g9QOJeCCqLoLAykiWgmXnDo9EPnn4RPf5qVTtzgOx66o6/oqhcA5tHtJXpG8pMt3g==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + } + }, + "yargs-parser": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", + "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", + "dev": true + }, + "zone.js": { + "version": "0.11.6", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.6.tgz", + "integrity": "sha512-umJqFtKyZlPli669gB1gOrRE9hxUUGkZr7mo878z+NEBJZZixJkKeVYfnoLa7g25SseUDc92OZrMKKHySyJrFg==", + "requires": { + "tslib": "^2.3.0" + } + } + } +} diff --git a/do_connect_frontend/package.json b/do_connect_frontend/package.json new file mode 100644 index 0000000..4c868a0 --- /dev/null +++ b/do_connect_frontend/package.json @@ -0,0 +1,41 @@ +{ + "name": "angular-project", + "version": "0.0.0", + "scripts": { + "ng": "ng", + "start": "ng serve", + "build": "ng build", + "watch": "ng build --watch --configuration development", + "test": "ng test" + }, + "private": true, + "dependencies": { + "@angular/animations": "^14.0.0", + "@angular/common": "^14.0.0", + "@angular/compiler": "^14.0.0", + "@angular/core": "^14.0.0", + "@angular/forms": "^14.0.0", + "@angular/platform-browser": "^14.0.0", + "@angular/platform-browser-dynamic": "^14.0.0", + "@angular/router": "^14.0.0", + "@kolkov/angular-editor": "^3.0.0-beta.0", + "angular-font-awesome": "^3.1.2", + "bootstrap": "^5.1.3", + "rxjs": "~7.5.0", + "tslib": "^2.3.0", + "zone.js": "~0.11.4" + }, + "devDependencies": { + "@angular-devkit/build-angular": "^14.0.4", + "@angular/cli": "~14.0.4", + "@angular/compiler-cli": "^14.0.0", + "@types/jasmine": "~4.0.0", + "jasmine-core": "~4.1.0", + "karma": "~6.3.0", + "karma-chrome-launcher": "~3.1.0", + "karma-coverage": "~2.2.0", + "karma-jasmine": "~5.0.0", + "karma-jasmine-html-reporter": "~1.7.0", + "typescript": "~4.7.2" + } +} diff --git a/do_connect_frontend/src/app/app-routing.module.ts b/do_connect_frontend/src/app/app-routing.module.ts new file mode 100644 index 0000000..b54b360 --- /dev/null +++ b/do_connect_frontend/src/app/app-routing.module.ts @@ -0,0 +1,21 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { DashboardComponent } from './dashboard/dashboard.component'; +import { HomeComponent } from './home/home.component'; +import { LoginComponent } from './login/login.component'; +import { PageNotFoundComponent } from './page-not-found/page-not-found.component'; +import { RegisterComponent } from './register/register.component'; + +const routes: Routes = [ + { path: '', component: HomeComponent }, + { path: 'login', component: LoginComponent }, + { path: 'register', component: RegisterComponent }, + { path: 'dashboard', component: DashboardComponent }, + { path: '**', component: PageNotFoundComponent }, +]; + +@NgModule({ + imports: [RouterModule.forRoot(routes)], + exports: [RouterModule], +}) +export class AppRoutingModule {} diff --git a/do_connect_frontend/src/app/app.component.css b/do_connect_frontend/src/app/app.component.css new file mode 100644 index 0000000..e69de29 diff --git a/do_connect_frontend/src/app/app.component.html b/do_connect_frontend/src/app/app.component.html new file mode 100644 index 0000000..2e9d174 --- /dev/null +++ b/do_connect_frontend/src/app/app.component.html @@ -0,0 +1,20 @@ +
+ +
+ +
+ + +
diff --git a/do_connect_frontend/src/app/app.component.spec.ts b/do_connect_frontend/src/app/app.component.spec.ts new file mode 100644 index 0000000..1ef7393 --- /dev/null +++ b/do_connect_frontend/src/app/app.component.spec.ts @@ -0,0 +1,35 @@ +import { TestBed } from '@angular/core/testing'; +import { RouterTestingModule } from '@angular/router/testing'; +import { AppComponent } from './app.component'; + +describe('AppComponent', () => { + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ + RouterTestingModule + ], + declarations: [ + AppComponent + ], + }).compileComponents(); + }); + + it('should create the app', () => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.componentInstance; + expect(app).toBeTruthy(); + }); + + it(`should have as title 'angular-project'`, () => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.componentInstance; + expect(app.title).toEqual('angular-project'); + }); + + it('should render title', () => { + const fixture = TestBed.createComponent(AppComponent); + fixture.detectChanges(); + const compiled = fixture.nativeElement as HTMLElement; + expect(compiled.querySelector('.content span')?.textContent).toContain('angular-project app is running!'); + }); +}); diff --git a/do_connect_frontend/src/app/app.component.ts b/do_connect_frontend/src/app/app.component.ts new file mode 100644 index 0000000..99d0aea --- /dev/null +++ b/do_connect_frontend/src/app/app.component.ts @@ -0,0 +1,10 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-root', + templateUrl: './app.component.html', + styleUrls: ['./app.component.css'] +}) +export class AppComponent { + title = 'angular-project'; +} diff --git a/do_connect_frontend/src/app/app.module.ts b/do_connect_frontend/src/app/app.module.ts new file mode 100644 index 0000000..fba18d0 --- /dev/null +++ b/do_connect_frontend/src/app/app.module.ts @@ -0,0 +1,38 @@ +import { NgModule } from '@angular/core'; +import { BrowserModule } from '@angular/platform-browser'; +import { FormsModule } from '@angular/forms'; +import { HttpClientModule } from '@angular/common/http'; +import { AngularEditorModule } from '@kolkov/angular-editor'; + +import { AppRoutingModule } from './app-routing.module'; +import { AppComponent } from './app.component'; +import { LoginComponent } from './login/login.component'; +import { DashboardComponent } from './dashboard/dashboard.component'; +import { NavbarComponent } from './navbar/navbar.component'; +import { FooterComponent } from './footer/footer.component'; +import { PageNotFoundComponent } from './page-not-found/page-not-found.component'; +import { RegisterComponent } from './register/register.component'; +import { HomeComponent } from './home/home.component'; + +@NgModule({ + declarations: [ + AppComponent, + LoginComponent, + DashboardComponent, + NavbarComponent, + FooterComponent, + PageNotFoundComponent, + RegisterComponent, + HomeComponent, + ], + imports: [ + BrowserModule, + AppRoutingModule, + FormsModule, + HttpClientModule, + AngularEditorModule, + ], + providers: [], + bootstrap: [AppComponent], +}) +export class AppModule {} diff --git a/do_connect_frontend/src/app/dashboard/dashboard.component.css b/do_connect_frontend/src/app/dashboard/dashboard.component.css new file mode 100644 index 0000000..603142b --- /dev/null +++ b/do_connect_frontend/src/app/dashboard/dashboard.component.css @@ -0,0 +1,15 @@ +img { + max-width: 50%; + max-height: 100%; +} +.product { + border-radius: 5px; +} +#remove-button { + all: unset; + cursor: pointer; + font-size: 20px; +} +#remove-button:hover { + font-size: 25px; +} diff --git a/do_connect_frontend/src/app/dashboard/dashboard.component.html b/do_connect_frontend/src/app/dashboard/dashboard.component.html new file mode 100644 index 0000000..97a42a5 --- /dev/null +++ b/do_connect_frontend/src/app/dashboard/dashboard.component.html @@ -0,0 +1,85 @@ +
+
+
+ + + +
+
+
+
+ + + + + + + + + + + + + + + +
QuestionPosted ByDateStatus
What is constructor in Java?Ravi24-08-2022 + + +
+
+
+ + + + + + + + + + + + + + + +
AnswerPosted ByDateStatus
+ A constructor in Java is a special method that is used to + initialize objects. The constructor is called when an object of a + class is created. + XYZ24-08-2022 + + +
+
+
+ + + + + + + + + + + + + + + + + +
NameEmailPhoneGenderAction
Ravi Kant Prasadxyz@gmail.com9786757568Male + +
+
+
+
diff --git a/do_connect_frontend/src/app/dashboard/dashboard.component.spec.ts b/do_connect_frontend/src/app/dashboard/dashboard.component.spec.ts new file mode 100644 index 0000000..6e4dcd8 --- /dev/null +++ b/do_connect_frontend/src/app/dashboard/dashboard.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { DashboardComponent } from './dashboard.component'; + +describe('DashboardComponent', () => { + let component: DashboardComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ DashboardComponent ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(DashboardComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/do_connect_frontend/src/app/dashboard/dashboard.component.ts b/do_connect_frontend/src/app/dashboard/dashboard.component.ts new file mode 100644 index 0000000..8679ac0 --- /dev/null +++ b/do_connect_frontend/src/app/dashboard/dashboard.component.ts @@ -0,0 +1,30 @@ +import { Component, OnInit } from '@angular/core'; +import { UserService } from '../service/user.service'; + +@Component({ + selector: 'app-dashboard', + templateUrl: './dashboard.component.html', + styleUrls: ['./dashboard.component.css'], +}) +export class DashboardComponent implements OnInit { + mode = 'Answers'; + data = [1, 1, 1, 1, 1, 2, 1, 1]; + constructor(private _userService: UserService) {} + + ngOnInit(): void { + // this.cart = this._userService.getCartProducts(); + // this.wishlist = this._userService.getWishlistProducts(); + } + + getUnapprovedQuestions() { + this.mode = 'Questions'; + } + + getUnapprovedAnswers() { + this.mode = 'Answers'; + } + + getUsers() { + this.mode = 'Users'; + } +} diff --git a/do_connect_frontend/src/app/footer/footer.component.css b/do_connect_frontend/src/app/footer/footer.component.css new file mode 100644 index 0000000..4abc27f --- /dev/null +++ b/do_connect_frontend/src/app/footer/footer.component.css @@ -0,0 +1,3 @@ +footer { + background-color: rgba(0, 0, 0, 0.553); +} diff --git a/do_connect_frontend/src/app/footer/footer.component.html b/do_connect_frontend/src/app/footer/footer.component.html new file mode 100644 index 0000000..4bcd32e --- /dev/null +++ b/do_connect_frontend/src/app/footer/footer.component.html @@ -0,0 +1,29 @@ + +
+ +
+ +
+ +
+

+ Click here to -> + + + +

+
+ +
+ + + +
+ © 2022 Copyrights from FSD-C4 : + MyGreatLearning.com + +
+ +
+ +
\ No newline at end of file diff --git a/do_connect_frontend/src/app/footer/footer.component.spec.ts b/do_connect_frontend/src/app/footer/footer.component.spec.ts new file mode 100644 index 0000000..953b22c --- /dev/null +++ b/do_connect_frontend/src/app/footer/footer.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { FooterComponent } from './footer.component'; + +describe('FooterComponent', () => { + let component: FooterComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ FooterComponent ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(FooterComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/do_connect_frontend/src/app/footer/footer.component.ts b/do_connect_frontend/src/app/footer/footer.component.ts new file mode 100644 index 0000000..a10f2a4 --- /dev/null +++ b/do_connect_frontend/src/app/footer/footer.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-footer', + templateUrl: './footer.component.html', + styleUrls: ['./footer.component.css'] +}) +export class FooterComponent implements OnInit { + + constructor() { } + + ngOnInit(): void { + } + +} diff --git a/do_connect_frontend/src/app/home/home.component.css b/do_connect_frontend/src/app/home/home.component.css new file mode 100644 index 0000000..237cd9e --- /dev/null +++ b/do_connect_frontend/src/app/home/home.component.css @@ -0,0 +1,15 @@ +img { + max-width: 100%; + max-height: 100%; +} +.product { + border-radius: 5px; +} +#wishlist-button { + all: unset; + cursor: pointer; + font-size: 30px; +} +#wishlist-button:hover { + font-size: 35px; +} diff --git a/do_connect_frontend/src/app/home/home.component.html b/do_connect_frontend/src/app/home/home.component.html new file mode 100644 index 0000000..c059c9e --- /dev/null +++ b/do_connect_frontend/src/app/home/home.component.html @@ -0,0 +1,16 @@ +
+

All Questions

+
+
+
+ Lorem ipsum dolor sit amet consectetur adipisicing elit. Nam, sequi + ducimus sapiente, accusamus atque illum laborum cupiditate excepturi + animi, inventore temporibus itaque saepe. Fugit rem quaerat mollitia + possimus fugiat vero! +
+ +
+
+
+
+
diff --git a/do_connect_frontend/src/app/home/home.component.spec.ts b/do_connect_frontend/src/app/home/home.component.spec.ts new file mode 100644 index 0000000..5075be7 --- /dev/null +++ b/do_connect_frontend/src/app/home/home.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HomeComponent } from './home.component'; + +describe('HomeComponent', () => { + let component: HomeComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ HomeComponent ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(HomeComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/do_connect_frontend/src/app/home/home.component.ts b/do_connect_frontend/src/app/home/home.component.ts new file mode 100644 index 0000000..c0abca7 --- /dev/null +++ b/do_connect_frontend/src/app/home/home.component.ts @@ -0,0 +1,39 @@ +import { HttpClient } from '@angular/common/http'; +import { Component, OnInit } from '@angular/core'; +import { Router } from '@angular/router'; +import { UserService } from '../service/user.service'; + +@Component({ + selector: 'app-home', + templateUrl: './home.component.html', + styleUrls: ['./home.component.css'], +}) +export class HomeComponent implements OnInit { + data = [1, 2, 2, 2, 2, 2]; + constructor(private _userService: UserService, private roter: Router) {} + + ngOnInit(): void { + // this._userService.getAllProducts().subscribe((data) => { + // this.data = data; + // console.log(this.data); + // }); + } + + // addToWishlist(product: any) { + // if (this._userService.user.name !== '') { + // this._userService.addTowishlist(product); + // } else { + // alert('Please Login'); + // this.roter.navigate(['/login']); + // } + // } + + // addToCart(product: any) { + // if (this._userService.user.name !== '') { + // this._userService.addToCart(product); + // } else { + // alert('Please Login'); + // this.roter.navigate(['/login']); + // } + // } +} diff --git a/do_connect_frontend/src/app/login/login.component.css b/do_connect_frontend/src/app/login/login.component.css new file mode 100644 index 0000000..bb532b1 --- /dev/null +++ b/do_connect_frontend/src/app/login/login.component.css @@ -0,0 +1,16 @@ +.form-group input { + color: white; + background-color: transparent; + border: none; + border-radius: 0; + border-bottom: 2px solid white; +} +.form-group input:focus { + color: white; + outline: none !important; + box-shadow: none; + background-color: rgba(191, 191, 191, 0.193); + border: none; + border-radius: 0; + border-bottom: 2px solid white; +} diff --git a/do_connect_frontend/src/app/login/login.component.html b/do_connect_frontend/src/app/login/login.component.html new file mode 100644 index 0000000..6c37bfa --- /dev/null +++ b/do_connect_frontend/src/app/login/login.component.html @@ -0,0 +1,52 @@ +
+
+
+

Sign in

+ +
+ + +
+
+ + +
+
+ + + + + + Forgot password? +
+ +
+ +

{{ warning }}

+
+
+

+ Not registered yet? + Create an account +

+
+
+
+
diff --git a/do_connect_frontend/src/app/login/login.component.spec.ts b/do_connect_frontend/src/app/login/login.component.spec.ts new file mode 100644 index 0000000..10eca24 --- /dev/null +++ b/do_connect_frontend/src/app/login/login.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { LoginComponent } from './login.component'; + +describe('LoginComponent', () => { + let component: LoginComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ LoginComponent ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(LoginComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/do_connect_frontend/src/app/login/login.component.ts b/do_connect_frontend/src/app/login/login.component.ts new file mode 100644 index 0000000..c6f4411 --- /dev/null +++ b/do_connect_frontend/src/app/login/login.component.ts @@ -0,0 +1,35 @@ +import { Component, OnInit } from '@angular/core'; +import { Router } from '@angular/router'; +import { UserService } from '../service/user.service'; + +@Component({ + selector: 'app-login', + templateUrl: './login.component.html', + styleUrls: ['./login.component.css'], +}) +export class LoginComponent implements OnInit { + email = ''; + password = ''; + warning = ''; + constructor(private roter: Router, private _userService: UserService) {} + + ngOnInit(): void {} + onLogin() { + if (this.email === '' || this.password === '') { + this.warning = 'All field required'; + return; + } + this._userService + .loginUser({ email: this.email, password: this.password }) + .subscribe((res: any) => { + console.log(res); + if (res !== null && res.password === this.password) { + this._userService.setUser(res); + alert('Successfully Loggedin'); + this.roter.navigate(['/dashboard']); + } else { + alert('Invalid Credentials'); + } + }); + } +} diff --git a/do_connect_frontend/src/app/navbar/navbar.component.css b/do_connect_frontend/src/app/navbar/navbar.component.css new file mode 100644 index 0000000..02bb1c4 --- /dev/null +++ b/do_connect_frontend/src/app/navbar/navbar.component.css @@ -0,0 +1,3 @@ +/* nav { + background-color: rgba(61, 61, 61, 0.592); +} */ diff --git a/do_connect_frontend/src/app/navbar/navbar.component.html b/do_connect_frontend/src/app/navbar/navbar.component.html new file mode 100644 index 0000000..ad0a750 --- /dev/null +++ b/do_connect_frontend/src/app/navbar/navbar.component.html @@ -0,0 +1,36 @@ + diff --git a/do_connect_frontend/src/app/navbar/navbar.component.spec.ts b/do_connect_frontend/src/app/navbar/navbar.component.spec.ts new file mode 100644 index 0000000..505cc2f --- /dev/null +++ b/do_connect_frontend/src/app/navbar/navbar.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { NavbarComponent } from './navbar.component'; + +describe('NavbarComponent', () => { + let component: NavbarComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ NavbarComponent ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(NavbarComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/do_connect_frontend/src/app/navbar/navbar.component.ts b/do_connect_frontend/src/app/navbar/navbar.component.ts new file mode 100644 index 0000000..646ecb4 --- /dev/null +++ b/do_connect_frontend/src/app/navbar/navbar.component.ts @@ -0,0 +1,13 @@ +import { Component, OnInit } from '@angular/core'; +import { UserService } from '../service/user.service'; + +@Component({ + selector: 'app-navbar', + templateUrl: './navbar.component.html', + styleUrls: ['./navbar.component.css'], +}) +export class NavbarComponent implements OnInit { + constructor(private _userService: UserService) {} + + ngOnInit(): void {} +} diff --git a/do_connect_frontend/src/app/page-not-found/page-not-found.component.css b/do_connect_frontend/src/app/page-not-found/page-not-found.component.css new file mode 100644 index 0000000..e69de29 diff --git a/do_connect_frontend/src/app/page-not-found/page-not-found.component.html b/do_connect_frontend/src/app/page-not-found/page-not-found.component.html new file mode 100644 index 0000000..f68c8da --- /dev/null +++ b/do_connect_frontend/src/app/page-not-found/page-not-found.component.html @@ -0,0 +1,3 @@ +
+

page-not-found works!

+
diff --git a/do_connect_frontend/src/app/page-not-found/page-not-found.component.spec.ts b/do_connect_frontend/src/app/page-not-found/page-not-found.component.spec.ts new file mode 100644 index 0000000..145b822 --- /dev/null +++ b/do_connect_frontend/src/app/page-not-found/page-not-found.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { PageNotFoundComponent } from './page-not-found.component'; + +describe('PageNotFoundComponent', () => { + let component: PageNotFoundComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ PageNotFoundComponent ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(PageNotFoundComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/do_connect_frontend/src/app/page-not-found/page-not-found.component.ts b/do_connect_frontend/src/app/page-not-found/page-not-found.component.ts new file mode 100644 index 0000000..8aeb748 --- /dev/null +++ b/do_connect_frontend/src/app/page-not-found/page-not-found.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-page-not-found', + templateUrl: './page-not-found.component.html', + styleUrls: ['./page-not-found.component.css'] +}) +export class PageNotFoundComponent implements OnInit { + + constructor() { } + + ngOnInit(): void { + } + +} diff --git a/do_connect_frontend/src/app/register/register.component.css b/do_connect_frontend/src/app/register/register.component.css new file mode 100644 index 0000000..777d39b --- /dev/null +++ b/do_connect_frontend/src/app/register/register.component.css @@ -0,0 +1,17 @@ +.form-group input { + color: white; + background-color: transparent; + /* background-color: rgba(191, 191, 191, 0.193); */ + border: none; + border-radius: 0; + border-bottom: 2px solid white; +} +.form-group input:focus { + color: white; + outline: none !important; + box-shadow: none; + background-color: rgba(191, 191, 191, 0.193); + border: none; + border-radius: 0; + border-bottom: 2px solid white; +} diff --git a/do_connect_frontend/src/app/register/register.component.html b/do_connect_frontend/src/app/register/register.component.html new file mode 100644 index 0000000..3807029 --- /dev/null +++ b/do_connect_frontend/src/app/register/register.component.html @@ -0,0 +1,50 @@ +
+
+
+

Sign up

+
+ + +
+
+ + +
+
+ + +
+ +
+ +

{{ warning }}

+
+
+

+ Already registered? + Sign in now +

+
+
+
+
diff --git a/do_connect_frontend/src/app/register/register.component.spec.ts b/do_connect_frontend/src/app/register/register.component.spec.ts new file mode 100644 index 0000000..f975533 --- /dev/null +++ b/do_connect_frontend/src/app/register/register.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { RegisterComponent } from './register.component'; + +describe('RegisterComponent', () => { + let component: RegisterComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ RegisterComponent ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(RegisterComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/do_connect_frontend/src/app/register/register.component.ts b/do_connect_frontend/src/app/register/register.component.ts new file mode 100644 index 0000000..6f046db --- /dev/null +++ b/do_connect_frontend/src/app/register/register.component.ts @@ -0,0 +1,35 @@ +import { Component, OnInit } from '@angular/core'; +import { Router } from '@angular/router'; +import { UserService } from '../service/user.service'; + +@Component({ + selector: 'app-register', + templateUrl: './register.component.html', + styleUrls: ['./register.component.css'], +}) +export class RegisterComponent implements OnInit { + name = ''; + email = ''; + password = ''; + warning = ''; + constructor(private _userService: UserService, private router: Router) {} + + ngOnInit(): void {} + + onRegister() { + if (this.name === '' || this.email === '' || this.password === '') { + this.warning = 'All field required'; + return; + } + this._userService + .registerUser({ + name: this.name, + email: this.email, + password: this.password, + }) + .subscribe((res) => { + console.log(res); + this.router.navigate(['/login']); + }); + } +} diff --git a/do_connect_frontend/src/app/service/user.service.spec.ts b/do_connect_frontend/src/app/service/user.service.spec.ts new file mode 100644 index 0000000..3f804c9 --- /dev/null +++ b/do_connect_frontend/src/app/service/user.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { UserService } from './user.service'; + +describe('UserService', () => { + let service: UserService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(UserService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/do_connect_frontend/src/app/service/user.service.ts b/do_connect_frontend/src/app/service/user.service.ts new file mode 100644 index 0000000..36e698c --- /dev/null +++ b/do_connect_frontend/src/app/service/user.service.ts @@ -0,0 +1,53 @@ +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; + +@Injectable({ + providedIn: 'root', +}) +export class UserService { + baseURL = 'http://localhost:8181/api/v1'; + user: any = { + id: 0, + name: '', + email: '', + }; + constructor(private http: HttpClient) {} + + registerUser(user: any) { + return this.http.post(`${this.baseURL}/auth/register`, user); + } + loginUser(user: any) { + return this.http.post(`${this.baseURL}/auth/login`, user); + } + setUser(user: any) { + this.user = { + id: user.id, + name: user.name, + email: user.email, + }; + } + // addTowishlist(product: any) { + // let currentWishlist = this.user.wishlist; + // currentWishlist.push(product); + // this.user = { ...this.user, wishlist: currentWishlist }; + // // console.log('wish', this.user); + // } + // addToCart(product: any) { + // let currentCart = this.user.cart; + // currentCart.push(product); + // this.user = { ...this.user, cart: currentCart }; + // // console.log(this.user); + // } + + // getAllProducts() { + // return this.http.get('https://fakestoreapi.com/products'); + // } + + // getCartProducts() { + // return this.user.cart; + // } + + // getWishlistProducts() { + // return this.user.wishlist; + // } +} diff --git a/do_connect_frontend/src/assets/.gitkeep b/do_connect_frontend/src/assets/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/do_connect_frontend/src/environments/environment.prod.ts b/do_connect_frontend/src/environments/environment.prod.ts new file mode 100644 index 0000000..3612073 --- /dev/null +++ b/do_connect_frontend/src/environments/environment.prod.ts @@ -0,0 +1,3 @@ +export const environment = { + production: true +}; diff --git a/do_connect_frontend/src/environments/environment.ts b/do_connect_frontend/src/environments/environment.ts new file mode 100644 index 0000000..f56ff47 --- /dev/null +++ b/do_connect_frontend/src/environments/environment.ts @@ -0,0 +1,16 @@ +// This file can be replaced during build by using the `fileReplacements` array. +// `ng build` replaces `environment.ts` with `environment.prod.ts`. +// The list of file replacements can be found in `angular.json`. + +export const environment = { + production: false +}; + +/* + * For easier debugging in development mode, you can import the following file + * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`. + * + * This import should be commented out in production mode because it will have a negative impact + * on performance if an error is thrown. + */ +// import 'zone.js/plugins/zone-error'; // Included with Angular CLI. diff --git a/do_connect_frontend/src/favicon.ico b/do_connect_frontend/src/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..997406ad22c29aae95893fb3d666c30258a09537 GIT binary patch literal 948 zcmV;l155mgP)CBYU7IjCFmI-B}4sMJt3^s9NVg!P0 z6hDQy(L`XWMkB@zOLgN$4KYz;j0zZxq9KKdpZE#5@k0crP^5f9KO};h)ZDQ%ybhht z%t9#h|nu0K(bJ ztIkhEr!*UyrZWQ1k2+YkGqDi8Z<|mIN&$kzpKl{cNP=OQzXHz>vn+c)F)zO|Bou>E z2|-d_=qY#Y+yOu1a}XI?cU}%04)zz%anD(XZC{#~WreV!a$7k2Ug`?&CUEc0EtrkZ zL49MB)h!_K{H(*l_93D5tO0;BUnvYlo+;yss%n^&qjt6fZOa+}+FDO(~2>G z2dx@=JZ?DHP^;b7*Y1as5^uphBsh*s*z&MBd?e@I>-9kU>63PjP&^#5YTOb&x^6Cf z?674rmSHB5Fk!{Gv7rv!?qX#ei_L(XtwVqLX3L}$MI|kJ*w(rhx~tc&L&xP#?cQow zX_|gx$wMr3pRZIIr_;;O|8fAjd;1`nOeu5K(pCu7>^3E&D2OBBq?sYa(%S?GwG&_0-s%_v$L@R!5H_fc)lOb9ZoOO#p`Nn`KU z3LTTBtjwo`7(HA6 z7gmO$yTR!5L>Bsg!X8616{JUngg_@&85%>W=mChTR;x4`P=?PJ~oPuy5 zU-L`C@_!34D21{fD~Y8NVnR3t;aqZI3fIhmgmx}$oc-dKDC6Ap$Gy>a!`A*x2L1v0 WcZ@i?LyX}70000 + + + + AngularProject + + + + + + + + diff --git a/do_connect_frontend/src/main.ts b/do_connect_frontend/src/main.ts new file mode 100644 index 0000000..c7b673c --- /dev/null +++ b/do_connect_frontend/src/main.ts @@ -0,0 +1,12 @@ +import { enableProdMode } from '@angular/core'; +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; + +import { AppModule } from './app/app.module'; +import { environment } from './environments/environment'; + +if (environment.production) { + enableProdMode(); +} + +platformBrowserDynamic().bootstrapModule(AppModule) + .catch(err => console.error(err)); diff --git a/do_connect_frontend/src/polyfills.ts b/do_connect_frontend/src/polyfills.ts new file mode 100644 index 0000000..429bb9e --- /dev/null +++ b/do_connect_frontend/src/polyfills.ts @@ -0,0 +1,53 @@ +/** + * This file includes polyfills needed by Angular and is loaded before the app. + * You can add your own extra polyfills to this file. + * + * This file is divided into 2 sections: + * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. + * 2. Application imports. Files imported after ZoneJS that should be loaded before your main + * file. + * + * The current setup is for so-called "evergreen" browsers; the last versions of browsers that + * automatically update themselves. This includes recent versions of Safari, Chrome (including + * Opera), Edge on the desktop, and iOS and Chrome on mobile. + * + * Learn more in https://angular.io/guide/browser-support + */ + +/*************************************************************************************************** + * BROWSER POLYFILLS + */ + +/** + * By default, zone.js will patch all possible macroTask and DomEvents + * user can disable parts of macroTask/DomEvents patch by setting following flags + * because those flags need to be set before `zone.js` being loaded, and webpack + * will put import in the top of bundle, so user need to create a separate file + * in this directory (for example: zone-flags.ts), and put the following flags + * into that file, and then add the following code before importing zone.js. + * import './zone-flags'; + * + * The flags allowed in zone-flags.ts are listed here. + * + * The following flags will work for all browsers. + * + * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame + * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick + * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames + * + * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js + * with the following flag, it will bypass `zone.js` patch for IE/Edge + * + * (window as any).__Zone_enable_cross_context_check = true; + * + */ + +/*************************************************************************************************** + * Zone JS is required by default for Angular itself. + */ +import 'zone.js'; // Included with Angular CLI. + + +/*************************************************************************************************** + * APPLICATION IMPORTS + */ diff --git a/do_connect_frontend/src/styles.css b/do_connect_frontend/src/styles.css new file mode 100644 index 0000000..90d4ee0 --- /dev/null +++ b/do_connect_frontend/src/styles.css @@ -0,0 +1 @@ +/* You can add global styles to this file, and also import other style files */ diff --git a/do_connect_frontend/src/test.ts b/do_connect_frontend/src/test.ts new file mode 100644 index 0000000..c04c876 --- /dev/null +++ b/do_connect_frontend/src/test.ts @@ -0,0 +1,26 @@ +// This file is required by karma.conf.js and loads recursively all the .spec and framework files + +import 'zone.js/testing'; +import { getTestBed } from '@angular/core/testing'; +import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting +} from '@angular/platform-browser-dynamic/testing'; + +declare const require: { + context(path: string, deep?: boolean, filter?: RegExp): { + (id: string): T; + keys(): string[]; + }; +}; + +// First, initialize the Angular testing environment. +getTestBed().initTestEnvironment( + BrowserDynamicTestingModule, + platformBrowserDynamicTesting(), +); + +// Then we find all the tests. +const context = require.context('./', true, /\.spec\.ts$/); +// And load the modules. +context.keys().forEach(context); diff --git a/do_connect_frontend/tsconfig.app.json b/do_connect_frontend/tsconfig.app.json new file mode 100644 index 0000000..82d91dc --- /dev/null +++ b/do_connect_frontend/tsconfig.app.json @@ -0,0 +1,15 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/app", + "types": [] + }, + "files": [ + "src/main.ts", + "src/polyfills.ts" + ], + "include": [ + "src/**/*.d.ts" + ] +} diff --git a/do_connect_frontend/tsconfig.json b/do_connect_frontend/tsconfig.json new file mode 100644 index 0000000..ff06eae --- /dev/null +++ b/do_connect_frontend/tsconfig.json @@ -0,0 +1,32 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "compileOnSave": false, + "compilerOptions": { + "baseUrl": "./", + "outDir": "./dist/out-tsc", + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "sourceMap": true, + "declaration": false, + "downlevelIteration": true, + "experimentalDecorators": true, + "moduleResolution": "node", + "importHelpers": true, + "target": "es2020", + "module": "es2020", + "lib": [ + "es2020", + "dom" + ] + }, + "angularCompilerOptions": { + "enableI18nLegacyMessageIdFormat": false, + "strictInjectionParameters": true, + "strictInputAccessModifiers": true, + "strictTemplates": true + } +} diff --git a/do_connect_frontend/tsconfig.spec.json b/do_connect_frontend/tsconfig.spec.json new file mode 100644 index 0000000..092345b --- /dev/null +++ b/do_connect_frontend/tsconfig.spec.json @@ -0,0 +1,18 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/spec", + "types": [ + "jasmine" + ] + }, + "files": [ + "src/test.ts", + "src/polyfills.ts" + ], + "include": [ + "src/**/*.spec.ts", + "src/**/*.d.ts" + ] +} From 341e9f463b7eab8e3d2bbc2816088d3fe439e399 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 12:27:52 +0530 Subject: [PATCH 027/464] Update UserService.java --- .../java/com/wipro/cp/doconnect/service/UserService.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/UserService.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/UserService.java index fa778af..b228e8e 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/UserService.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/UserService.java @@ -43,6 +43,12 @@ public StatusDTO createUser(UserRegisterDTO userRegisterDTO) { if (userRepository.existsByUsername(userRegisterDTO.getUsername())) { return new StatusDTO("User with username " + userRegisterDTO.getUsername() + " already exists. Please create user with different username.", false, null); } + if (userRepository.existsByEmail(userRegisterDTO.getEmail())) { + return new StatusDTO("User with email " + userRegisterDTO.getEmail() + " already exists. Please create user with different email.", false, null); + } + if (userRegisterDTO.getPassword().length() < 8) { + return new StatusDTO("Password should contain at least 8 characters.", false, null); + } User user = new User(userRegisterDTO.getUsername(), userRegisterDTO.getName(), bcryptEncoder.encode(userRegisterDTO.getPassword()), userRegisterDTO.getEmail(), userRegisterDTO.getIsAdmin()); return new StatusDTO("", true, convertUserToUserResponseDTO(userRepository.save(user))); } From fe032c9287372fd98c9d7de7336625e4a8378555 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 12:27:56 +0530 Subject: [PATCH 028/464] Update UserRepository.java --- .../java/com/wipro/cp/doconnect/repository/UserRepository.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/UserRepository.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/UserRepository.java index 329a370..3ef6e25 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/UserRepository.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/UserRepository.java @@ -13,5 +13,7 @@ public interface UserRepository extends JpaRepository { Optional findByUsername(String username); boolean existsByUsername(String username); + + boolean existsByEmail(String email); } From 3b9b63eb859692c054dabeeaeb9b2fd88817a5e0 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 12:28:02 +0530 Subject: [PATCH 029/464] Update Question.java --- .../wipro/cp/doconnect/entity/Question.java | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Question.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Question.java index 9362107..de5160c 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Question.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Question.java @@ -1,5 +1,7 @@ package com.wipro.cp.doconnect.entity; +import java.util.ArrayList; +import java.util.Date; import java.util.List; import javax.persistence.Column; @@ -14,6 +16,8 @@ import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; +import org.hibernate.annotations.CreationTimestamp; + import com.wipro.cp.doconnect.util.ListToStringConverter; @Entity @@ -40,8 +44,10 @@ public class Question { @NotEmpty private String postedBy; - @NotNull - @NotEmpty + @Column(nullable = false, updatable = false) + @CreationTimestamp + private Date postedAt; + private String approvedBy; private boolean isApproved; @@ -90,11 +96,11 @@ public void setApprovedBy(String approvedBy) { this.approvedBy = approvedBy; } - public boolean isApproved() { + public boolean getIsApproved() { return isApproved; } - public void setApproved(boolean isApproved) { + public void setIsApproved(boolean isApproved) { this.isApproved = isApproved; } @@ -110,17 +116,20 @@ public long getId() { return id; } + public Date getPostedAt() { + return postedAt; + } + public Question(@NotNull @NotEmpty String question, @NotNull @NotEmpty String topic, List images, - @NotNull @NotEmpty String postedBy, @NotNull @NotEmpty String approvedBy, boolean isApproved, - List answers) { + @NotNull @NotEmpty String postedBy) { super(); this.question = question; this.topic = topic; this.images = images; this.postedBy = postedBy; - this.approvedBy = approvedBy; - this.isApproved = isApproved; - this.answers = answers; + this.approvedBy = null; + this.isApproved = false; + this.answers = new ArrayList(); } public Question() { From d3931b36047a07cf8742a815d848bc8baa090c52 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 12:28:09 +0530 Subject: [PATCH 030/464] Update Answer.java --- .../com/wipro/cp/doconnect/entity/Answer.java | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Answer.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Answer.java index f378c4d..7ee2938 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Answer.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Answer.java @@ -1,5 +1,6 @@ package com.wipro.cp.doconnect.entity; +import java.util.Date; import java.util.List; import javax.persistence.Column; @@ -12,6 +13,8 @@ import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; +import org.hibernate.annotations.CreationTimestamp; + import com.wipro.cp.doconnect.util.ListToStringConverter; import lombok.AllArgsConstructor; @@ -41,8 +44,10 @@ public class Answer { @NotEmpty private String postedBy; - @NotNull - @NotEmpty + @Column(nullable = false, updatable = false) + @CreationTimestamp + private Date postedAt; + private String approvedBy; private boolean isApproved; @@ -91,14 +96,17 @@ public long getId() { return id; } - public Answer(@NotNull @NotEmpty String answer, List images, @NotNull @NotEmpty String postedBy, - @NotNull @NotEmpty String approvedBy, boolean isApproved) { + public Date getPostedAt() { + return postedAt; + } + + public Answer(@NotNull @NotEmpty String answer, List images, @NotNull @NotEmpty String postedBy) { super(); this.answer = answer; this.images = images; this.postedBy = postedBy; - this.approvedBy = approvedBy; - this.isApproved = isApproved; + this.approvedBy = null; + this.isApproved = false; } public Answer() { From b51634ab0108ca48984d69076866ff8adabfd6ac Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 12:28:18 +0530 Subject: [PATCH 031/464] Create application.properties --- .../bin/src/main/resources/application.properties | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 DoConnect/bin/src/main/resources/application.properties diff --git a/DoConnect/bin/src/main/resources/application.properties b/DoConnect/bin/src/main/resources/application.properties new file mode 100644 index 0000000..2d280fe --- /dev/null +++ b/DoConnect/bin/src/main/resources/application.properties @@ -0,0 +1,12 @@ +server.port=9090 + +spring.datasource.url=jdbc:mysql://localhost:3306/do_connect?createDatabaseIfNotExist=true&useSSL=false +spring.datasource.username=root +spring.datasource.password=Password@12345 +spring.jpa.hibernate.ddl-auto=update +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect +spring.jpa.open-in-view=false + +jwt.secret=devashishpathrabe + +spring.main.allow-circular-references=true From 9ff13862051cb62fe92408ed4ddac3956fcbaa13 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 12:28:34 +0530 Subject: [PATCH 032/464] Create pom.xml --- DoConnect/bin/pom.xml | 80 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 DoConnect/bin/pom.xml diff --git a/DoConnect/bin/pom.xml b/DoConnect/bin/pom.xml new file mode 100644 index 0000000..ec78161 --- /dev/null +++ b/DoConnect/bin/pom.xml @@ -0,0 +1,80 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.7.3 + + + com.wipro.cp + doconnect + 0.0.1-SNAPSHOT + DoConnect + Demo project for Spring Boot + + 17 + + + + org.springframework.boot + spring-boot-starter-actuator + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-web + + + + mysql + mysql-connector-java + runtime + + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.boot + spring-boot-starter-security + + + org.springframework.boot + spring-boot-starter-validation + + + org.springframework.security + spring-security-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + + From 0fff05a8f54d9ec7871238cfc7322d99a542a161 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 15:21:38 +0530 Subject: [PATCH 033/464] Update QuestionRepository.java --- .../wipro/cp/doconnect/repository/QuestionRepository.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/QuestionRepository.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/QuestionRepository.java index 05ea86e..c7a81d5 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/QuestionRepository.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/QuestionRepository.java @@ -1,5 +1,7 @@ package com.wipro.cp.doconnect.repository; +import java.util.List; + import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @@ -7,5 +9,9 @@ @Repository public interface QuestionRepository extends JpaRepository { - + + List findByIsApprovedTrue(); + List findByIsApprovedFalse(); + + List findByQuestionContainingIgnoreCaseAndIsApprovedTrue(String question); } From 90462c185c9859342ba3b596d9e055284af15cd9 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 15:21:44 +0530 Subject: [PATCH 034/464] Update UserController.java --- .../java/com/wipro/cp/doconnect/controller/UserController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/UserController.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/UserController.java index 38fa0a4..469b7fc 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/UserController.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/UserController.java @@ -28,7 +28,7 @@ public class UserController { @Autowired - UserService userService; + private UserService userService; @GetMapping("/users") public ResponseEntity> getAllUsers() { From db55d660d0ccf0338113e1cb275273ee4f066df0 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 15:21:57 +0530 Subject: [PATCH 035/464] Create QuestionService.java --- .../cp/doconnect/service/QuestionService.java | 104 ++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/service/QuestionService.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/QuestionService.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/QuestionService.java new file mode 100644 index 0000000..aef23ae --- /dev/null +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/QuestionService.java @@ -0,0 +1,104 @@ +package com.wipro.cp.doconnect.service; + +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.wipro.cp.doconnect.dto.AnswerResponseDTO; +import com.wipro.cp.doconnect.dto.QuestionRequestDTO; +import com.wipro.cp.doconnect.dto.QuestionResponseDTO; +import com.wipro.cp.doconnect.dto.QuestionUpdateDTO; +import com.wipro.cp.doconnect.dto.StatusDTO; +import com.wipro.cp.doconnect.entity.Answer; +import com.wipro.cp.doconnect.entity.Question; +import com.wipro.cp.doconnect.repository.QuestionRepository; + +@Service +public class QuestionService { + + @Autowired + private QuestionRepository questionRepository; + + private AnswerResponseDTO convertAnswerToAnswerResponseDTO(Answer answer) { + return new AnswerResponseDTO(answer.getId(), answer.getAnswer(), answer.getImages(), answer.getPostedBy(), answer.getPostedAt(), answer.getApprovedBy(), answer.getIsApproved()); + } + + private List convertAnswerListToAnswerResponseDTOList(List answerList) { + return answerList.stream().map(answer -> convertAnswerToAnswerResponseDTO(answer)).collect(Collectors.toList()); + } + + private QuestionResponseDTO convertQuestionToQuestionResponseDTO(Question question) { + return new QuestionResponseDTO(question.getId(), question.getQuestion(), question.getTopic(), question.getImages(), question.getPostedBy(), question.getPostedAt(), question.getApprovedBy(), question.getIsApproved(), convertAnswerListToAnswerResponseDTOList(question.getAnswers())); + } + + private List convertQuestionListToQuestionResponseDTOList(List questionList) { + return questionList.stream().map(question -> convertQuestionToQuestionResponseDTO(question)).collect(Collectors.toList()); + } + + private boolean checkIfAnswerIsApproved(Answer answer) { + return answer.getIsApproved(); + } + + private QuestionResponseDTO convertQuestionToQuestionResponseDTOWithApprovedAnswers(Question question) { + List approvedAnswerResponseDTOList = convertAnswerListToAnswerResponseDTOList(question.getAnswers().stream().filter(answer -> checkIfAnswerIsApproved(answer)).collect(Collectors.toList())); + return new QuestionResponseDTO(question.getId(), question.getQuestion(), question.getTopic(), question.getImages(), question.getPostedBy(), question.getPostedAt(), question.getApprovedBy(), question.getIsApproved(), approvedAnswerResponseDTOList); + } + + private List convertQuestionListToQuestionResponseDTOListWithApprovedAnswers(List questionList) { + return questionList.stream().map(question -> convertQuestionToQuestionResponseDTOWithApprovedAnswers(question)).collect(Collectors.toList()); + } + + public StatusDTO> getAllQuestions(String status, String search) { + if (search == null) { + if (status.equalsIgnoreCase("all")) { + return new StatusDTO>("", true, convertQuestionListToQuestionResponseDTOList(questionRepository.findAll())); + } + else if (status.equalsIgnoreCase("approved")) { + return new StatusDTO>("", true, convertQuestionListToQuestionResponseDTOListWithApprovedAnswers(questionRepository.findByIsApprovedTrue())); + } + else if (status.equalsIgnoreCase("unapproved")) { + return new StatusDTO>("", true, convertQuestionListToQuestionResponseDTOList(questionRepository.findByIsApprovedFalse())); + } + else { + return new StatusDTO>("Provided invalid status. Should be one of 'all', 'approved' or 'unapproved'.", false, null); + } + } + else { + if (status.equalsIgnoreCase("approved")) { + return new StatusDTO>("", true, convertQuestionListToQuestionResponseDTOListWithApprovedAnswers(questionRepository.findByQuestionContainingIgnoreCaseAndIsApprovedTrue(search))); + } + else { + return new StatusDTO>("Question search only works with 'approved' status.", false, null); + } + } + } + + public StatusDTO createQuestion(QuestionRequestDTO questionRequestDTO, String postedBy) { + Question question = new Question(questionRequestDTO.getQuestion(), questionRequestDTO.getTopic(), questionRequestDTO.getImages(), postedBy); + return new StatusDTO("", true, convertQuestionToQuestionResponseDTO(questionRepository.save(question))); + } + + public StatusDTO updateQuestion(QuestionUpdateDTO questionUpdateDTO, Long id, String approvedBy) { + Optional optionalQuestion = questionRepository.findById(id); + if (optionalQuestion.isEmpty()) { + return new StatusDTO("User with ID " + id + " does not exist.", false, null); + } + Question question = optionalQuestion.get(); + question.setIsApproved(questionUpdateDTO.getIsApproved()); + question.setApprovedBy(approvedBy); + return new StatusDTO("", true, convertQuestionToQuestionResponseDTO(questionRepository.save(question))); + } + + public boolean deleteQuestionById(Long id) { + Optional optionalQuestion = questionRepository.findById(id); + if (optionalQuestion.isEmpty()) { + return false; + } + questionRepository.deleteById(id); + return true; + } + +} From bd7551ba6d4fb5164f99e0a4abb5f84cf73c5c84 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 15:22:00 +0530 Subject: [PATCH 036/464] Create QuestionUpdateDTO.java --- .../cp/doconnect/dto/QuestionUpdateDTO.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/dto/QuestionUpdateDTO.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/QuestionUpdateDTO.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/QuestionUpdateDTO.java new file mode 100644 index 0000000..92e199a --- /dev/null +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/QuestionUpdateDTO.java @@ -0,0 +1,24 @@ +package com.wipro.cp.doconnect.dto; + +public class QuestionUpdateDTO { + + private boolean isApproved; + + public boolean getIsApproved() { + return isApproved; + } + + public void setIsApproved(boolean isApproved) { + this.isApproved = isApproved; + } + + public QuestionUpdateDTO(boolean isApproved) { + super(); + this.isApproved = isApproved; + } + + public QuestionUpdateDTO() { + super(); + } + +} From 8e64014eb8653844af3a6d30ca8fb9efba018bc6 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 15:22:05 +0530 Subject: [PATCH 037/464] Create QuestionResponseDTO.java --- .../cp/doconnect/dto/QuestionResponseDTO.java | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/dto/QuestionResponseDTO.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/QuestionResponseDTO.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/QuestionResponseDTO.java new file mode 100644 index 0000000..c7071c1 --- /dev/null +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/QuestionResponseDTO.java @@ -0,0 +1,64 @@ +package com.wipro.cp.doconnect.dto; + +import java.util.Date; +import java.util.List; + +public class QuestionResponseDTO { + + private long id; + private String question; + private String topic; + private List images; + private String postedBy; + private Date postedAt; + private String approvedBy; + private boolean isApproved; + private List answers; + + public long getId() { + return id; + } + public String getQuestion() { + return question; + } + public String getTopic() { + return topic; + } + public List getImages() { + return images; + } + public String getPostedBy() { + return postedBy; + } + public Date getPostedAt() { + return postedAt; + } + public String getApprovedBy() { + return approvedBy; + } + public boolean getIsApproved() { + return isApproved; + } + public List getAnswers() { + return answers; + } + + public QuestionResponseDTO(long id, String question, String topic, List images, String postedBy, + Date postedAt, String approvedBy, boolean isApproved, List answers) { + super(); + this.id = id; + this.question = question; + this.topic = topic; + this.images = images; + this.postedBy = postedBy; + this.postedAt = postedAt; + this.approvedBy = approvedBy; + this.isApproved = isApproved; + this.answers = answers; + } + + public QuestionResponseDTO() { + super(); + } + +} From 0c14db29477a441e2fc73911e419de814dcf6de2 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 15:22:09 +0530 Subject: [PATCH 038/464] Create QuestionRequestDTO.java --- .../cp/doconnect/dto/QuestionRequestDTO.java | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/dto/QuestionRequestDTO.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/QuestionRequestDTO.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/QuestionRequestDTO.java new file mode 100644 index 0000000..ccb1db1 --- /dev/null +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/QuestionRequestDTO.java @@ -0,0 +1,41 @@ +package com.wipro.cp.doconnect.dto; + +import java.util.List; + +public class QuestionRequestDTO { + + private String question; + private String topic; + private List images; + + public String getQuestion() { + return question; + } + public void setQuestion(String question) { + this.question = question; + } + public String getTopic() { + return topic; + } + public void setTopic(String topic) { + this.topic = topic; + } + public List getImages() { + return images; + } + public void setImages(List images) { + this.images = images; + } + + public QuestionRequestDTO(String question, String topic, List images) { + super(); + this.question = question; + this.topic = topic; + this.images = images; + } + + public QuestionRequestDTO() { + super(); + } + +} From 97fc05990274767c9d09113d965354ed4bdb58d6 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 15:22:13 +0530 Subject: [PATCH 039/464] Create AnswerResponseDTO.java --- .../cp/doconnect/dto/AnswerResponseDTO.java | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/dto/AnswerResponseDTO.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/AnswerResponseDTO.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/AnswerResponseDTO.java new file mode 100644 index 0000000..2414d80 --- /dev/null +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/AnswerResponseDTO.java @@ -0,0 +1,60 @@ +package com.wipro.cp.doconnect.dto; + +import java.util.Date; +import java.util.List; + +public class AnswerResponseDTO { + + private long id; + private String answer; + private List images; + private String postedBy; + private Date postedAt; + private String approvedBy; + private boolean isApproved; + + public long getId() { + return id; + } + + public String getAnswer() { + return answer; + } + + public List getImages() { + return images; + } + + public String getPostedBy() { + return postedBy; + } + + public Date getPostedAt() { + return postedAt; + } + + public String getApprovedBy() { + return approvedBy; + } + + public boolean getIsApproved() { + return isApproved; + } + + public AnswerResponseDTO(long id, String answer, List images, String postedBy, Date postedAt, + String approvedBy, boolean isApproved) { + super(); + this.id = id; + this.answer = answer; + this.images = images; + this.postedBy = postedBy; + this.postedAt = postedAt; + this.approvedBy = approvedBy; + this.isApproved = isApproved; + } + + public AnswerResponseDTO() { + super(); + } + +} From a7a32c25fc27908b2428732639c8912e54b10b8a Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 15:22:17 +0530 Subject: [PATCH 040/464] Create QuestionController.java --- .../controller/QuestionController.java | 83 +++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/controller/QuestionController.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/QuestionController.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/QuestionController.java new file mode 100644 index 0000000..28ecf56 --- /dev/null +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/QuestionController.java @@ -0,0 +1,83 @@ +package com.wipro.cp.doconnect.controller; + +import java.util.List; +import java.util.Optional; + +import javax.validation.Valid; +import javax.validation.constraints.Min; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.wipro.cp.doconnect.dto.QuestionRequestDTO; +import com.wipro.cp.doconnect.dto.QuestionResponseDTO; +import com.wipro.cp.doconnect.dto.QuestionUpdateDTO; +import com.wipro.cp.doconnect.dto.StatusDTO; +import com.wipro.cp.doconnect.service.QuestionService; + +@RestController +@CrossOrigin +public class QuestionController { + + @Autowired + private QuestionService questionService; + + @GetMapping("/questions") + public ResponseEntity getAllQuestions(@RequestParam(name="status") Optional optionalStatus, @RequestParam(name="search") Optional optionalSearch) { + String status = "approved"; + if (optionalStatus.isPresent()) { + status = optionalStatus.get(); + } + String search = null; + if (optionalSearch.isPresent()) { + search = optionalSearch.get(); + } + StatusDTO> questionStatus = questionService.getAllQuestions(status, search); + if (!questionStatus.getIsValid()) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(questionStatus.getStatusMessage()); + } + return ResponseEntity.ok(questionStatus.getObject()); + } + + @PostMapping("/questions") + public ResponseEntity createQuestion(@Valid @RequestBody QuestionRequestDTO questionRequestDTO) { + // TODO: Read the postedBy value from Authorization Header + String postedBy = ""; + StatusDTO questionStatus = questionService.createQuestion(questionRequestDTO, postedBy); + if (!questionStatus.getIsValid()) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(questionStatus.getStatusMessage()); + } + return ResponseEntity.status(HttpStatus.CREATED).body(questionStatus.getObject()); + } + + @PutMapping("/questions/{id}") + public ResponseEntity updateQuestion(@Valid @RequestBody QuestionUpdateDTO questionUpdateDTO, @PathVariable Long id) { + // TODO: Read the approvedBy value from Authorization Header + String approvedBy = ""; + StatusDTO questionStatus = questionService.updateQuestion(questionUpdateDTO, id, approvedBy); + if (!questionStatus.getIsValid()) { + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(questionStatus.getStatusMessage()); + } + return ResponseEntity.ok(questionStatus.getObject()); + } + + @DeleteMapping("/questions/{id}") + public ResponseEntity deleteQuestionById(@PathVariable @Min(1) Long id) { + boolean deleted = questionService.deleteQuestionById(id); + if (deleted) { + return ResponseEntity.ok("Question deleted successfully."); + } + return ResponseEntity.status(HttpStatus.NOT_FOUND).body("Question with ID " + id + " does not exist."); + } + +} From ffe2183bc8726eddf1d50e645f0c82f3e4aa8586 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 16:08:39 +0530 Subject: [PATCH 041/464] Update QuestionService.java --- .../cp/doconnect/service/QuestionService.java | 42 +++++-------------- 1 file changed, 10 insertions(+), 32 deletions(-) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/QuestionService.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/QuestionService.java index aef23ae..e3886ef 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/QuestionService.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/QuestionService.java @@ -7,12 +7,10 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import com.wipro.cp.doconnect.dto.AnswerResponseDTO; import com.wipro.cp.doconnect.dto.QuestionRequestDTO; import com.wipro.cp.doconnect.dto.QuestionResponseDTO; import com.wipro.cp.doconnect.dto.QuestionUpdateDTO; import com.wipro.cp.doconnect.dto.StatusDTO; -import com.wipro.cp.doconnect.entity.Answer; import com.wipro.cp.doconnect.entity.Question; import com.wipro.cp.doconnect.repository.QuestionRepository; @@ -22,42 +20,21 @@ public class QuestionService { @Autowired private QuestionRepository questionRepository; - private AnswerResponseDTO convertAnswerToAnswerResponseDTO(Answer answer) { - return new AnswerResponseDTO(answer.getId(), answer.getAnswer(), answer.getImages(), answer.getPostedBy(), answer.getPostedAt(), answer.getApprovedBy(), answer.getIsApproved()); - } - - private List convertAnswerListToAnswerResponseDTOList(List answerList) { - return answerList.stream().map(answer -> convertAnswerToAnswerResponseDTO(answer)).collect(Collectors.toList()); - } - private QuestionResponseDTO convertQuestionToQuestionResponseDTO(Question question) { - return new QuestionResponseDTO(question.getId(), question.getQuestion(), question.getTopic(), question.getImages(), question.getPostedBy(), question.getPostedAt(), question.getApprovedBy(), question.getIsApproved(), convertAnswerListToAnswerResponseDTOList(question.getAnswers())); + return new QuestionResponseDTO(question.getId(), question.getQuestion(), question.getTopic(), question.getImages(), question.getPostedBy(), question.getPostedAt(), question.getApprovedBy(), question.getIsApproved()); } private List convertQuestionListToQuestionResponseDTOList(List questionList) { return questionList.stream().map(question -> convertQuestionToQuestionResponseDTO(question)).collect(Collectors.toList()); } - private boolean checkIfAnswerIsApproved(Answer answer) { - return answer.getIsApproved(); - } - - private QuestionResponseDTO convertQuestionToQuestionResponseDTOWithApprovedAnswers(Question question) { - List approvedAnswerResponseDTOList = convertAnswerListToAnswerResponseDTOList(question.getAnswers().stream().filter(answer -> checkIfAnswerIsApproved(answer)).collect(Collectors.toList())); - return new QuestionResponseDTO(question.getId(), question.getQuestion(), question.getTopic(), question.getImages(), question.getPostedBy(), question.getPostedAt(), question.getApprovedBy(), question.getIsApproved(), approvedAnswerResponseDTOList); - } - - private List convertQuestionListToQuestionResponseDTOListWithApprovedAnswers(List questionList) { - return questionList.stream().map(question -> convertQuestionToQuestionResponseDTOWithApprovedAnswers(question)).collect(Collectors.toList()); - } - public StatusDTO> getAllQuestions(String status, String search) { if (search == null) { if (status.equalsIgnoreCase("all")) { return new StatusDTO>("", true, convertQuestionListToQuestionResponseDTOList(questionRepository.findAll())); } else if (status.equalsIgnoreCase("approved")) { - return new StatusDTO>("", true, convertQuestionListToQuestionResponseDTOListWithApprovedAnswers(questionRepository.findByIsApprovedTrue())); + return new StatusDTO>("", true, convertQuestionListToQuestionResponseDTOList(questionRepository.findByIsApprovedTrue())); } else if (status.equalsIgnoreCase("unapproved")) { return new StatusDTO>("", true, convertQuestionListToQuestionResponseDTOList(questionRepository.findByIsApprovedFalse())); @@ -68,7 +45,7 @@ else if (status.equalsIgnoreCase("unapproved")) { } else { if (status.equalsIgnoreCase("approved")) { - return new StatusDTO>("", true, convertQuestionListToQuestionResponseDTOListWithApprovedAnswers(questionRepository.findByQuestionContainingIgnoreCaseAndIsApprovedTrue(search))); + return new StatusDTO>("", true, convertQuestionListToQuestionResponseDTOList(questionRepository.findByQuestionContainingIgnoreCaseAndIsApprovedTrue(search))); } else { return new StatusDTO>("Question search only works with 'approved' status.", false, null); @@ -78,13 +55,14 @@ else if (status.equalsIgnoreCase("unapproved")) { public StatusDTO createQuestion(QuestionRequestDTO questionRequestDTO, String postedBy) { Question question = new Question(questionRequestDTO.getQuestion(), questionRequestDTO.getTopic(), questionRequestDTO.getImages(), postedBy); + // TODO: Send email to Admin that question is created return new StatusDTO("", true, convertQuestionToQuestionResponseDTO(questionRepository.save(question))); } - public StatusDTO updateQuestion(QuestionUpdateDTO questionUpdateDTO, Long id, String approvedBy) { - Optional optionalQuestion = questionRepository.findById(id); + public StatusDTO updateQuestion(QuestionUpdateDTO questionUpdateDTO, Long questionId, String approvedBy) { + Optional optionalQuestion = questionRepository.findById(questionId); if (optionalQuestion.isEmpty()) { - return new StatusDTO("User with ID " + id + " does not exist.", false, null); + return new StatusDTO("Question with ID " + questionId + " does not exist.", false, null); } Question question = optionalQuestion.get(); question.setIsApproved(questionUpdateDTO.getIsApproved()); @@ -92,12 +70,12 @@ public StatusDTO updateQuestion(QuestionUpdateDTO questionU return new StatusDTO("", true, convertQuestionToQuestionResponseDTO(questionRepository.save(question))); } - public boolean deleteQuestionById(Long id) { - Optional optionalQuestion = questionRepository.findById(id); + public boolean deleteQuestionById(Long questionId) { + Optional optionalQuestion = questionRepository.findById(questionId); if (optionalQuestion.isEmpty()) { return false; } - questionRepository.deleteById(id); + questionRepository.deleteById(questionId); return true; } From 2e125c420a8278121bf6fb18fee60c0d3beb7bb4 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 16:08:44 +0530 Subject: [PATCH 042/464] Update AnswerRepository.java --- .../com/wipro/cp/doconnect/repository/AnswerRepository.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/AnswerRepository.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/AnswerRepository.java index e0eaabe..3891038 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/AnswerRepository.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/AnswerRepository.java @@ -1,5 +1,8 @@ package com.wipro.cp.doconnect.repository; +import java.util.List; +import java.util.Optional; + import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @@ -7,5 +10,8 @@ @Repository public interface AnswerRepository extends JpaRepository { + + List findByQuestionId(Long questionId); + Optional findByIdAndQuestionId(Long answerId, Long questionId); } From 03d9a0f4122479ed080f5d11453406a1d6c3424b Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 16:08:48 +0530 Subject: [PATCH 043/464] Update Question.java --- .../com/wipro/cp/doconnect/entity/Question.java | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Question.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Question.java index de5160c..ee04a19 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Question.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Question.java @@ -1,6 +1,5 @@ package com.wipro.cp.doconnect.entity; -import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -10,8 +9,6 @@ import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.OneToMany; import javax.persistence.Table; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; @@ -51,10 +48,6 @@ public class Question { private String approvedBy; private boolean isApproved; - - @OneToMany(orphanRemoval = true) - @JoinColumn(name="question_id") - private List answers; public String getQuestion() { return question; @@ -104,14 +97,6 @@ public void setIsApproved(boolean isApproved) { this.isApproved = isApproved; } - public List getAnswers() { - return answers; - } - - public void setAnswers(List answers) { - this.answers = answers; - } - public long getId() { return id; } @@ -129,7 +114,6 @@ public Question(@NotNull @NotEmpty String question, @NotNull @NotEmpty String to this.postedBy = postedBy; this.approvedBy = null; this.isApproved = false; - this.answers = new ArrayList(); } public Question() { From e4bb40374b79e72df248ad726ac72c51257783a2 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 16:08:55 +0530 Subject: [PATCH 044/464] Update Answer.java --- .../com/wipro/cp/doconnect/entity/Answer.java | 36 +++++++++++++------ 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Answer.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Answer.java index 7ee2938..f4a9a17 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Answer.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Answer.java @@ -6,25 +6,24 @@ import javax.persistence.Column; import javax.persistence.Convert; import javax.persistence.Entity; +import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; import javax.persistence.Table; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; import org.hibernate.annotations.CreationTimestamp; +import org.hibernate.annotations.OnDelete; +import org.hibernate.annotations.OnDeleteAction; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.wipro.cp.doconnect.util.ListToStringConverter; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - @Entity -@Data -@NoArgsConstructor -@AllArgsConstructor @Table(name="answers") public class Answer { @@ -51,6 +50,12 @@ public class Answer { private String approvedBy; private boolean isApproved; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "question_id", nullable = false) + @OnDelete(action = OnDeleteAction.CASCADE) + @JsonIgnore + private Question question; public String getAnswer() { return answer; @@ -100,13 +105,24 @@ public Date getPostedAt() { return postedAt; } - public Answer(@NotNull @NotEmpty String answer, List images, @NotNull @NotEmpty String postedBy) { + public Question getQuestion() { + return question; + } + + public void setQuestion(Question question) { + this.question = question; + } + + public Answer(@NotNull @NotEmpty String answer, List images, @NotNull @NotEmpty String postedBy, + Date postedAt, String approvedBy, boolean isApproved, Question question) { super(); this.answer = answer; this.images = images; this.postedBy = postedBy; - this.approvedBy = null; - this.isApproved = false; + this.postedAt = postedAt; + this.approvedBy = approvedBy; + this.isApproved = isApproved; + this.question = question; } public Answer() { From 32268a7bb7f9dd0ab9567d4a3a79cdc08d34491f Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 16:08:57 +0530 Subject: [PATCH 045/464] Update QuestionResponseDTO.java --- .../com/wipro/cp/doconnect/dto/QuestionResponseDTO.java | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/QuestionResponseDTO.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/QuestionResponseDTO.java index c7071c1..8eee9c3 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/QuestionResponseDTO.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/QuestionResponseDTO.java @@ -13,7 +13,6 @@ public class QuestionResponseDTO { private Date postedAt; private String approvedBy; private boolean isApproved; - private List answers; public long getId() { return id; @@ -39,12 +38,9 @@ public String getApprovedBy() { public boolean getIsApproved() { return isApproved; } - public List getAnswers() { - return answers; - } public QuestionResponseDTO(long id, String question, String topic, List images, String postedBy, - Date postedAt, String approvedBy, boolean isApproved, List answers) { + Date postedAt, String approvedBy, boolean isApproved) { super(); this.id = id; this.question = question; @@ -54,7 +50,6 @@ public QuestionResponseDTO(long id, String question, String topic, List this.postedAt = postedAt; this.approvedBy = approvedBy; this.isApproved = isApproved; - this.answers = answers; } public QuestionResponseDTO() { From b32584da6b5dd812b32610971a85ee337bd26df2 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 16:09:00 +0530 Subject: [PATCH 046/464] Update AnswerResponseDTO.java --- .../com/wipro/cp/doconnect/dto/AnswerResponseDTO.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/AnswerResponseDTO.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/AnswerResponseDTO.java index 2414d80..fbe1918 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/AnswerResponseDTO.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/AnswerResponseDTO.java @@ -12,6 +12,7 @@ public class AnswerResponseDTO { private Date postedAt; private String approvedBy; private boolean isApproved; + private QuestionResponseDTO questionResponseDTO; public long getId() { return id; @@ -41,8 +42,12 @@ public boolean getIsApproved() { return isApproved; } + public QuestionResponseDTO getQuestionResponseDTO() { + return questionResponseDTO; + } + public AnswerResponseDTO(long id, String answer, List images, String postedBy, Date postedAt, - String approvedBy, boolean isApproved) { + String approvedBy, boolean isApproved, QuestionResponseDTO questionResponseDTO) { super(); this.id = id; this.answer = answer; @@ -51,6 +56,7 @@ public AnswerResponseDTO(long id, String answer, List images, String pos this.postedAt = postedAt; this.approvedBy = approvedBy; this.isApproved = isApproved; + this.questionResponseDTO = questionResponseDTO; } public AnswerResponseDTO() { From 8d74d9d059900a1914c89ca46cb6abd89500435b Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 16:09:02 +0530 Subject: [PATCH 047/464] Update QuestionController.java --- .../doconnect/controller/QuestionController.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/QuestionController.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/QuestionController.java index 28ecf56..342aaa4 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/QuestionController.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/QuestionController.java @@ -60,24 +60,24 @@ public ResponseEntity createQuestion(@Valid @RequestBody QuestionRequestDTO q return ResponseEntity.status(HttpStatus.CREATED).body(questionStatus.getObject()); } - @PutMapping("/questions/{id}") - public ResponseEntity updateQuestion(@Valid @RequestBody QuestionUpdateDTO questionUpdateDTO, @PathVariable Long id) { + @PutMapping("/questions/{questionId}") + public ResponseEntity updateQuestion(@Valid @RequestBody QuestionUpdateDTO questionUpdateDTO, @PathVariable Long questionId) { // TODO: Read the approvedBy value from Authorization Header String approvedBy = ""; - StatusDTO questionStatus = questionService.updateQuestion(questionUpdateDTO, id, approvedBy); + StatusDTO questionStatus = questionService.updateQuestion(questionUpdateDTO, questionId, approvedBy); if (!questionStatus.getIsValid()) { return ResponseEntity.status(HttpStatus.NOT_FOUND).body(questionStatus.getStatusMessage()); } return ResponseEntity.ok(questionStatus.getObject()); } - @DeleteMapping("/questions/{id}") - public ResponseEntity deleteQuestionById(@PathVariable @Min(1) Long id) { - boolean deleted = questionService.deleteQuestionById(id); + @DeleteMapping("/questions/{questionId}") + public ResponseEntity deleteQuestionById(@PathVariable @Min(1) Long questionId) { + boolean deleted = questionService.deleteQuestionById(questionId); if (deleted) { return ResponseEntity.ok("Question deleted successfully."); } - return ResponseEntity.status(HttpStatus.NOT_FOUND).body("Question with ID " + id + " does not exist."); + return ResponseEntity.status(HttpStatus.NOT_FOUND).body("Question with ID " + questionId + " does not exist."); } } From 526de3dcd17fd565c2150a488a814c6461b38f48 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 16:40:52 +0530 Subject: [PATCH 048/464] Create AnswerService.java --- .../cp/doconnect/service/AnswerService.java | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/service/AnswerService.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/AnswerService.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/AnswerService.java new file mode 100644 index 0000000..d17c062 --- /dev/null +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/AnswerService.java @@ -0,0 +1,68 @@ +package com.wipro.cp.doconnect.service; + +import java.util.List; +import java.util.stream.Collectors; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.wipro.cp.doconnect.dto.AnswerResponseDTO; +import com.wipro.cp.doconnect.dto.QuestionResponseDTO; +import com.wipro.cp.doconnect.dto.StatusDTO; +import com.wipro.cp.doconnect.entity.Answer; +import com.wipro.cp.doconnect.entity.Question; +import com.wipro.cp.doconnect.repository.AnswerRepository; +import com.wipro.cp.doconnect.repository.QuestionRepository; + +@Service +public class AnswerService { + + @Autowired + private AnswerRepository answerRepository; + + @Autowired + private QuestionRepository questionRepository; + + private QuestionResponseDTO convertQuestionToQuestionResponseDTO(Question question) { + return new QuestionResponseDTO(question.getId(), question.getQuestion(), question.getTopic(), question.getImages(), question.getPostedBy(), question.getPostedAt(), question.getApprovedBy(), question.getIsApproved()); + } + + private AnswerResponseDTO convertAnswerToAnswerResponseDTO(Answer answer) { + return new AnswerResponseDTO(answer.getId(), answer.getAnswer(), answer.getImages(), answer.getPostedBy(), answer.getPostedAt(), answer.getApprovedBy(), answer.getIsApproved(), convertQuestionToQuestionResponseDTO(answer.getQuestion())); + } + + private List convertAnswerListToAnswerResponseDTOList(List answerList) { + return answerList.stream().map(answer -> convertAnswerToAnswerResponseDTO(answer)).collect(Collectors.toList()); + } + + public StatusDTO> getAllAnswers(String answerStatus) { + if (answerStatus.equalsIgnoreCase("all")) { + return new StatusDTO>("", true, convertAnswerListToAnswerResponseDTOList(answerRepository.findAll())); + } + else if (answerStatus.equalsIgnoreCase("approved")) { + return new StatusDTO>("", true, convertAnswerListToAnswerResponseDTOList(answerRepository.findByIsApprovedTrue())); + } + else if (answerStatus.equalsIgnoreCase("unapproved")) { + return new StatusDTO>("", true, convertAnswerListToAnswerResponseDTOList(answerRepository.findByIsApprovedFalse())); + } + else { + return new StatusDTO>("Provided invalid status. Should be one of 'all', 'approved' or 'unapproved'.", false, null); + } + } + + public StatusDTO> getAllAnswersForQuestionId(Long questionId, String answerStatus) { + if (answerStatus.equalsIgnoreCase("all")) { + return new StatusDTO>("", true, convertAnswerListToAnswerResponseDTOList(answerRepository.findByQuestionId(questionId))); + } + else if (answerStatus.equalsIgnoreCase("approved")) { + return new StatusDTO>("", true, convertAnswerListToAnswerResponseDTOList(answerRepository.findByQuestionIdAndIsApprovedTrue(questionId))); + } + else if (answerStatus.equalsIgnoreCase("unapproved")) { + return new StatusDTO>("", true, convertAnswerListToAnswerResponseDTOList(answerRepository.findByQuestionIdAndIsApprovedFalse(questionId))); + } + else { + return new StatusDTO>("Provided invalid status. Should be one of 'all', 'approved' or 'unapproved'.", false, null); + } + } + +} From 7cd4a17e3cf783b7363336be22dd7945d613aae8 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 16:40:55 +0530 Subject: [PATCH 049/464] Update AnswerRepository.java --- .../com/wipro/cp/doconnect/repository/AnswerRepository.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/AnswerRepository.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/AnswerRepository.java index 3891038..a2f89c0 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/AnswerRepository.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/AnswerRepository.java @@ -11,7 +11,13 @@ @Repository public interface AnswerRepository extends JpaRepository { + List findByIsApprovedTrue(); + List findByIsApprovedFalse(); + List findByQuestionId(Long questionId); Optional findByIdAndQuestionId(Long answerId, Long questionId); + + List findByQuestionIdAndIsApprovedTrue(Long questionId); + List findByQuestionIdAndIsApprovedFalse(Long questionId); } From 63e88142f2ab8f98bb2ae7d47c6927cbff78e99e Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 16:41:00 +0530 Subject: [PATCH 050/464] Create AnswerController.java --- .../controller/AnswerController.java | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AnswerController.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AnswerController.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AnswerController.java new file mode 100644 index 0000000..0b41f9b --- /dev/null +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AnswerController.java @@ -0,0 +1,52 @@ +package com.wipro.cp.doconnect.controller; + +import java.util.List; +import java.util.Optional; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.wipro.cp.doconnect.dto.AnswerResponseDTO; +import com.wipro.cp.doconnect.dto.StatusDTO; +import com.wipro.cp.doconnect.service.AnswerService; + +@RestController +@CrossOrigin +public class AnswerController { + + @Autowired + AnswerService answerService; + + @GetMapping("/answers") + public ResponseEntity getAllAnswers(@RequestParam(name="status") Optional optionalStatus) { + String answerStatus = "approved"; + if (optionalStatus.isPresent()) { + answerStatus = optionalStatus.get(); + } + StatusDTO> answerResponseDTOStatus = answerService.getAllAnswers(answerStatus); + if (!answerResponseDTOStatus.getIsValid()) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(answerResponseDTOStatus.getStatusMessage()); + } + return ResponseEntity.ok(answerResponseDTOStatus.getObject()); + } + + @GetMapping("/questions/{questionId}/answers") + public ResponseEntity getAllAnswersForQuestionId(@PathVariable(value="questionId") Long questionId, @RequestParam(name="status") Optional optionalStatus) { + String answerStatus = "approved"; + if (optionalStatus.isPresent()) { + answerStatus = optionalStatus.get(); + } + StatusDTO> answerResponseDTOStatus = answerService.getAllAnswersForQuestionId(questionId, answerStatus); + if (!answerResponseDTOStatus.getIsValid()) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(answerResponseDTOStatus.getStatusMessage()); + } + return ResponseEntity.ok(answerResponseDTOStatus.getObject()); + } + +} From 4168578bdd8c989db9fb9613b8640868dff2ff30 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 17:15:41 +0530 Subject: [PATCH 051/464] Update AnswerService.java --- .../cp/doconnect/service/AnswerService.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/AnswerService.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/AnswerService.java index d17c062..35152e1 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/AnswerService.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/AnswerService.java @@ -1,12 +1,15 @@ package com.wipro.cp.doconnect.service; import java.util.List; +import java.util.Optional; import java.util.stream.Collectors; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import com.wipro.cp.doconnect.dto.AnswerRequestDTO; import com.wipro.cp.doconnect.dto.AnswerResponseDTO; +import com.wipro.cp.doconnect.dto.AnswerUpdateDTO; import com.wipro.cp.doconnect.dto.QuestionResponseDTO; import com.wipro.cp.doconnect.dto.StatusDTO; import com.wipro.cp.doconnect.entity.Answer; @@ -64,5 +67,29 @@ else if (answerStatus.equalsIgnoreCase("unapproved")) { return new StatusDTO>("Provided invalid status. Should be one of 'all', 'approved' or 'unapproved'.", false, null); } } + + public StatusDTO createAnswerForQuestionId(Long questionId, AnswerRequestDTO answerRequestDTO, String postedBy) { + Optional optionalQuestion = questionRepository.findById(questionId); + if (optionalQuestion.isEmpty()) { + return new StatusDTO("Question with id " + questionId + " does not exist.", false, null); + } + Answer answer = new Answer(answerRequestDTO.getAnswer(), answerRequestDTO.getImages(), postedBy, optionalQuestion.get()); + return new StatusDTO("", true, convertAnswerToAnswerResponseDTO(answerRepository.save(answer))); + } + + public StatusDTO updateAnswerForQuestionId(Long questionId, Long answerId, AnswerUpdateDTO answerUpdateDTO, String approvedBy) { + boolean questionExists = questionRepository.existsById(questionId); + if (!questionExists) { + return new StatusDTO("Question with id " + questionId + " does not exist.", false, null); + } + Optional optionalAnswer = answerRepository.findByIdAndQuestionId(answerId, questionId); + if (optionalAnswer.isEmpty()) { + return new StatusDTO("Answer with id " + answerId + " does not exist for question with id " + questionId + ".", false, null); + } + Answer answer = optionalAnswer.get(); + answer.setIsApproved(answerUpdateDTO.getIsApproved()); + answer.setApprovedBy(approvedBy); + return new StatusDTO("", true, convertAnswerToAnswerResponseDTO(answerRepository.save(answer))); + } } From b7f06d050a60c68254974827263ca84198eaac21 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 17:15:46 +0530 Subject: [PATCH 052/464] Update QuestionRepository.java --- .../com/wipro/cp/doconnect/repository/QuestionRepository.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/QuestionRepository.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/QuestionRepository.java index c7a81d5..2d04f52 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/QuestionRepository.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/QuestionRepository.java @@ -10,6 +10,8 @@ @Repository public interface QuestionRepository extends JpaRepository { + boolean existsById(Long id); + List findByIsApprovedTrue(); List findByIsApprovedFalse(); From d323d95d0872df8de4705d86a9d9acf47cc26f52 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 17:15:51 +0530 Subject: [PATCH 053/464] Update Answer.java --- .../main/java/com/wipro/cp/doconnect/entity/Answer.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Answer.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Answer.java index f4a9a17..06b6891 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Answer.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Answer.java @@ -113,15 +113,13 @@ public void setQuestion(Question question) { this.question = question; } - public Answer(@NotNull @NotEmpty String answer, List images, @NotNull @NotEmpty String postedBy, - Date postedAt, String approvedBy, boolean isApproved, Question question) { + public Answer(@NotNull @NotEmpty String answer, List images, @NotNull @NotEmpty String postedBy, Question question) { super(); this.answer = answer; this.images = images; this.postedBy = postedBy; - this.postedAt = postedAt; - this.approvedBy = approvedBy; - this.isApproved = isApproved; + this.approvedBy = null; + this.isApproved = false; this.question = question; } From a7f398abf1dabb6e0e019315db1c811700f61dcc Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 17:15:55 +0530 Subject: [PATCH 054/464] Create AnswerUpdateDTO.java --- .../cp/doconnect/dto/AnswerUpdateDTO.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/dto/AnswerUpdateDTO.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/AnswerUpdateDTO.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/AnswerUpdateDTO.java new file mode 100644 index 0000000..4b86c68 --- /dev/null +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/AnswerUpdateDTO.java @@ -0,0 +1,24 @@ +package com.wipro.cp.doconnect.dto; + +public class AnswerUpdateDTO { + + private boolean isApproved; + + public boolean getIsApproved() { + return isApproved; + } + + public void setIsApproved(boolean isApproved) { + this.isApproved = isApproved; + } + + public AnswerUpdateDTO(boolean isApproved) { + super(); + this.isApproved = isApproved; + } + + public AnswerUpdateDTO() { + super(); + } + +} From a944181159c88db2bfd7556e50130bc101528a45 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 17:16:02 +0530 Subject: [PATCH 055/464] Create AnswerRequestDTO.java --- .../cp/doconnect/dto/AnswerRequestDTO.java | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/dto/AnswerRequestDTO.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/AnswerRequestDTO.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/AnswerRequestDTO.java new file mode 100644 index 0000000..4f67671 --- /dev/null +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/AnswerRequestDTO.java @@ -0,0 +1,33 @@ +package com.wipro.cp.doconnect.dto; + +import java.util.List; + +public class AnswerRequestDTO { + + private String answer; + private List images; + + public String getAnswer() { + return answer; + } + public void setAnswer(String answer) { + this.answer = answer; + } + public List getImages() { + return images; + } + public void setImages(List images) { + this.images = images; + } + + public AnswerRequestDTO(String answer, List images) { + super(); + this.answer = answer; + this.images = images; + } + + public AnswerRequestDTO() { + super(); + } + +} From 9a80d59c17ad4bd4b24384ccc6e37aaf13507f60 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 17:16:05 +0530 Subject: [PATCH 056/464] Update AnswerController.java --- .../controller/AnswerController.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AnswerController.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AnswerController.java index 0b41f9b..ebd1119 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AnswerController.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AnswerController.java @@ -3,16 +3,23 @@ import java.util.List; import java.util.Optional; +import javax.validation.Valid; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import com.wipro.cp.doconnect.dto.AnswerRequestDTO; import com.wipro.cp.doconnect.dto.AnswerResponseDTO; +import com.wipro.cp.doconnect.dto.AnswerUpdateDTO; import com.wipro.cp.doconnect.dto.StatusDTO; import com.wipro.cp.doconnect.service.AnswerService; @@ -48,5 +55,27 @@ public ResponseEntity getAllAnswersForQuestionId(@PathVariable(value="questio } return ResponseEntity.ok(answerResponseDTOStatus.getObject()); } + + @PostMapping("/questions/{questionId}/answers") + public ResponseEntity createAnswerForQuestionId(@PathVariable(value="questionId") Long questionId, @Valid @RequestBody AnswerRequestDTO answerRequestDTO) { + // TODO: Read the postedBy value from Authorization Header + String postedBy = ""; + StatusDTO answerResponseDTOStatus = answerService.createAnswerForQuestionId(questionId, answerRequestDTO, postedBy); + if (!answerResponseDTOStatus.getIsValid()) { + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(answerResponseDTOStatus.getStatusMessage()); + } + return ResponseEntity.status(HttpStatus.CREATED).body(answerResponseDTOStatus.getObject()); + } + + @PutMapping("/questions/{questionId}/answers/{answerId}") + public ResponseEntity updateAnswerForQuestionId(@Valid @RequestBody AnswerUpdateDTO answerUpdateDTO, @PathVariable(value="questionId") Long questionId, @PathVariable(value="answerId") Long answerId) { + // TODO: Read the approvedBy value from Authorization Header + String approvedBy = ""; + StatusDTO answerResponseDTOStatus = answerService.updateAnswerForQuestionId(questionId, answerId, answerUpdateDTO, approvedBy); + if (!answerResponseDTOStatus.getIsValid()) { + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(answerResponseDTOStatus.getStatusMessage()); + } + return ResponseEntity.ok(answerResponseDTOStatus.getObject()); + } } From 05ae9cce475c0027decba7a390fb6b5882fc6fc6 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 17:34:03 +0530 Subject: [PATCH 057/464] Update AnswerService.java --- .../wipro/cp/doconnect/service/AnswerService.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/AnswerService.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/AnswerService.java index 35152e1..f75052c 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/AnswerService.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/AnswerService.java @@ -74,6 +74,7 @@ public StatusDTO createAnswerForQuestionId(Long questionId, A return new StatusDTO("Question with id " + questionId + " does not exist.", false, null); } Answer answer = new Answer(answerRequestDTO.getAnswer(), answerRequestDTO.getImages(), postedBy, optionalQuestion.get()); + // TODO: Send email to Admin that answer is created return new StatusDTO("", true, convertAnswerToAnswerResponseDTO(answerRepository.save(answer))); } @@ -91,5 +92,18 @@ public StatusDTO updateAnswerForQuestionId(Long questionId, L answer.setApprovedBy(approvedBy); return new StatusDTO("", true, convertAnswerToAnswerResponseDTO(answerRepository.save(answer))); } + + public StatusDTO deleteAnswerForQuestionById(Long questionId, Long answerId) { + boolean questionExists = questionRepository.existsById(questionId); + if (!questionExists) { + return new StatusDTO("Question with id " + questionId + " does not exist.", false, null); + } + Optional optionalAnswer = answerRepository.findByIdAndQuestionId(answerId, questionId); + if (optionalAnswer.isEmpty()) { + return new StatusDTO("Answer with id " + answerId + " does not exist for question with id " + questionId + ".", false, null); + } + answerRepository.delete(optionalAnswer.get()); + return new StatusDTO("", true, true); + } } From 55dc8b97720117f46a0b43a8148909726a652178 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 17:34:06 +0530 Subject: [PATCH 058/464] Update AnswerController.java --- .../cp/doconnect/controller/AnswerController.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AnswerController.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AnswerController.java index ebd1119..e0487e0 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AnswerController.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AnswerController.java @@ -9,6 +9,7 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; @@ -77,5 +78,14 @@ public ResponseEntity updateAnswerForQuestionId(@Valid @RequestBody AnswerUpd } return ResponseEntity.ok(answerResponseDTOStatus.getObject()); } + + @DeleteMapping("/questions/{questionId}/answers/{answerId}") + public ResponseEntity deleteAnswerForQuestionById(@PathVariable(value="questionId") Long questionId, @PathVariable(value="answerId") Long answerId) { + StatusDTO deletionStatus = answerService.deleteAnswerForQuestionById(questionId, answerId); + if (!deletionStatus.getIsValid()) { + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(deletionStatus.getStatusMessage()); + } + return ResponseEntity.ok("Answer for Question ID " + questionId + " deleted successfully."); + } } From 11c55e6b6ab839b3a68e3734584ec4c706e2d738 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 18:01:47 +0530 Subject: [PATCH 059/464] Update application.properties --- DoConnect/src/main/resources/application.properties | 2 ++ 1 file changed, 2 insertions(+) diff --git a/DoConnect/src/main/resources/application.properties b/DoConnect/src/main/resources/application.properties index 2d280fe..3a76668 100644 --- a/DoConnect/src/main/resources/application.properties +++ b/DoConnect/src/main/resources/application.properties @@ -10,3 +10,5 @@ spring.jpa.open-in-view=false jwt.secret=devashishpathrabe spring.main.allow-circular-references=true + +spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true From 76f4a4c9d22125b5d8069bc6c95595731343a2d7 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 18:01:55 +0530 Subject: [PATCH 060/464] Update ListToStringConverter.java --- .../java/com/wipro/cp/doconnect/util/ListToStringConverter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/util/ListToStringConverter.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/util/ListToStringConverter.java index 6cae220..88227b7 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/util/ListToStringConverter.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/util/ListToStringConverter.java @@ -9,7 +9,7 @@ public class ListToStringConverter implements AttributeConverter, String> { @Override public String convertToDatabaseColumn(List attribute) { - return attribute == null ? null : String.join(",",attribute); + return (attribute == null || attribute.size() == 0) ? null : String.join(",", attribute); } @Override From 646263d878ea4bdd9dee3bd4b3ade418d7335cf0 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 18:02:01 +0530 Subject: [PATCH 061/464] Update UserService.java --- .../java/com/wipro/cp/doconnect/service/UserService.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/UserService.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/UserService.java index b228e8e..25aae42 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/UserService.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/UserService.java @@ -5,7 +5,7 @@ import java.util.stream.Collectors; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.crypto.password.PasswordEncoder; +//import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import com.wipro.cp.doconnect.dto.StatusDTO; @@ -21,8 +21,8 @@ public class UserService { @Autowired private UserRepository userRepository; - @Autowired - private PasswordEncoder bcryptEncoder; +// @Autowired +// private PasswordEncoder bcryptEncoder; private UserResponseDTO convertUserToUserResponseDTO(User user) { return new UserResponseDTO(user.getId(), user.getUsername(), user.getName(), user.getEmail(), user.getIsAdmin()); @@ -49,7 +49,7 @@ public StatusDTO createUser(UserRegisterDTO userRegisterDTO) { if (userRegisterDTO.getPassword().length() < 8) { return new StatusDTO("Password should contain at least 8 characters.", false, null); } - User user = new User(userRegisterDTO.getUsername(), userRegisterDTO.getName(), bcryptEncoder.encode(userRegisterDTO.getPassword()), userRegisterDTO.getEmail(), userRegisterDTO.getIsAdmin()); + User user = new User(userRegisterDTO.getUsername(), userRegisterDTO.getName(), userRegisterDTO.getPassword(), userRegisterDTO.getEmail(), userRegisterDTO.getIsAdmin()); return new StatusDTO("", true, convertUserToUserResponseDTO(userRepository.save(user))); } From a1e3385bc6862eae74f03529e59da951926a9efb Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 18:02:04 +0530 Subject: [PATCH 062/464] Update QuestionController.java --- .../com/wipro/cp/doconnect/controller/QuestionController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/QuestionController.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/QuestionController.java index 342aaa4..de01d4e 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/QuestionController.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/QuestionController.java @@ -52,7 +52,7 @@ public ResponseEntity getAllQuestions(@RequestParam(name="status") Optional createQuestion(@Valid @RequestBody QuestionRequestDTO questionRequestDTO) { // TODO: Read the postedBy value from Authorization Header - String postedBy = ""; + String postedBy = "Dummy"; StatusDTO questionStatus = questionService.createQuestion(questionRequestDTO, postedBy); if (!questionStatus.getIsValid()) { return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(questionStatus.getStatusMessage()); From ebfe6d8601de5ec844c99c8b162ac44343616b43 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 18:02:07 +0530 Subject: [PATCH 063/464] Update AnswerController.java --- .../com/wipro/cp/doconnect/controller/AnswerController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AnswerController.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AnswerController.java index e0487e0..754d407 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AnswerController.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AnswerController.java @@ -60,7 +60,7 @@ public ResponseEntity getAllAnswersForQuestionId(@PathVariable(value="questio @PostMapping("/questions/{questionId}/answers") public ResponseEntity createAnswerForQuestionId(@PathVariable(value="questionId") Long questionId, @Valid @RequestBody AnswerRequestDTO answerRequestDTO) { // TODO: Read the postedBy value from Authorization Header - String postedBy = ""; + String postedBy = "Dummy"; StatusDTO answerResponseDTOStatus = answerService.createAnswerForQuestionId(questionId, answerRequestDTO, postedBy); if (!answerResponseDTOStatus.getIsValid()) { return ResponseEntity.status(HttpStatus.NOT_FOUND).body(answerResponseDTOStatus.getStatusMessage()); From 40ce64ccf6bad08de3bcc7d8a740196e80bd04c1 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 18:02:09 +0530 Subject: [PATCH 064/464] Update pom.xml --- DoConnect/pom.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/DoConnect/pom.xml b/DoConnect/pom.xml index ec78161..5b3aff2 100644 --- a/DoConnect/pom.xml +++ b/DoConnect/pom.xml @@ -45,19 +45,19 @@ spring-boot-starter-test test - + org.springframework.boot spring-boot-starter-validation - + From 8fd344b65d3a72c7c7fbabc8a197728e88e59fbf Mon Sep 17 00:00:00 2001 From: ravi0818 Date: Wed, 24 Aug 2022 20:37:28 +0530 Subject: [PATCH 065/464] data rendered using json-server --- do_connect_frontend/db.json | 62 ++++++++++++++++++ .../src/app/app-routing.module.ts | 4 ++ do_connect_frontend/src/app/app.component.css | 6 ++ .../src/app/app.component.html | 9 ++- do_connect_frontend/src/app/app.component.ts | 6 +- do_connect_frontend/src/app/app.module.ts | 6 ++ .../src/app/chat/chat.component.css | 19 ++++++ .../src/app/chat/chat.component.html | 13 ++++ .../src/app/chat/chat.component.spec.ts | 23 +++++++ .../src/app/chat/chat.component.ts | 15 +++++ .../app/dashboard/dashboard.component.html | 64 +++++++++++++------ .../src/app/dashboard/dashboard.component.ts | 47 ++++++++++++-- .../src/app/footer/footer.component.html | 25 +++++--- .../src/app/home/home.component.html | 9 ++- .../src/app/home/home.component.ts | 30 +++------ .../src/app/navbar/navbar.component.html | 3 + .../post-question/post-question.component.css | 0 .../post-question.component.html | 33 ++++++++++ .../post-question.component.spec.ts | 23 +++++++ .../post-question/post-question.component.ts | 21 ++++++ .../src/app/question/question.component.css | 0 .../src/app/question/question.component.html | 35 ++++++++++ .../app/question/question.component.spec.ts | 23 +++++++ .../src/app/question/question.component.ts | 31 +++++++++ .../src/app/register/register.component.html | 7 ++ .../src/app/register/register.component.ts | 2 + .../src/app/service/admin.service.spec.ts | 16 +++++ .../src/app/service/admin.service.ts | 39 +++++++++++ .../src/app/service/chat.service.spec.ts | 16 +++++ .../src/app/service/chat.service.ts | 9 +++ .../src/app/service/user.service.ts | 30 +++------ 31 files changed, 539 insertions(+), 87 deletions(-) create mode 100644 do_connect_frontend/src/app/chat/chat.component.css create mode 100644 do_connect_frontend/src/app/chat/chat.component.html create mode 100644 do_connect_frontend/src/app/chat/chat.component.spec.ts create mode 100644 do_connect_frontend/src/app/chat/chat.component.ts create mode 100644 do_connect_frontend/src/app/post-question/post-question.component.css create mode 100644 do_connect_frontend/src/app/post-question/post-question.component.html create mode 100644 do_connect_frontend/src/app/post-question/post-question.component.spec.ts create mode 100644 do_connect_frontend/src/app/post-question/post-question.component.ts create mode 100644 do_connect_frontend/src/app/question/question.component.css create mode 100644 do_connect_frontend/src/app/question/question.component.html create mode 100644 do_connect_frontend/src/app/question/question.component.spec.ts create mode 100644 do_connect_frontend/src/app/question/question.component.ts create mode 100644 do_connect_frontend/src/app/service/admin.service.spec.ts create mode 100644 do_connect_frontend/src/app/service/admin.service.ts create mode 100644 do_connect_frontend/src/app/service/chat.service.spec.ts create mode 100644 do_connect_frontend/src/app/service/chat.service.ts diff --git a/do_connect_frontend/db.json b/do_connect_frontend/db.json index 253a8ad..405574c 100644 --- a/do_connect_frontend/db.json +++ b/do_connect_frontend/db.json @@ -4,7 +4,69 @@ "name": "Ravi Kant Prasad", "email": "rkprasad0818@gmail.com", "password": "admin", + "phone": 9872487324, "id": 1 + }, + { + "name": "Ravi Kant Prasad", + "email": "rkpr8@gmail.com", + "password": "admin", + "phone": 9872487324, + "id": 2 + } + ], + "questions": [ + { + "id": 1, + "question": "What is Java Constructor?", + "postedBy": "Ravi", + "date": "24-08-2022", + "answers": [ + { + "id": 1, + "answer": "this is answer", + "postedBy": "xyz", + "date": "24-08-2022" + }, + { + "id": 2, + "answer": "this is answer", + "postedBy": "xyz", + "date": "24-08-2022" + }, + { + "id": 3, + "answer": "this is answer", + "postedBy": "xyz", + "date": "24-08-2022" + } + ] + }, + { + "id": 2, + "question": "What is Java Constructor?", + "postedBy": "Ravi", + "date": "24-08-2022", + "answers": [ + { + "id": 1, + "answer": "this is answer", + "postedBy": "xyz", + "date": "24-08-2022" + }, + { + "id": 2, + "answer": "this is answer", + "postedBy": "xyz", + "date": "24-08-2022" + }, + { + "id": 3, + "answer": "this is answer", + "postedBy": "xyz", + "date": "24-08-2022" + } + ] } ] } \ No newline at end of file diff --git a/do_connect_frontend/src/app/app-routing.module.ts b/do_connect_frontend/src/app/app-routing.module.ts index b54b360..d85c867 100644 --- a/do_connect_frontend/src/app/app-routing.module.ts +++ b/do_connect_frontend/src/app/app-routing.module.ts @@ -4,6 +4,8 @@ import { DashboardComponent } from './dashboard/dashboard.component'; import { HomeComponent } from './home/home.component'; import { LoginComponent } from './login/login.component'; import { PageNotFoundComponent } from './page-not-found/page-not-found.component'; +import { PostQuestionComponent } from './post-question/post-question.component'; +import { QuestionComponent } from './question/question.component'; import { RegisterComponent } from './register/register.component'; const routes: Routes = [ @@ -11,6 +13,8 @@ const routes: Routes = [ { path: 'login', component: LoginComponent }, { path: 'register', component: RegisterComponent }, { path: 'dashboard', component: DashboardComponent }, + { path: 'post-question', component: PostQuestionComponent }, + { path: 'question/:id', component: QuestionComponent }, { path: '**', component: PageNotFoundComponent }, ]; diff --git a/do_connect_frontend/src/app/app.component.css b/do_connect_frontend/src/app/app.component.css index e69de29..cfa9b02 100644 --- a/do_connect_frontend/src/app/app.component.css +++ b/do_connect_frontend/src/app/app.component.css @@ -0,0 +1,6 @@ +/* #chatButton { + padding: 2%; + background-color: aqua; + border: none; + border-radius: 50%; +} */ diff --git a/do_connect_frontend/src/app/app.component.html b/do_connect_frontend/src/app/app.component.html index 2e9d174..a8a2264 100644 --- a/do_connect_frontend/src/app/app.component.html +++ b/do_connect_frontend/src/app/app.component.html @@ -15,6 +15,13 @@
- +
+ +
+
+ +
diff --git a/do_connect_frontend/src/app/app.component.ts b/do_connect_frontend/src/app/app.component.ts index 99d0aea..7947766 100644 --- a/do_connect_frontend/src/app/app.component.ts +++ b/do_connect_frontend/src/app/app.component.ts @@ -3,8 +3,12 @@ import { Component } from '@angular/core'; @Component({ selector: 'app-root', templateUrl: './app.component.html', - styleUrls: ['./app.component.css'] + styleUrls: ['./app.component.css'], }) export class AppComponent { title = 'angular-project'; + chatbox = 'none'; + toggleChatBox() { + this.chatbox = this.chatbox === 'block' ? 'none' : 'block'; + } } diff --git a/do_connect_frontend/src/app/app.module.ts b/do_connect_frontend/src/app/app.module.ts index fba18d0..6b9d250 100644 --- a/do_connect_frontend/src/app/app.module.ts +++ b/do_connect_frontend/src/app/app.module.ts @@ -13,6 +13,9 @@ import { FooterComponent } from './footer/footer.component'; import { PageNotFoundComponent } from './page-not-found/page-not-found.component'; import { RegisterComponent } from './register/register.component'; import { HomeComponent } from './home/home.component'; +import { PostQuestionComponent } from './post-question/post-question.component'; +import { ChatComponent } from './chat/chat.component'; +import { QuestionComponent } from './question/question.component'; @NgModule({ declarations: [ @@ -24,6 +27,9 @@ import { HomeComponent } from './home/home.component'; PageNotFoundComponent, RegisterComponent, HomeComponent, + PostQuestionComponent, + ChatComponent, + QuestionComponent, ], imports: [ BrowserModule, diff --git a/do_connect_frontend/src/app/chat/chat.component.css b/do_connect_frontend/src/app/chat/chat.component.css new file mode 100644 index 0000000..0af9246 --- /dev/null +++ b/do_connect_frontend/src/app/chat/chat.component.css @@ -0,0 +1,19 @@ +.chatbox { + height: 70vh; + width: 20vw; + background-color: aliceblue; + padding: 1rem 2rem; + position: absolute; + bottom: 100px; + right: 50px; + border-radius: 5px; +} +.inputbox { + position: absolute; + bottom: 0; + width: 80%; +} +.msgbox { + height: 80%; + padding: 1rem; +} diff --git a/do_connect_frontend/src/app/chat/chat.component.html b/do_connect_frontend/src/app/chat/chat.component.html new file mode 100644 index 0000000..a787462 --- /dev/null +++ b/do_connect_frontend/src/app/chat/chat.component.html @@ -0,0 +1,13 @@ +
+

Chat Here

+
+

message 1

+

message 2

+

message 3

+

message 4

+
+
+ + +
+
diff --git a/do_connect_frontend/src/app/chat/chat.component.spec.ts b/do_connect_frontend/src/app/chat/chat.component.spec.ts new file mode 100644 index 0000000..994bf48 --- /dev/null +++ b/do_connect_frontend/src/app/chat/chat.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ChatComponent } from './chat.component'; + +describe('ChatComponent', () => { + let component: ChatComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ ChatComponent ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(ChatComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/do_connect_frontend/src/app/chat/chat.component.ts b/do_connect_frontend/src/app/chat/chat.component.ts new file mode 100644 index 0000000..ee4e787 --- /dev/null +++ b/do_connect_frontend/src/app/chat/chat.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-chat', + templateUrl: './chat.component.html', + styleUrls: ['./chat.component.css'] +}) +export class ChatComponent implements OnInit { + + constructor() { } + + ngOnInit(): void { + } + +} diff --git a/do_connect_frontend/src/app/dashboard/dashboard.component.html b/do_connect_frontend/src/app/dashboard/dashboard.component.html index 97a42a5..ab79388 100644 --- a/do_connect_frontend/src/app/dashboard/dashboard.component.html +++ b/do_connect_frontend/src/app/dashboard/dashboard.component.html @@ -16,19 +16,33 @@
+ + - - - + + + + + @@ -37,23 +51,31 @@
Id QuestionTopic Posted By Date Status
What is constructor in Java?Ravi24-08-2022{{ question.id }}{{ question.question }}{{ null }}{{ question.postedBy }}{{ question.date }} - - + +
+ - - - - + + + + + @@ -65,17 +87,17 @@ - - - - - + + + diff --git a/do_connect_frontend/src/app/dashboard/dashboard.component.ts b/do_connect_frontend/src/app/dashboard/dashboard.component.ts index 8679ac0..4007757 100644 --- a/do_connect_frontend/src/app/dashboard/dashboard.component.ts +++ b/do_connect_frontend/src/app/dashboard/dashboard.component.ts @@ -1,4 +1,5 @@ import { Component, OnInit } from '@angular/core'; +import { AdminService } from '../service/admin.service'; import { UserService } from '../service/user.service'; @Component({ @@ -7,24 +8,60 @@ import { UserService } from '../service/user.service'; styleUrls: ['./dashboard.component.css'], }) export class DashboardComponent implements OnInit { - mode = 'Answers'; - data = [1, 1, 1, 1, 1, 2, 1, 1]; - constructor(private _userService: UserService) {} + mode = 'Questions'; + data: any; + constructor( + private _userService: UserService, + private _adminService: AdminService + ) {} ngOnInit(): void { - // this.cart = this._userService.getCartProducts(); - // this.wishlist = this._userService.getWishlistProducts(); + this.getUnapprovedQuestions(); } getUnapprovedQuestions() { this.mode = 'Questions'; + this._adminService.getUnapprovedQuestions().subscribe((res) => { + this.data = res; + }); } getUnapprovedAnswers() { this.mode = 'Answers'; + this._adminService.getUnapprovedAnswers().subscribe((res) => { + this.data = res; + }); } getUsers() { this.mode = 'Users'; + this._adminService.getUsers().subscribe((res) => { + this.data = res; + }); + } + + onDelete(id: any) { + if (confirm('Confirm to delete the user')) { + this._adminService.deleteUser(id).subscribe((res) => { + console.log(res); + this.getUsers(); + }); + } + } + + onApproveQuestion(data: any) { + this._adminService.approveQuestion(data).subscribe(); + } + + onRejectQuestion(id: any) { + this._adminService.deleteQuestion(id).subscribe(); + } + + onApproveAnswer(data: any) { + this._adminService.approveAnswer(data).subscribe(); + } + + onRejectAnswer(id: any) { + this._adminService.deleteAnswer(id).subscribe(); } } diff --git a/do_connect_frontend/src/app/footer/footer.component.html b/do_connect_frontend/src/app/footer/footer.component.html index 4bcd32e..bb473e9 100644 --- a/do_connect_frontend/src/app/footer/footer.component.html +++ b/do_connect_frontend/src/app/footer/footer.component.html @@ -1,16 +1,20 @@ -
-
+

- Click here to -> - + Click here to -> - +

@@ -18,12 +22,13 @@ -
- © 2022 Copyrights from FSD-C4 : - MyGreatLearning.com - +
+ © 2022 Copyrights from Group 9 : + MyGreatLearning.com
-
\ No newline at end of file + diff --git a/do_connect_frontend/src/app/home/home.component.html b/do_connect_frontend/src/app/home/home.component.html index c059c9e..6975a0f 100644 --- a/do_connect_frontend/src/app/home/home.component.html +++ b/do_connect_frontend/src/app/home/home.component.html @@ -3,12 +3,11 @@

All Questions

- Lorem ipsum dolor sit amet consectetur adipisicing elit. Nam, sequi - ducimus sapiente, accusamus atque illum laborum cupiditate excepturi - animi, inventore temporibus itaque saepe. Fugit rem quaerat mollitia - possimus fugiat vero! +

{{ question.question }}

- +
diff --git a/do_connect_frontend/src/app/home/home.component.ts b/do_connect_frontend/src/app/home/home.component.ts index c0abca7..2b1b692 100644 --- a/do_connect_frontend/src/app/home/home.component.ts +++ b/do_connect_frontend/src/app/home/home.component.ts @@ -9,31 +9,17 @@ import { UserService } from '../service/user.service'; styleUrls: ['./home.component.css'], }) export class HomeComponent implements OnInit { - data = [1, 2, 2, 2, 2, 2]; + data: any; constructor(private _userService: UserService, private roter: Router) {} ngOnInit(): void { - // this._userService.getAllProducts().subscribe((data) => { - // this.data = data; - // console.log(this.data); - // }); + this._userService.getApprovedQuestions().subscribe((res) => { + this.data = res; + console.log(res); + }); } - // addToWishlist(product: any) { - // if (this._userService.user.name !== '') { - // this._userService.addTowishlist(product); - // } else { - // alert('Please Login'); - // this.roter.navigate(['/login']); - // } - // } - - // addToCart(product: any) { - // if (this._userService.user.name !== '') { - // this._userService.addToCart(product); - // } else { - // alert('Please Login'); - // this.roter.navigate(['/login']); - // } - // } + openQuestion(id: any) { + this.roter.navigate([`/question/${id}`]); + } } diff --git a/do_connect_frontend/src/app/navbar/navbar.component.html b/do_connect_frontend/src/app/navbar/navbar.component.html index ad0a750..cb5208c 100644 --- a/do_connect_frontend/src/app/navbar/navbar.component.html +++ b/do_connect_frontend/src/app/navbar/navbar.component.html @@ -22,6 +22,9 @@ + diff --git a/do_connect_frontend/src/app/post-question/post-question.component.css b/do_connect_frontend/src/app/post-question/post-question.component.css new file mode 100644 index 0000000..e69de29 diff --git a/do_connect_frontend/src/app/post-question/post-question.component.html b/do_connect_frontend/src/app/post-question/post-question.component.html new file mode 100644 index 0000000..4f0b61d --- /dev/null +++ b/do_connect_frontend/src/app/post-question/post-question.component.html @@ -0,0 +1,33 @@ +
+
+
+

Post Your Question

+ +
+ + +
+
+ + +
+ +
+ +

{{ warning }}

+
+
+
+
diff --git a/do_connect_frontend/src/app/post-question/post-question.component.spec.ts b/do_connect_frontend/src/app/post-question/post-question.component.spec.ts new file mode 100644 index 0000000..bc48da0 --- /dev/null +++ b/do_connect_frontend/src/app/post-question/post-question.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { PostQuestionComponent } from './post-question.component'; + +describe('PostQuestionComponent', () => { + let component: PostQuestionComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ PostQuestionComponent ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(PostQuestionComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/do_connect_frontend/src/app/post-question/post-question.component.ts b/do_connect_frontend/src/app/post-question/post-question.component.ts new file mode 100644 index 0000000..c04aeb4 --- /dev/null +++ b/do_connect_frontend/src/app/post-question/post-question.component.ts @@ -0,0 +1,21 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-post-question', + templateUrl: './post-question.component.html', + styleUrls: ['./post-question.component.css'], +}) +export class PostQuestionComponent implements OnInit { + question = ''; + topic = 'java'; + warning = ''; + constructor() {} + + ngOnInit(): void {} + + onSubmit() { + if (this.question === '') { + this.warning = 'All fields are required!'; + } + } +} diff --git a/do_connect_frontend/src/app/question/question.component.css b/do_connect_frontend/src/app/question/question.component.css new file mode 100644 index 0000000..e69de29 diff --git a/do_connect_frontend/src/app/question/question.component.html b/do_connect_frontend/src/app/question/question.component.html new file mode 100644 index 0000000..e316fa0 --- /dev/null +++ b/do_connect_frontend/src/app/question/question.component.html @@ -0,0 +1,35 @@ +
+

+
+
+

Question

+

+ {{ data.question }} +

+
+
+

Write your answer

+
+ +
+ +
+
+
+
+

Answers

+
+
+
{{ answer.answer }}
+

Posted By: {{ answer.postedBy }}

+
+
+
+
+
diff --git a/do_connect_frontend/src/app/question/question.component.spec.ts b/do_connect_frontend/src/app/question/question.component.spec.ts new file mode 100644 index 0000000..cd2aa7f --- /dev/null +++ b/do_connect_frontend/src/app/question/question.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { QuestionComponent } from './question.component'; + +describe('QuestionComponent', () => { + let component: QuestionComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ QuestionComponent ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(QuestionComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/do_connect_frontend/src/app/question/question.component.ts b/do_connect_frontend/src/app/question/question.component.ts new file mode 100644 index 0000000..84a86a0 --- /dev/null +++ b/do_connect_frontend/src/app/question/question.component.ts @@ -0,0 +1,31 @@ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute, Route, Router } from '@angular/router'; +import { UserService } from '../service/user.service'; + +@Component({ + selector: 'app-question', + templateUrl: './question.component.html', + styleUrls: ['./question.component.css'], +}) +export class QuestionComponent implements OnInit { + data: any; + answer = ''; + constructor( + private _userService: UserService, + private activatedRoute: ActivatedRoute + ) {} + + ngOnInit(): void { + let urlParams = this.activatedRoute.snapshot.params; + let questionId = urlParams['id']; + console.log(questionId); + this.data = this._userService.getQuestion(questionId).subscribe((res) => { + this.data = res; + console.log(this.data); + }); + } + + onSubmit() { + this._userService.postQuestion(this.answer); + } +} diff --git a/do_connect_frontend/src/app/register/register.component.html b/do_connect_frontend/src/app/register/register.component.html index 3807029..e6defec 100644 --- a/do_connect_frontend/src/app/register/register.component.html +++ b/do_connect_frontend/src/app/register/register.component.html @@ -32,6 +32,13 @@ required />
+
+ + +
diff --git a/do_connect_frontend/src/app/register/register.component.ts b/do_connect_frontend/src/app/register/register.component.ts index 6f046db..61672b5 100644 --- a/do_connect_frontend/src/app/register/register.component.ts +++ b/do_connect_frontend/src/app/register/register.component.ts @@ -11,12 +11,14 @@ export class RegisterComponent implements OnInit { name = ''; email = ''; password = ''; + role = 'User'; warning = ''; constructor(private _userService: UserService, private router: Router) {} ngOnInit(): void {} onRegister() { + console.log(this.role); if (this.name === '' || this.email === '' || this.password === '') { this.warning = 'All field required'; return; diff --git a/do_connect_frontend/src/app/service/admin.service.spec.ts b/do_connect_frontend/src/app/service/admin.service.spec.ts new file mode 100644 index 0000000..c83b4be --- /dev/null +++ b/do_connect_frontend/src/app/service/admin.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { AdminService } from './admin.service'; + +describe('AdminService', () => { + let service: AdminService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(AdminService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/do_connect_frontend/src/app/service/admin.service.ts b/do_connect_frontend/src/app/service/admin.service.ts new file mode 100644 index 0000000..31ab7b0 --- /dev/null +++ b/do_connect_frontend/src/app/service/admin.service.ts @@ -0,0 +1,39 @@ +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; + +@Injectable({ + providedIn: 'root', +}) +export class AdminService { + baseURL = 'http://localhost:3000'; + + constructor(private http: HttpClient) {} + + getUnapprovedQuestions() { + return this.http.get(this.baseURL + '/questions'); + } + getUnapprovedAnswers() { + return this.http.get(this.baseURL + '/questions'); + } + + getUsers() { + return this.http.get(this.baseURL + '/users'); + } + + deleteUser(id: any) { + return this.http.delete(this.baseURL + '/users/' + id); + } + + approveQuestion(data: any) { + return this.http.put(this.baseURL + '/questions/' + data.id, data); + } + approveAnswer(data: any) { + return this.http.put(this.baseURL + '/questions/' + data.id, data); + } + deleteQuestion(id: any) { + return this.http.delete(this.baseURL + '/questions/' + id); + } + deleteAnswer(id: any) { + return this.http.delete(this.baseURL + '/questions/' + id); + } +} diff --git a/do_connect_frontend/src/app/service/chat.service.spec.ts b/do_connect_frontend/src/app/service/chat.service.spec.ts new file mode 100644 index 0000000..4d8abdf --- /dev/null +++ b/do_connect_frontend/src/app/service/chat.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { ChatService } from './chat.service'; + +describe('ChatService', () => { + let service: ChatService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(ChatService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/do_connect_frontend/src/app/service/chat.service.ts b/do_connect_frontend/src/app/service/chat.service.ts new file mode 100644 index 0000000..0d00005 --- /dev/null +++ b/do_connect_frontend/src/app/service/chat.service.ts @@ -0,0 +1,9 @@ +import { Injectable } from '@angular/core'; + +@Injectable({ + providedIn: 'root' +}) +export class ChatService { + + constructor() { } +} diff --git a/do_connect_frontend/src/app/service/user.service.ts b/do_connect_frontend/src/app/service/user.service.ts index 36e698c..eff41db 100644 --- a/do_connect_frontend/src/app/service/user.service.ts +++ b/do_connect_frontend/src/app/service/user.service.ts @@ -5,7 +5,7 @@ import { Injectable } from '@angular/core'; providedIn: 'root', }) export class UserService { - baseURL = 'http://localhost:8181/api/v1'; + baseURL = 'http://localhost:3000'; user: any = { id: 0, name: '', @@ -26,28 +26,14 @@ export class UserService { email: user.email, }; } - // addTowishlist(product: any) { - // let currentWishlist = this.user.wishlist; - // currentWishlist.push(product); - // this.user = { ...this.user, wishlist: currentWishlist }; - // // console.log('wish', this.user); - // } - // addToCart(product: any) { - // let currentCart = this.user.cart; - // currentCart.push(product); - // this.user = { ...this.user, cart: currentCart }; - // // console.log(this.user); - // } - // getAllProducts() { - // return this.http.get('https://fakestoreapi.com/products'); - // } + getQuestion(id: any) { + return this.http.get(this.baseURL + '/questions/' + id); + } - // getCartProducts() { - // return this.user.cart; - // } + getApprovedQuestions() { + return this.http.get(this.baseURL + '/questions'); + } - // getWishlistProducts() { - // return this.user.wishlist; - // } + postQuestion(answer: any) {} } From bbeb82c05f3096cb33893704a94482a28431e2c9 Mon Sep 17 00:00:00 2001 From: tapasaha-01 Date: Wed, 24 Aug 2022 22:07:19 +0530 Subject: [PATCH 066/464] My First Commit --- README.md | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 README.md diff --git a/README.md b/README.md deleted file mode 100644 index 5a9b48d..0000000 --- a/README.md +++ /dev/null @@ -1,2 +0,0 @@ -Capstone Project -================ \ No newline at end of file From c1b736aaa252a329e2a6e00fd8eb769c73140495 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 23:07:55 +0530 Subject: [PATCH 067/464] Update UserServiceImp.java --- .../{UserService.java => UserServiceImp.java} | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) rename DoConnect/src/main/java/com/wipro/cp/doconnect/service/{UserService.java => UserServiceImp.java} (96%) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/UserService.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/UserServiceImp.java similarity index 96% rename from DoConnect/src/main/java/com/wipro/cp/doconnect/service/UserService.java rename to DoConnect/src/main/java/com/wipro/cp/doconnect/service/UserServiceImp.java index 25aae42..3b7c55b 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/UserService.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/UserServiceImp.java @@ -16,7 +16,7 @@ import com.wipro.cp.doconnect.repository.UserRepository; @Service -public class UserService { +public class UserServiceImp implements IUserService { @Autowired private UserRepository userRepository; @@ -38,7 +38,8 @@ private StatusDTO convertOptionalUserToStatusDTOUserResponseDTO public StatusDTO getUserByUsername(String username) { return convertOptionalUserToStatusDTOUserResponseDTO(userRepository.findByUsername(username), "User with username " + username + " does not exist."); } - + + @Override public StatusDTO createUser(UserRegisterDTO userRegisterDTO) { if (userRepository.existsByUsername(userRegisterDTO.getUsername())) { return new StatusDTO("User with username " + userRegisterDTO.getUsername() + " already exists. Please create user with different username.", false, null); @@ -52,15 +53,18 @@ public StatusDTO createUser(UserRegisterDTO userRegisterDTO) { User user = new User(userRegisterDTO.getUsername(), userRegisterDTO.getName(), userRegisterDTO.getPassword(), userRegisterDTO.getEmail(), userRegisterDTO.getIsAdmin()); return new StatusDTO("", true, convertUserToUserResponseDTO(userRepository.save(user))); } - + + @Override public List getAllUsers() { return userRepository.findAll().stream().map(user -> convertUserToUserResponseDTO(user)).collect(Collectors.toList()); } - + + @Override public StatusDTO getUserById(Long id) { return convertOptionalUserToStatusDTOUserResponseDTO(userRepository.findById(id), "User with ID " + id + " does not exist."); } - + + @Override public StatusDTO updateUser(UserUpdateDTO userUpdateDTO, Long id) { Optional optionalUser = userRepository.findById(id); if (optionalUser.isEmpty()) { @@ -72,6 +76,7 @@ public StatusDTO updateUser(UserUpdateDTO userUpdateDTO, Long i return new StatusDTO("", true, convertUserToUserResponseDTO(userRepository.save(user))); } + @Override public boolean deleteUserById(Long id) { Optional optionalUser = userRepository.findById(id); if (optionalUser.isEmpty()) { @@ -80,7 +85,8 @@ public boolean deleteUserById(Long id) { userRepository.deleteById(id); return true; } - + + @Override public void deleteAllUsers() { userRepository.deleteAllInBatch(); } From 0a3948f2803eadd6f175f114a6d70abbe87b7f61 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 23:08:05 +0530 Subject: [PATCH 068/464] Create QuestionServiceImp.java --- .../doconnect/service/QuestionServiceImp.java | 86 +++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/service/QuestionServiceImp.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/QuestionServiceImp.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/QuestionServiceImp.java new file mode 100644 index 0000000..d3e03dd --- /dev/null +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/QuestionServiceImp.java @@ -0,0 +1,86 @@ +package com.wipro.cp.doconnect.service; + +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.wipro.cp.doconnect.dto.QuestionRequestDTO; +import com.wipro.cp.doconnect.dto.QuestionResponseDTO; +import com.wipro.cp.doconnect.dto.QuestionUpdateDTO; +import com.wipro.cp.doconnect.dto.StatusDTO; +import com.wipro.cp.doconnect.entity.Question; +import com.wipro.cp.doconnect.repository.QuestionRepository; + +@Service +public class QuestionServiceImp implements IQuestionService { + + @Autowired + private QuestionRepository questionRepository; + + private QuestionResponseDTO convertQuestionToQuestionResponseDTO(Question question) { + return new QuestionResponseDTO(question.getId(), question.getQuestion(), question.getTopic(), question.getImages(), question.getPostedBy(), question.getPostedAt(), question.getApprovedBy(), question.getIsApproved()); + } + + private List convertQuestionListToQuestionResponseDTOList(List questionList) { + return questionList.stream().map(question -> convertQuestionToQuestionResponseDTO(question)).collect(Collectors.toList()); + } + + @Override + public StatusDTO> getAllQuestions(String status, String search) { + if (search == null) { + if (status.equalsIgnoreCase("all")) { + return new StatusDTO>("", true, convertQuestionListToQuestionResponseDTOList(questionRepository.findAll())); + } + else if (status.equalsIgnoreCase("approved")) { + return new StatusDTO>("", true, convertQuestionListToQuestionResponseDTOList(questionRepository.findByIsApprovedTrue())); + } + else if (status.equalsIgnoreCase("unapproved")) { + return new StatusDTO>("", true, convertQuestionListToQuestionResponseDTOList(questionRepository.findByIsApprovedFalse())); + } + else { + return new StatusDTO>("Provided invalid status. Should be one of 'all', 'approved' or 'unapproved'.", false, null); + } + } + else { + if (status.equalsIgnoreCase("approved")) { + return new StatusDTO>("", true, convertQuestionListToQuestionResponseDTOList(questionRepository.findByQuestionContainingIgnoreCaseAndIsApprovedTrue(search))); + } + else { + return new StatusDTO>("Question search only works with 'approved' status.", false, null); + } + } + } + + @Override + public StatusDTO createQuestion(QuestionRequestDTO questionRequestDTO, String postedBy) { + Question question = new Question(questionRequestDTO.getQuestion(), questionRequestDTO.getTopic(), questionRequestDTO.getImages(), postedBy); + // TODO: Send email to Admin that question is created + return new StatusDTO("", true, convertQuestionToQuestionResponseDTO(questionRepository.save(question))); + } + + @Override + public StatusDTO updateQuestion(QuestionUpdateDTO questionUpdateDTO, Long questionId, String approvedBy) { + Optional optionalQuestion = questionRepository.findById(questionId); + if (optionalQuestion.isEmpty()) { + return new StatusDTO("Question with ID " + questionId + " does not exist.", false, null); + } + Question question = optionalQuestion.get(); + question.setIsApproved(questionUpdateDTO.getIsApproved()); + question.setApprovedBy(approvedBy); + return new StatusDTO("", true, convertQuestionToQuestionResponseDTO(questionRepository.save(question))); + } + + @Override + public boolean deleteQuestionById(Long questionId) { + Optional optionalQuestion = questionRepository.findById(questionId); + if (optionalQuestion.isEmpty()) { + return false; + } + questionRepository.deleteById(questionId); + return true; + } + +} From 572c351f08c98b2145f103db042c04e79023a160 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 23:08:12 +0530 Subject: [PATCH 069/464] Delete QuestionService.java --- .../cp/doconnect/service/QuestionService.java | 82 ------------------- 1 file changed, 82 deletions(-) delete mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/service/QuestionService.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/QuestionService.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/QuestionService.java deleted file mode 100644 index e3886ef..0000000 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/QuestionService.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.wipro.cp.doconnect.service; - -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import com.wipro.cp.doconnect.dto.QuestionRequestDTO; -import com.wipro.cp.doconnect.dto.QuestionResponseDTO; -import com.wipro.cp.doconnect.dto.QuestionUpdateDTO; -import com.wipro.cp.doconnect.dto.StatusDTO; -import com.wipro.cp.doconnect.entity.Question; -import com.wipro.cp.doconnect.repository.QuestionRepository; - -@Service -public class QuestionService { - - @Autowired - private QuestionRepository questionRepository; - - private QuestionResponseDTO convertQuestionToQuestionResponseDTO(Question question) { - return new QuestionResponseDTO(question.getId(), question.getQuestion(), question.getTopic(), question.getImages(), question.getPostedBy(), question.getPostedAt(), question.getApprovedBy(), question.getIsApproved()); - } - - private List convertQuestionListToQuestionResponseDTOList(List questionList) { - return questionList.stream().map(question -> convertQuestionToQuestionResponseDTO(question)).collect(Collectors.toList()); - } - - public StatusDTO> getAllQuestions(String status, String search) { - if (search == null) { - if (status.equalsIgnoreCase("all")) { - return new StatusDTO>("", true, convertQuestionListToQuestionResponseDTOList(questionRepository.findAll())); - } - else if (status.equalsIgnoreCase("approved")) { - return new StatusDTO>("", true, convertQuestionListToQuestionResponseDTOList(questionRepository.findByIsApprovedTrue())); - } - else if (status.equalsIgnoreCase("unapproved")) { - return new StatusDTO>("", true, convertQuestionListToQuestionResponseDTOList(questionRepository.findByIsApprovedFalse())); - } - else { - return new StatusDTO>("Provided invalid status. Should be one of 'all', 'approved' or 'unapproved'.", false, null); - } - } - else { - if (status.equalsIgnoreCase("approved")) { - return new StatusDTO>("", true, convertQuestionListToQuestionResponseDTOList(questionRepository.findByQuestionContainingIgnoreCaseAndIsApprovedTrue(search))); - } - else { - return new StatusDTO>("Question search only works with 'approved' status.", false, null); - } - } - } - - public StatusDTO createQuestion(QuestionRequestDTO questionRequestDTO, String postedBy) { - Question question = new Question(questionRequestDTO.getQuestion(), questionRequestDTO.getTopic(), questionRequestDTO.getImages(), postedBy); - // TODO: Send email to Admin that question is created - return new StatusDTO("", true, convertQuestionToQuestionResponseDTO(questionRepository.save(question))); - } - - public StatusDTO updateQuestion(QuestionUpdateDTO questionUpdateDTO, Long questionId, String approvedBy) { - Optional optionalQuestion = questionRepository.findById(questionId); - if (optionalQuestion.isEmpty()) { - return new StatusDTO("Question with ID " + questionId + " does not exist.", false, null); - } - Question question = optionalQuestion.get(); - question.setIsApproved(questionUpdateDTO.getIsApproved()); - question.setApprovedBy(approvedBy); - return new StatusDTO("", true, convertQuestionToQuestionResponseDTO(questionRepository.save(question))); - } - - public boolean deleteQuestionById(Long questionId) { - Optional optionalQuestion = questionRepository.findById(questionId); - if (optionalQuestion.isEmpty()) { - return false; - } - questionRepository.deleteById(questionId); - return true; - } - -} From 914d76b3626e3944b4fcc8c9c43aa620537361de Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 23:08:15 +0530 Subject: [PATCH 070/464] Create IUserService.java --- .../cp/doconnect/service/IUserService.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/service/IUserService.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IUserService.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IUserService.java new file mode 100644 index 0000000..92d81f8 --- /dev/null +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IUserService.java @@ -0,0 +1,19 @@ +package com.wipro.cp.doconnect.service; + +import java.util.List; + +import com.wipro.cp.doconnect.dto.StatusDTO; +import com.wipro.cp.doconnect.dto.UserRegisterDTO; +import com.wipro.cp.doconnect.dto.UserResponseDTO; +import com.wipro.cp.doconnect.dto.UserUpdateDTO; + +public interface IUserService { + + public StatusDTO createUser(UserRegisterDTO userRegisterDTO); + public List getAllUsers(); + public StatusDTO getUserById(Long id); + public StatusDTO updateUser(UserUpdateDTO userUpdateDTO, Long id); + public boolean deleteUserById(Long id); + public void deleteAllUsers(); + +} From f8b7c5123740a258c0a2ef8f067665c621030982 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 23:08:17 +0530 Subject: [PATCH 071/464] Create IQuestionService.java --- .../cp/doconnect/service/IQuestionService.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/service/IQuestionService.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IQuestionService.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IQuestionService.java new file mode 100644 index 0000000..945811b --- /dev/null +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IQuestionService.java @@ -0,0 +1,17 @@ +package com.wipro.cp.doconnect.service; + +import java.util.List; + +import com.wipro.cp.doconnect.dto.QuestionRequestDTO; +import com.wipro.cp.doconnect.dto.QuestionResponseDTO; +import com.wipro.cp.doconnect.dto.QuestionUpdateDTO; +import com.wipro.cp.doconnect.dto.StatusDTO; + +public interface IQuestionService { + + public StatusDTO> getAllQuestions(String status, String search); + public StatusDTO createQuestion(QuestionRequestDTO questionRequestDTO, String postedBy); + public StatusDTO updateQuestion(QuestionUpdateDTO questionUpdateDTO, Long questionId, String approvedBy); + public boolean deleteQuestionById(Long questionId); + +} From 8189c7931944ba7960d1a0e410f54e72e99e2cb3 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 23:08:22 +0530 Subject: [PATCH 072/464] Create IAnswerService.java --- .../cp/doconnect/service/IAnswerService.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/service/IAnswerService.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IAnswerService.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IAnswerService.java new file mode 100644 index 0000000..1a1a78f --- /dev/null +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IAnswerService.java @@ -0,0 +1,18 @@ +package com.wipro.cp.doconnect.service; + +import java.util.List; + +import com.wipro.cp.doconnect.dto.AnswerRequestDTO; +import com.wipro.cp.doconnect.dto.AnswerResponseDTO; +import com.wipro.cp.doconnect.dto.AnswerUpdateDTO; +import com.wipro.cp.doconnect.dto.StatusDTO; + +public interface IAnswerService { + + public StatusDTO> getAllAnswers(String answerStatus); + public StatusDTO> getAllAnswersForQuestionId(Long questionId, String answerStatus); + public StatusDTO createAnswerForQuestionId(Long questionId, AnswerRequestDTO answerRequestDTO, String postedBy); + public StatusDTO updateAnswerForQuestionId(Long questionId, Long answerId, AnswerUpdateDTO answerUpdateDTO, String approvedBy); + public StatusDTO deleteAnswerForQuestionById(Long questionId, Long answerId); + +} From 0caf2174980d3fc52fc02d9fb716a98984f66eba Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 23:08:25 +0530 Subject: [PATCH 073/464] Create AnswerServiceImp.java --- .../doconnect/service/AnswerServiceImp.java | 114 ++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/service/AnswerServiceImp.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/AnswerServiceImp.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/AnswerServiceImp.java new file mode 100644 index 0000000..f3a2472 --- /dev/null +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/AnswerServiceImp.java @@ -0,0 +1,114 @@ +package com.wipro.cp.doconnect.service; + +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.wipro.cp.doconnect.dto.AnswerRequestDTO; +import com.wipro.cp.doconnect.dto.AnswerResponseDTO; +import com.wipro.cp.doconnect.dto.AnswerUpdateDTO; +import com.wipro.cp.doconnect.dto.QuestionResponseDTO; +import com.wipro.cp.doconnect.dto.StatusDTO; +import com.wipro.cp.doconnect.entity.Answer; +import com.wipro.cp.doconnect.entity.Question; +import com.wipro.cp.doconnect.repository.AnswerRepository; +import com.wipro.cp.doconnect.repository.QuestionRepository; + +@Service +public class AnswerServiceImp implements IAnswerService { + + @Autowired + private AnswerRepository answerRepository; + + @Autowired + private QuestionRepository questionRepository; + + private QuestionResponseDTO convertQuestionToQuestionResponseDTO(Question question) { + return new QuestionResponseDTO(question.getId(), question.getQuestion(), question.getTopic(), question.getImages(), question.getPostedBy(), question.getPostedAt(), question.getApprovedBy(), question.getIsApproved()); + } + + private AnswerResponseDTO convertAnswerToAnswerResponseDTO(Answer answer) { + return new AnswerResponseDTO(answer.getId(), answer.getAnswer(), answer.getImages(), answer.getPostedBy(), answer.getPostedAt(), answer.getApprovedBy(), answer.getIsApproved(), convertQuestionToQuestionResponseDTO(answer.getQuestion())); + } + + private List convertAnswerListToAnswerResponseDTOList(List answerList) { + return answerList.stream().map(answer -> convertAnswerToAnswerResponseDTO(answer)).collect(Collectors.toList()); + } + + @Override + public StatusDTO> getAllAnswers(String answerStatus) { + if (answerStatus.equalsIgnoreCase("all")) { + return new StatusDTO>("", true, convertAnswerListToAnswerResponseDTOList(answerRepository.findAll())); + } + else if (answerStatus.equalsIgnoreCase("approved")) { + return new StatusDTO>("", true, convertAnswerListToAnswerResponseDTOList(answerRepository.findByIsApprovedTrue())); + } + else if (answerStatus.equalsIgnoreCase("unapproved")) { + return new StatusDTO>("", true, convertAnswerListToAnswerResponseDTOList(answerRepository.findByIsApprovedFalse())); + } + else { + return new StatusDTO>("Provided invalid status. Should be one of 'all', 'approved' or 'unapproved'.", false, null); + } + } + + @Override + public StatusDTO> getAllAnswersForQuestionId(Long questionId, String answerStatus) { + if (answerStatus.equalsIgnoreCase("all")) { + return new StatusDTO>("", true, convertAnswerListToAnswerResponseDTOList(answerRepository.findByQuestionId(questionId))); + } + else if (answerStatus.equalsIgnoreCase("approved")) { + return new StatusDTO>("", true, convertAnswerListToAnswerResponseDTOList(answerRepository.findByQuestionIdAndIsApprovedTrue(questionId))); + } + else if (answerStatus.equalsIgnoreCase("unapproved")) { + return new StatusDTO>("", true, convertAnswerListToAnswerResponseDTOList(answerRepository.findByQuestionIdAndIsApprovedFalse(questionId))); + } + else { + return new StatusDTO>("Provided invalid status. Should be one of 'all', 'approved' or 'unapproved'.", false, null); + } + } + + @Override + public StatusDTO createAnswerForQuestionId(Long questionId, AnswerRequestDTO answerRequestDTO, String postedBy) { + Optional optionalQuestion = questionRepository.findById(questionId); + if (optionalQuestion.isEmpty()) { + return new StatusDTO("Question with id " + questionId + " does not exist.", false, null); + } + Answer answer = new Answer(answerRequestDTO.getAnswer(), answerRequestDTO.getImages(), postedBy, optionalQuestion.get()); + // TODO: Send email to Admin that answer is created + return new StatusDTO("", true, convertAnswerToAnswerResponseDTO(answerRepository.save(answer))); + } + + @Override + public StatusDTO updateAnswerForQuestionId(Long questionId, Long answerId, AnswerUpdateDTO answerUpdateDTO, String approvedBy) { + boolean questionExists = questionRepository.existsById(questionId); + if (!questionExists) { + return new StatusDTO("Question with id " + questionId + " does not exist.", false, null); + } + Optional optionalAnswer = answerRepository.findByIdAndQuestionId(answerId, questionId); + if (optionalAnswer.isEmpty()) { + return new StatusDTO("Answer with id " + answerId + " does not exist for question with id " + questionId + ".", false, null); + } + Answer answer = optionalAnswer.get(); + answer.setIsApproved(answerUpdateDTO.getIsApproved()); + answer.setApprovedBy(approvedBy); + return new StatusDTO("", true, convertAnswerToAnswerResponseDTO(answerRepository.save(answer))); + } + + @Override + public StatusDTO deleteAnswerForQuestionById(Long questionId, Long answerId) { + boolean questionExists = questionRepository.existsById(questionId); + if (!questionExists) { + return new StatusDTO("Question with id " + questionId + " does not exist.", false, null); + } + Optional optionalAnswer = answerRepository.findByIdAndQuestionId(answerId, questionId); + if (optionalAnswer.isEmpty()) { + return new StatusDTO("Answer with id " + answerId + " does not exist for question with id " + questionId + ".", false, null); + } + answerRepository.delete(optionalAnswer.get()); + return new StatusDTO("", true, true); + } + +} From 64e629a315ed5a27fed9e7797a9558c8b69682a2 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 23:08:28 +0530 Subject: [PATCH 074/464] Delete AnswerService.java --- .../cp/doconnect/service/AnswerService.java | 109 ------------------ 1 file changed, 109 deletions(-) delete mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/service/AnswerService.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/AnswerService.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/AnswerService.java deleted file mode 100644 index f75052c..0000000 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/AnswerService.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.wipro.cp.doconnect.service; - -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import com.wipro.cp.doconnect.dto.AnswerRequestDTO; -import com.wipro.cp.doconnect.dto.AnswerResponseDTO; -import com.wipro.cp.doconnect.dto.AnswerUpdateDTO; -import com.wipro.cp.doconnect.dto.QuestionResponseDTO; -import com.wipro.cp.doconnect.dto.StatusDTO; -import com.wipro.cp.doconnect.entity.Answer; -import com.wipro.cp.doconnect.entity.Question; -import com.wipro.cp.doconnect.repository.AnswerRepository; -import com.wipro.cp.doconnect.repository.QuestionRepository; - -@Service -public class AnswerService { - - @Autowired - private AnswerRepository answerRepository; - - @Autowired - private QuestionRepository questionRepository; - - private QuestionResponseDTO convertQuestionToQuestionResponseDTO(Question question) { - return new QuestionResponseDTO(question.getId(), question.getQuestion(), question.getTopic(), question.getImages(), question.getPostedBy(), question.getPostedAt(), question.getApprovedBy(), question.getIsApproved()); - } - - private AnswerResponseDTO convertAnswerToAnswerResponseDTO(Answer answer) { - return new AnswerResponseDTO(answer.getId(), answer.getAnswer(), answer.getImages(), answer.getPostedBy(), answer.getPostedAt(), answer.getApprovedBy(), answer.getIsApproved(), convertQuestionToQuestionResponseDTO(answer.getQuestion())); - } - - private List convertAnswerListToAnswerResponseDTOList(List answerList) { - return answerList.stream().map(answer -> convertAnswerToAnswerResponseDTO(answer)).collect(Collectors.toList()); - } - - public StatusDTO> getAllAnswers(String answerStatus) { - if (answerStatus.equalsIgnoreCase("all")) { - return new StatusDTO>("", true, convertAnswerListToAnswerResponseDTOList(answerRepository.findAll())); - } - else if (answerStatus.equalsIgnoreCase("approved")) { - return new StatusDTO>("", true, convertAnswerListToAnswerResponseDTOList(answerRepository.findByIsApprovedTrue())); - } - else if (answerStatus.equalsIgnoreCase("unapproved")) { - return new StatusDTO>("", true, convertAnswerListToAnswerResponseDTOList(answerRepository.findByIsApprovedFalse())); - } - else { - return new StatusDTO>("Provided invalid status. Should be one of 'all', 'approved' or 'unapproved'.", false, null); - } - } - - public StatusDTO> getAllAnswersForQuestionId(Long questionId, String answerStatus) { - if (answerStatus.equalsIgnoreCase("all")) { - return new StatusDTO>("", true, convertAnswerListToAnswerResponseDTOList(answerRepository.findByQuestionId(questionId))); - } - else if (answerStatus.equalsIgnoreCase("approved")) { - return new StatusDTO>("", true, convertAnswerListToAnswerResponseDTOList(answerRepository.findByQuestionIdAndIsApprovedTrue(questionId))); - } - else if (answerStatus.equalsIgnoreCase("unapproved")) { - return new StatusDTO>("", true, convertAnswerListToAnswerResponseDTOList(answerRepository.findByQuestionIdAndIsApprovedFalse(questionId))); - } - else { - return new StatusDTO>("Provided invalid status. Should be one of 'all', 'approved' or 'unapproved'.", false, null); - } - } - - public StatusDTO createAnswerForQuestionId(Long questionId, AnswerRequestDTO answerRequestDTO, String postedBy) { - Optional optionalQuestion = questionRepository.findById(questionId); - if (optionalQuestion.isEmpty()) { - return new StatusDTO("Question with id " + questionId + " does not exist.", false, null); - } - Answer answer = new Answer(answerRequestDTO.getAnswer(), answerRequestDTO.getImages(), postedBy, optionalQuestion.get()); - // TODO: Send email to Admin that answer is created - return new StatusDTO("", true, convertAnswerToAnswerResponseDTO(answerRepository.save(answer))); - } - - public StatusDTO updateAnswerForQuestionId(Long questionId, Long answerId, AnswerUpdateDTO answerUpdateDTO, String approvedBy) { - boolean questionExists = questionRepository.existsById(questionId); - if (!questionExists) { - return new StatusDTO("Question with id " + questionId + " does not exist.", false, null); - } - Optional optionalAnswer = answerRepository.findByIdAndQuestionId(answerId, questionId); - if (optionalAnswer.isEmpty()) { - return new StatusDTO("Answer with id " + answerId + " does not exist for question with id " + questionId + ".", false, null); - } - Answer answer = optionalAnswer.get(); - answer.setIsApproved(answerUpdateDTO.getIsApproved()); - answer.setApprovedBy(approvedBy); - return new StatusDTO("", true, convertAnswerToAnswerResponseDTO(answerRepository.save(answer))); - } - - public StatusDTO deleteAnswerForQuestionById(Long questionId, Long answerId) { - boolean questionExists = questionRepository.existsById(questionId); - if (!questionExists) { - return new StatusDTO("Question with id " + questionId + " does not exist.", false, null); - } - Optional optionalAnswer = answerRepository.findByIdAndQuestionId(answerId, questionId); - if (optionalAnswer.isEmpty()) { - return new StatusDTO("Answer with id " + answerId + " does not exist for question with id " + questionId + ".", false, null); - } - answerRepository.delete(optionalAnswer.get()); - return new StatusDTO("", true, true); - } - -} From 71506487d6719b6d43fe9da6878eab65d73eedfa Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 23:08:32 +0530 Subject: [PATCH 075/464] Update User.java --- DoConnect/src/main/java/com/wipro/cp/doconnect/entity/User.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/User.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/User.java index ba094eb..1e96b6e 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/User.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/User.java @@ -37,7 +37,7 @@ public class User { @NotNull @NotEmpty - @Pattern(regexp="[A-Za-z0-9._%-+]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}") + @Pattern(regexp="[A-Za-z0-9._%-+]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}") @Size(max = 512) @Column(unique = true) private String email; From c6abba836073523ca7dc0dcf2fdabbd910cb329c Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 23:08:35 +0530 Subject: [PATCH 076/464] Update UserController.java --- .../cp/doconnect/controller/UserController.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/UserController.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/UserController.java index 469b7fc..a423ee9 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/UserController.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/UserController.java @@ -21,23 +21,23 @@ import com.wipro.cp.doconnect.dto.UserRegisterDTO; import com.wipro.cp.doconnect.dto.UserResponseDTO; import com.wipro.cp.doconnect.dto.UserUpdateDTO; -import com.wipro.cp.doconnect.service.UserService; +import com.wipro.cp.doconnect.service.UserServiceImp; @RestController @CrossOrigin public class UserController { @Autowired - private UserService userService; + private UserServiceImp userServiceImp; @GetMapping("/users") public ResponseEntity> getAllUsers() { - return ResponseEntity.ok(userService.getAllUsers()); + return ResponseEntity.ok(userServiceImp.getAllUsers()); } @GetMapping("/users/{id}") public ResponseEntity getUserById(@PathVariable @Min(1) Long id) { - StatusDTO userStatus = userService.getUserById(id); + StatusDTO userStatus = userServiceImp.getUserById(id); if (!userStatus.getIsValid()) { return ResponseEntity.status(HttpStatus.NOT_FOUND).body(userStatus.getStatusMessage()); } @@ -46,7 +46,7 @@ public ResponseEntity getUserById(@PathVariable @Min(1) Long id) { @PostMapping("/users") public ResponseEntity createUser(@Valid @RequestBody UserRegisterDTO userRegisterDTO) { - StatusDTO userStatus = userService.createUser(userRegisterDTO); + StatusDTO userStatus = userServiceImp.createUser(userRegisterDTO); if (!userStatus.getIsValid()) { return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(userStatus.getStatusMessage()); } @@ -55,7 +55,7 @@ public ResponseEntity createUser(@Valid @RequestBody UserRegisterDTO userRegi @PutMapping("/users/{id}") public ResponseEntity updateUser(@Valid @RequestBody UserUpdateDTO userUpdateDTO, @PathVariable Long id) { - StatusDTO userStatus = userService.updateUser(userUpdateDTO, id); + StatusDTO userStatus = userServiceImp.updateUser(userUpdateDTO, id); if (!userStatus.getIsValid()) { return ResponseEntity.status(HttpStatus.NOT_FOUND).body(userStatus.getStatusMessage()); } @@ -64,7 +64,7 @@ public ResponseEntity updateUser(@Valid @RequestBody UserUpdateDTO userUpdate @DeleteMapping("/users/{id}") public ResponseEntity deleteUserById(@PathVariable @Min(1) Long id) { - boolean deleted = userService.deleteUserById(id); + boolean deleted = userServiceImp.deleteUserById(id); if (deleted) { return ResponseEntity.ok("User deleted successfully."); } @@ -73,7 +73,7 @@ public ResponseEntity deleteUserById(@PathVariable @Min(1) Long id) { @DeleteMapping("/users") public ResponseEntity deleteAllUser() { - userService.deleteAllUsers(); + userServiceImp.deleteAllUsers(); return ResponseEntity.ok("All users deleted successfully."); } From 688b4a0884417dda6714b97a1ce9ce05d8fba79a Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 23:08:38 +0530 Subject: [PATCH 077/464] Update QuestionController.java --- .../cp/doconnect/controller/QuestionController.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/QuestionController.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/QuestionController.java index de01d4e..2b1fc1a 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/QuestionController.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/QuestionController.java @@ -23,14 +23,14 @@ import com.wipro.cp.doconnect.dto.QuestionResponseDTO; import com.wipro.cp.doconnect.dto.QuestionUpdateDTO; import com.wipro.cp.doconnect.dto.StatusDTO; -import com.wipro.cp.doconnect.service.QuestionService; +import com.wipro.cp.doconnect.service.QuestionServiceImp; @RestController @CrossOrigin public class QuestionController { @Autowired - private QuestionService questionService; + private QuestionServiceImp questionServiceImp; @GetMapping("/questions") public ResponseEntity getAllQuestions(@RequestParam(name="status") Optional optionalStatus, @RequestParam(name="search") Optional optionalSearch) { @@ -42,7 +42,7 @@ public ResponseEntity getAllQuestions(@RequestParam(name="status") Optional> questionStatus = questionService.getAllQuestions(status, search); + StatusDTO> questionStatus = questionServiceImp.getAllQuestions(status, search); if (!questionStatus.getIsValid()) { return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(questionStatus.getStatusMessage()); } @@ -53,7 +53,7 @@ public ResponseEntity getAllQuestions(@RequestParam(name="status") Optional createQuestion(@Valid @RequestBody QuestionRequestDTO questionRequestDTO) { // TODO: Read the postedBy value from Authorization Header String postedBy = "Dummy"; - StatusDTO questionStatus = questionService.createQuestion(questionRequestDTO, postedBy); + StatusDTO questionStatus = questionServiceImp.createQuestion(questionRequestDTO, postedBy); if (!questionStatus.getIsValid()) { return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(questionStatus.getStatusMessage()); } @@ -64,7 +64,7 @@ public ResponseEntity createQuestion(@Valid @RequestBody QuestionRequestDTO q public ResponseEntity updateQuestion(@Valid @RequestBody QuestionUpdateDTO questionUpdateDTO, @PathVariable Long questionId) { // TODO: Read the approvedBy value from Authorization Header String approvedBy = ""; - StatusDTO questionStatus = questionService.updateQuestion(questionUpdateDTO, questionId, approvedBy); + StatusDTO questionStatus = questionServiceImp.updateQuestion(questionUpdateDTO, questionId, approvedBy); if (!questionStatus.getIsValid()) { return ResponseEntity.status(HttpStatus.NOT_FOUND).body(questionStatus.getStatusMessage()); } @@ -73,7 +73,7 @@ public ResponseEntity updateQuestion(@Valid @RequestBody QuestionUpdateDTO qu @DeleteMapping("/questions/{questionId}") public ResponseEntity deleteQuestionById(@PathVariable @Min(1) Long questionId) { - boolean deleted = questionService.deleteQuestionById(questionId); + boolean deleted = questionServiceImp.deleteQuestionById(questionId); if (deleted) { return ResponseEntity.ok("Question deleted successfully."); } From 3201838351348c2c4af3f0389ffbc4209f0c7f06 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Wed, 24 Aug 2022 23:08:41 +0530 Subject: [PATCH 078/464] Update AnswerController.java --- .../cp/doconnect/controller/AnswerController.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AnswerController.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AnswerController.java index 754d407..4cb6f91 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AnswerController.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AnswerController.java @@ -22,14 +22,14 @@ import com.wipro.cp.doconnect.dto.AnswerResponseDTO; import com.wipro.cp.doconnect.dto.AnswerUpdateDTO; import com.wipro.cp.doconnect.dto.StatusDTO; -import com.wipro.cp.doconnect.service.AnswerService; +import com.wipro.cp.doconnect.service.AnswerServiceImp; @RestController @CrossOrigin public class AnswerController { @Autowired - AnswerService answerService; + AnswerServiceImp answerServiceImp; @GetMapping("/answers") public ResponseEntity getAllAnswers(@RequestParam(name="status") Optional optionalStatus) { @@ -37,7 +37,7 @@ public ResponseEntity getAllAnswers(@RequestParam(name="status") Optional> answerResponseDTOStatus = answerService.getAllAnswers(answerStatus); + StatusDTO> answerResponseDTOStatus = answerServiceImp.getAllAnswers(answerStatus); if (!answerResponseDTOStatus.getIsValid()) { return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(answerResponseDTOStatus.getStatusMessage()); } @@ -50,7 +50,7 @@ public ResponseEntity getAllAnswersForQuestionId(@PathVariable(value="questio if (optionalStatus.isPresent()) { answerStatus = optionalStatus.get(); } - StatusDTO> answerResponseDTOStatus = answerService.getAllAnswersForQuestionId(questionId, answerStatus); + StatusDTO> answerResponseDTOStatus = answerServiceImp.getAllAnswersForQuestionId(questionId, answerStatus); if (!answerResponseDTOStatus.getIsValid()) { return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(answerResponseDTOStatus.getStatusMessage()); } @@ -61,7 +61,7 @@ public ResponseEntity getAllAnswersForQuestionId(@PathVariable(value="questio public ResponseEntity createAnswerForQuestionId(@PathVariable(value="questionId") Long questionId, @Valid @RequestBody AnswerRequestDTO answerRequestDTO) { // TODO: Read the postedBy value from Authorization Header String postedBy = "Dummy"; - StatusDTO answerResponseDTOStatus = answerService.createAnswerForQuestionId(questionId, answerRequestDTO, postedBy); + StatusDTO answerResponseDTOStatus = answerServiceImp.createAnswerForQuestionId(questionId, answerRequestDTO, postedBy); if (!answerResponseDTOStatus.getIsValid()) { return ResponseEntity.status(HttpStatus.NOT_FOUND).body(answerResponseDTOStatus.getStatusMessage()); } @@ -72,7 +72,7 @@ public ResponseEntity createAnswerForQuestionId(@PathVariable(value="question public ResponseEntity updateAnswerForQuestionId(@Valid @RequestBody AnswerUpdateDTO answerUpdateDTO, @PathVariable(value="questionId") Long questionId, @PathVariable(value="answerId") Long answerId) { // TODO: Read the approvedBy value from Authorization Header String approvedBy = ""; - StatusDTO answerResponseDTOStatus = answerService.updateAnswerForQuestionId(questionId, answerId, answerUpdateDTO, approvedBy); + StatusDTO answerResponseDTOStatus = answerServiceImp.updateAnswerForQuestionId(questionId, answerId, answerUpdateDTO, approvedBy); if (!answerResponseDTOStatus.getIsValid()) { return ResponseEntity.status(HttpStatus.NOT_FOUND).body(answerResponseDTOStatus.getStatusMessage()); } @@ -81,7 +81,7 @@ public ResponseEntity updateAnswerForQuestionId(@Valid @RequestBody AnswerUpd @DeleteMapping("/questions/{questionId}/answers/{answerId}") public ResponseEntity deleteAnswerForQuestionById(@PathVariable(value="questionId") Long questionId, @PathVariable(value="answerId") Long answerId) { - StatusDTO deletionStatus = answerService.deleteAnswerForQuestionById(questionId, answerId); + StatusDTO deletionStatus = answerServiceImp.deleteAnswerForQuestionById(questionId, answerId); if (!deletionStatus.getIsValid()) { return ResponseEntity.status(HttpStatus.NOT_FOUND).body(deletionStatus.getStatusMessage()); } From bbfff4dd670afebae283a91dc42efb8de6323953 Mon Sep 17 00:00:00 2001 From: komal0112 Date: Wed, 24 Aug 2022 23:22:13 +0530 Subject: [PATCH 079/464] myfirstcommit --- doconnect_chat_service-main/.gitignore | 33 ++ .../.mvn/wrapper/maven-wrapper.jar | Bin 0 -> 58727 bytes .../.mvn/wrapper/maven-wrapper.properties | 2 + doconnect_chat_service-main/README.md | 92 +++++ doconnect_chat_service-main/mvnw | 316 ++++++++++++++++++ doconnect_chat_service-main/mvnw.cmd | 188 +++++++++++ doconnect_chat_service-main/pom.xml | 71 ++++ .../DoConnectChatServiceApplication.java | 13 + .../controller/MessageController.java | 37 ++ .../wipro/doconnectchat/dto/MessageDTO.java | 43 +++ .../wipro/doconnectchat/dto/ResponseDTO.java | 33 ++ .../wipro/doconnectchat/entity/Message.java | 54 +++ .../repository/IMessageRepo.java | 11 + .../service/IMessageService.java | 15 + .../service/IMessageServiceImpl.java | 52 +++ .../src/main/resources/application.properties | 13 + .../DoConnectChatServiceApplicationTests.java | 13 + 17 files changed, 986 insertions(+) create mode 100644 doconnect_chat_service-main/.gitignore create mode 100644 doconnect_chat_service-main/.mvn/wrapper/maven-wrapper.jar create mode 100644 doconnect_chat_service-main/.mvn/wrapper/maven-wrapper.properties create mode 100644 doconnect_chat_service-main/README.md create mode 100644 doconnect_chat_service-main/mvnw create mode 100644 doconnect_chat_service-main/mvnw.cmd create mode 100644 doconnect_chat_service-main/pom.xml create mode 100644 doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/DoConnectChatServiceApplication.java create mode 100644 doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/controller/MessageController.java create mode 100644 doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/dto/MessageDTO.java create mode 100644 doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/dto/ResponseDTO.java create mode 100644 doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/entity/Message.java create mode 100644 doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/repository/IMessageRepo.java create mode 100644 doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/service/IMessageService.java create mode 100644 doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/service/IMessageServiceImpl.java create mode 100644 doconnect_chat_service-main/src/main/resources/application.properties create mode 100644 doconnect_chat_service-main/src/test/java/com/wipro/doconnectchat/DoConnectChatServiceApplicationTests.java diff --git a/doconnect_chat_service-main/.gitignore b/doconnect_chat_service-main/.gitignore new file mode 100644 index 0000000..549e00a --- /dev/null +++ b/doconnect_chat_service-main/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/doconnect_chat_service-main/.mvn/wrapper/maven-wrapper.jar b/doconnect_chat_service-main/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..c1dd12f17644411d6e840bd5a10c6ecda0175f18 GIT binary patch literal 58727 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%0ANsA|A3-jj|r`KAo%oTajX3>^E` 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 YM{}PByk10KD_nuQ4E7Du?}+~TKh4V)`~Uy| literal 0 HcmV?d00001 diff --git a/doconnect_chat_service-main/.mvn/wrapper/maven-wrapper.properties b/doconnect_chat_service-main/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..22f219d --- /dev/null +++ b/doconnect_chat_service-main/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,2 @@ +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.5/apache-maven-3.8.5-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar diff --git a/doconnect_chat_service-main/README.md b/doconnect_chat_service-main/README.md new file mode 100644 index 0000000..6673151 --- /dev/null +++ b/doconnect_chat_service-main/README.md @@ -0,0 +1,92 @@ +# DoConnect_chat_service + +Chat service for the DoConnect capstone project + +## Getting started + +To make it easy for you to get started with GitLab, here's a list of recommended next steps. + +Already a pro? Just edit this README.md and make it your own. Want to make it easy? [Use the template at the bottom](#editing-this-readme)! + +## Add your files + +- [ ] [Create](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#create-a-file) or [upload](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#upload-a-file) files +- [ ] [Add files using the command line](https://docs.gitlab.com/ee/gitlab-basics/add-file.html#add-a-file-using-the-command-line) or push an existing Git repository with the following command: + +``` +cd existing_repo +git remote add origin https://gitlab.com/kunalwithkumar/doconnect_chat_service.git +git branch -M main +git push -uf origin main +``` + +## Integrate with your tools + +- [ ] [Set up project integrations](https://gitlab.com/kunalwithkumar/doconnect_chat_service/-/settings/integrations) + +## Collaborate with your team + +- [ ] [Invite team members and collaborators](https://docs.gitlab.com/ee/user/project/members/) +- [ ] [Create a new merge request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html) +- [ ] [Automatically close issues from merge requests](https://docs.gitlab.com/ee/user/project/issues/managing_issues.html#closing-issues-automatically) +- [ ] [Enable merge request approvals](https://docs.gitlab.com/ee/user/project/merge_requests/approvals/) +- [ ] [Automatically merge when pipeline succeeds](https://docs.gitlab.com/ee/user/project/merge_requests/merge_when_pipeline_succeeds.html) + +## Test and Deploy + +Use the built-in continuous integration in GitLab. + +- [ ] [Get started with GitLab CI/CD](https://docs.gitlab.com/ee/ci/quick_start/index.html) +- [ ] [Analyze your code for known vulnerabilities with Static Application Security Testing(SAST)](https://docs.gitlab.com/ee/user/application_security/sast/) +- [ ] [Deploy to Kubernetes, Amazon EC2, or Amazon ECS using Auto Deploy](https://docs.gitlab.com/ee/topics/autodevops/requirements.html) +- [ ] [Use pull-based deployments for improved Kubernetes management](https://docs.gitlab.com/ee/user/clusters/agent/) +- [ ] [Set up protected environments](https://docs.gitlab.com/ee/ci/environments/protected_environments.html) + +*** + +# Editing this README + +When you're ready to make this README your own, just edit this file and use the handy template below (or feel free to structure it however you want - this is just a starting point!). Thank you to [makeareadme.com](https://www.makeareadme.com/) for this template. + +## Suggestions for a good README +Every project is different, so consider which of these sections apply to yours. The sections used in the template are suggestions for most open source projects. Also keep in mind that while a README can be too long and detailed, too long is better than too short. If you think your README is too long, consider utilizing another form of documentation rather than cutting out information. + +## Name +Choose a self-explaining name for your project. + +## Description +Let people know what your project can do specifically. Provide context and add a link to any reference visitors might be unfamiliar with. A list of Features or a Background subsection can also be added here. If there are alternatives to your project, this is a good place to list differentiating factors. + +## Badges +On some READMEs, you may see small images that convey metadata, such as whether or not all the tests are passing for the project. You can use Shields to add some to your README. Many services also have instructions for adding a badge. + +## Visuals +Depending on what you are making, it can be a good idea to include screenshots or even a video (you'll frequently see GIFs rather than actual videos). Tools like ttygif can help, but check out Asciinema for a more sophisticated method. + +## Installation +Within a particular ecosystem, there may be a common way of installing things, such as using Yarn, NuGet, or Homebrew. However, consider the possibility that whoever is reading your README is a novice and would like more guidance. Listing specific steps helps remove ambiguity and gets people to using your project as quickly as possible. If it only runs in a specific context like a particular programming language version or operating system or has dependencies that have to be installed manually, also add a Requirements subsection. + +## Usage +Use examples liberally, and show the expected output if you can. It's helpful to have inline the smallest example of usage that you can demonstrate, while providing links to more sophisticated examples if they are too long to reasonably include in the README. + +## Support +Tell people where they can go to for help. It can be any combination of an issue tracker, a chat room, an email address, etc. + +## Roadmap +If you have ideas for releases in the future, it is a good idea to list them in the README. + +## Contributing +State if you are open to contributions and what your requirements are for accepting them. + +For people who want to make changes to your project, it's helpful to have some documentation on how to get started. Perhaps there is a script that they should run or some environment variables that they need to set. Make these steps explicit. These instructions could also be useful to your future self. + +You can also document commands to lint the code or run tests. These steps help to ensure high code quality and reduce the likelihood that the changes inadvertently break something. Having instructions for running tests is especially helpful if it requires external setup, such as starting a Selenium server for testing in a browser. + +## Authors and acknowledgment +Show your appreciation to those who have contributed to the project. + +## License +For open source projects, say how it is licensed. + +## Project status +If you have run out of energy or time for your project, put a note at the top of the README saying that development has slowed down or stopped completely. Someone may choose to fork your project or volunteer to step in as a maintainer or owner, allowing your project to keep going. You can also make an explicit request for maintainers. diff --git a/doconnect_chat_service-main/mvnw b/doconnect_chat_service-main/mvnw new file mode 100644 index 0000000..8a8fb22 --- /dev/null +++ b/doconnect_chat_service-main/mvnw @@ -0,0 +1,316 @@ +#!/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 +# +# https://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 /usr/local/etc/mavenrc ] ; then + . /usr/local/etc/mavenrc + fi + + 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="`\\unset -f command; \\command -v 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/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.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" || rm -f "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" || rm -f "$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 \ + $MAVEN_DEBUG_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" \ + "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/doconnect_chat_service-main/mvnw.cmd b/doconnect_chat_service-main/mvnw.cmd new file mode 100644 index 0000000..1d8ab01 --- /dev/null +++ b/doconnect_chat_service-main/mvnw.cmd @@ -0,0 +1,188 @@ +@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 https://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 "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* +if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\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/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + +FOR /F "usebackq 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%/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.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 "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" +if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\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% + +cmd /C exit /B %ERROR_CODE% diff --git a/doconnect_chat_service-main/pom.xml b/doconnect_chat_service-main/pom.xml new file mode 100644 index 0000000..0f35ceb --- /dev/null +++ b/doconnect_chat_service-main/pom.xml @@ -0,0 +1,71 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.7.1 + + + com.wipro + doConnect_chat_service + 0.0.1-SNAPSHOT + doConnect_chat_service + DoConnect as per the capstone + + 11 + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-validation + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-websocket + + + + mysql + mysql-connector-java + runtime + + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + + diff --git a/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/DoConnectChatServiceApplication.java b/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/DoConnectChatServiceApplication.java new file mode 100644 index 0000000..e8d3f13 --- /dev/null +++ b/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/DoConnectChatServiceApplication.java @@ -0,0 +1,13 @@ +package com.wipro.doconnectchat; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class DoConnectChatServiceApplication { + + public static void main(String[] args) { + SpringApplication.run(DoConnectChatServiceApplication.class, args); + } + +} diff --git a/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/controller/MessageController.java b/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/controller/MessageController.java new file mode 100644 index 0000000..d40dece --- /dev/null +++ b/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/controller/MessageController.java @@ -0,0 +1,37 @@ +package com.wipro.doconnectchat.controller; + +import java.util.List; + +import javax.validation.Valid; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.wipro.doconnectchat.dto.MessageDTO; +import com.wipro.doconnectchat.service.IMessageService; + +@RestController +@RequestMapping("/chat") +@CrossOrigin +public class MessageController { + + @Autowired + private IMessageService messageService; + + @PostMapping("/sendMessage") + public MessageDTO sendMessage(@Valid @RequestBody MessageDTO messageDTO) { + return messageService.sendMessage(messageDTO); + } + + @GetMapping("/getMessage") + public List getMessage() { + return messageService.getMessage(); + } + +} + diff --git a/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/dto/MessageDTO.java b/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/dto/MessageDTO.java new file mode 100644 index 0000000..f7c69e7 --- /dev/null +++ b/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/dto/MessageDTO.java @@ -0,0 +1,43 @@ +package com.wipro.doconnectchat.dto; + +import javax.validation.constraints.NotBlank; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class MessageDTO { + + @NotBlank(message = "provide the user Details") + private String fromUser; + @NotBlank(message = "provide message") + private String message; + public String getFromUser() { + return fromUser; + } + public void setFromUser(String fromUser) { + this.fromUser = fromUser; + } + public String getMessage() { + return message; + } + public void setMessage(String message) { + this.message = message; + } + public MessageDTO(@NotBlank(message = "provide the user Details") String fromUser, + @NotBlank(message = "provide message") String message) { + super(); + this.fromUser = fromUser; + this.message = message; + } + public MessageDTO() { + super(); + // TODO Auto-generated constructor stub + } + + + +} diff --git a/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/dto/ResponseDTO.java b/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/dto/ResponseDTO.java new file mode 100644 index 0000000..c7757f2 --- /dev/null +++ b/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/dto/ResponseDTO.java @@ -0,0 +1,33 @@ +package com.wipro.doconnectchat.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ResponseDTO { + + private String response; + + public String getResponse() { + return response; + } + + public void setResponse(String response) { + this.response = response; + } + + public ResponseDTO(String response) { + super(); + this.response = response; + } + + public ResponseDTO() { + super(); + // TODO Auto-generated constructor stub + } + + +} diff --git a/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/entity/Message.java b/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/entity/Message.java new file mode 100644 index 0000000..ddb6b0a --- /dev/null +++ b/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/entity/Message.java @@ -0,0 +1,54 @@ +package com.wipro.doconnectchat.entity; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Entity +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Message { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + // @NotBlank(message = "To which user u want to send") + private String message; + private String fromUser; + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } + public String getMessage() { + return message; + } + public void setMessage(String message) { + this.message = message; + } + public String getFromUser() { + return fromUser; + } + public void setFromUser(String fromUser) { + this.fromUser = fromUser; + } + public Message(Long id, String message, String fromUser) { + super(); + this.id = id; + this.message = message; + this.fromUser = fromUser; + } + public Message() { + super(); + // TODO Auto-generated constructor stub + } + +} diff --git a/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/repository/IMessageRepo.java b/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/repository/IMessageRepo.java new file mode 100644 index 0000000..a674eb4 --- /dev/null +++ b/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/repository/IMessageRepo.java @@ -0,0 +1,11 @@ +package com.wipro.doconnectchat.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import com.wipro.doconnectchat.entity.Message; + +@Repository +public interface IMessageRepo extends JpaRepository { + +} diff --git a/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/service/IMessageService.java b/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/service/IMessageService.java new file mode 100644 index 0000000..1f42951 --- /dev/null +++ b/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/service/IMessageService.java @@ -0,0 +1,15 @@ +package com.wipro.doconnectchat.service; + +import java.util.List; + +import javax.validation.Valid; + +import com.wipro.doconnectchat.dto.MessageDTO; + +public interface IMessageService { + + public MessageDTO sendMessage(@Valid MessageDTO messageDTO); + + public List getMessage(); + +} diff --git a/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/service/IMessageServiceImpl.java b/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/service/IMessageServiceImpl.java new file mode 100644 index 0000000..9b71ab6 --- /dev/null +++ b/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/service/IMessageServiceImpl.java @@ -0,0 +1,52 @@ +package com.wipro.doconnectchat.service; + +import java.util.ArrayList; +import java.util.List; + +import javax.validation.Valid; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.wipro.doconnectchat.dto.MessageDTO; +import com.wipro.doconnectchat.entity.Message; +import com.wipro.doconnectchat.repository.IMessageRepo; + +@Service +public class IMessageServiceImpl implements IMessageService { + + @Autowired + private IMessageRepo messageRepo; + + @Override + public MessageDTO sendMessage(@Valid MessageDTO messageDTO) { + + Message message = new Message(); + message.setMessage(messageDTO.getMessage()); + message.setFromUser(messageDTO.getFromUser()); + message = messageRepo.save(message); + + messageDTO.setFromUser(message.getFromUser()); + messageDTO.setMessage(message.getMessage()); + + return messageDTO; + } + + @Override + public List getMessage() { + List data = new ArrayList(); + + List messages = messageRepo.findAll(); + for (Message message : messages) { + + MessageDTO messageDTO = new MessageDTO(); + messageDTO.setFromUser(message.getFromUser()); + messageDTO.setMessage(message.getMessage()); + data.add(messageDTO); + + } + + return data; + } + +} diff --git a/doconnect_chat_service-main/src/main/resources/application.properties b/doconnect_chat_service-main/src/main/resources/application.properties new file mode 100644 index 0000000..6802dd8 --- /dev/null +++ b/doconnect_chat_service-main/src/main/resources/application.properties @@ -0,0 +1,13 @@ + +#port Number +server.port=9595 + +#hibernate +spring.jpa.hibernate.ddl-auto=update +spring.jpa.show-sql=true + +#database configuration : mysql +spring.datasource.url=jdbc:mysql://localhost:3306/doConectChatDB +spring.datasource.username=root +spring.datasource.password=ROOT +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver diff --git a/doconnect_chat_service-main/src/test/java/com/wipro/doconnectchat/DoConnectChatServiceApplicationTests.java b/doconnect_chat_service-main/src/test/java/com/wipro/doconnectchat/DoConnectChatServiceApplicationTests.java new file mode 100644 index 0000000..72592d2 --- /dev/null +++ b/doconnect_chat_service-main/src/test/java/com/wipro/doconnectchat/DoConnectChatServiceApplicationTests.java @@ -0,0 +1,13 @@ +package com.wipro.doconnectchat; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class DoConnectChatServiceApplicationTests { + + @Test + void contextLoads() { + } + +} From c16e29ca3b171a620f486489d1111b518fbea93b Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Thu, 25 Aug 2022 01:09:14 +0530 Subject: [PATCH 080/464] Update application.properties --- DoConnect/src/main/resources/application.properties | 2 ++ 1 file changed, 2 insertions(+) diff --git a/DoConnect/src/main/resources/application.properties b/DoConnect/src/main/resources/application.properties index 3a76668..cfc5cbc 100644 --- a/DoConnect/src/main/resources/application.properties +++ b/DoConnect/src/main/resources/application.properties @@ -12,3 +12,5 @@ jwt.secret=devashishpathrabe spring.main.allow-circular-references=true spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true + +image-storage-directory=/do_connect_images From 5672716424be4b1a658be948e051c74eaa4d8b77 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Thu, 25 Aug 2022 01:09:18 +0530 Subject: [PATCH 081/464] Update UserController.java --- .../java/com/wipro/cp/doconnect/controller/UserController.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/UserController.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/UserController.java index a423ee9..91f1a60 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/UserController.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/UserController.java @@ -15,6 +15,7 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.wipro.cp.doconnect.dto.StatusDTO; @@ -25,6 +26,7 @@ @RestController @CrossOrigin +@RequestMapping("/api/v1") public class UserController { @Autowired From 46764c684a3f93ba3429ed667ca503efe490b256 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Thu, 25 Aug 2022 01:09:20 +0530 Subject: [PATCH 082/464] Update QuestionController.java --- .../com/wipro/cp/doconnect/controller/QuestionController.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/QuestionController.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/QuestionController.java index 2b1fc1a..e562de9 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/QuestionController.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/QuestionController.java @@ -16,6 +16,7 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @@ -27,6 +28,7 @@ @RestController @CrossOrigin +@RequestMapping("/api/v1") public class QuestionController { @Autowired From 6ae944d0698a3237bcb4e93058c25b0ab02dc4d9 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Thu, 25 Aug 2022 01:09:24 +0530 Subject: [PATCH 083/464] Create ImageController.java --- .../doconnect/controller/ImageController.java | 89 +++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/controller/ImageController.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/ImageController.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/ImageController.java new file mode 100644 index 0000000..2f3388c --- /dev/null +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/ImageController.java @@ -0,0 +1,89 @@ +package com.wipro.cp.doconnect.controller; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardOpenOption; +import java.time.Clock; +import java.util.Optional; +import java.util.Random; + +import javax.annotation.PostConstruct; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.io.PathResource; +import org.springframework.core.io.Resource; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +@RestController +@CrossOrigin +@RequestMapping("/api/v1") +public class ImageController { + + private final Path imageStorageDirectory; + + /* The target path can be configured in the application.properties */ + public ImageController(@Value("${image-storage-directory}") Path imageStorageDirectory) { + this.imageStorageDirectory = imageStorageDirectory; + } + + @PostConstruct + public void ensureDirectoryExists() throws IOException { + if (!Files.exists(this.imageStorageDirectory)) { + Path path = Files.createDirectories(this.imageStorageDirectory); + System.out.println("****Hello****" + path.toString()); + } + } + + private static Optional getFileExtension(String fileName) { + final int indexOfLastDot = fileName.lastIndexOf('.'); + if (indexOfLastDot == -1) { + return Optional.empty(); + } else { + return Optional.of(fileName.substring(indexOfLastDot + 1)); + } + } + + private static String generateFileName() { + Random rnd = new Random(); + int number = rnd.nextInt(99999); + Clock clock = Clock.systemDefaultZone(); + long milliseconds = clock.millis(); + return String.format("%d%05d", milliseconds, number); + } + + @PostMapping(value = "/images", produces = MediaType.TEXT_PLAIN_VALUE) + public ResponseEntity uploadImage(@RequestPart(name = "image", required = true) MultipartFile imageFile) throws IOException { + final String fileExtension = Optional.ofNullable(imageFile.getOriginalFilename()).flatMap(ImageController::getFileExtension).orElse(""); + final String targetFileName = generateFileName() + "." + fileExtension; + final Path targetPath = this.imageStorageDirectory.resolve(targetFileName); + System.out.println("****Hello****01" + targetPath.toString()); + try (InputStream in = imageFile.getInputStream()) { + try (OutputStream out = Files.newOutputStream(targetPath, StandardOpenOption.CREATE)) { + in.transferTo(out); + } + } + return ResponseEntity.ok(targetFileName); + } + + @GetMapping("/images/{fileName}") + public ResponseEntity downloadImage(@PathVariable("fileName") String fileName) { + final Path targetPath = this.imageStorageDirectory.resolve(fileName); + if (!Files.exists(targetPath)) { + return ResponseEntity.notFound().build(); + } + return ResponseEntity.ok(new PathResource(targetPath)); + } + +} From 99d40bd6ff8d9caa4e86136a04dd6800362dad81 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Thu, 25 Aug 2022 01:09:26 +0530 Subject: [PATCH 084/464] Update AnswerController.java --- .../com/wipro/cp/doconnect/controller/AnswerController.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AnswerController.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AnswerController.java index 4cb6f91..623c0cc 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AnswerController.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AnswerController.java @@ -15,6 +15,7 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @@ -26,6 +27,7 @@ @RestController @CrossOrigin +@RequestMapping("/api/v1") public class AnswerController { @Autowired From 7bcfd26ead76b4e766b46c633a7e8e9f3f1fdffd Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Thu, 25 Aug 2022 11:49:05 +0530 Subject: [PATCH 085/464] Update ImageController.java --- .../com/wipro/cp/doconnect/controller/ImageController.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/ImageController.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/ImageController.java index 2f3388c..f374588 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/ImageController.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/ImageController.java @@ -41,8 +41,7 @@ public ImageController(@Value("${image-storage-directory}") Path imageStorageDir @PostConstruct public void ensureDirectoryExists() throws IOException { if (!Files.exists(this.imageStorageDirectory)) { - Path path = Files.createDirectories(this.imageStorageDirectory); - System.out.println("****Hello****" + path.toString()); + Files.createDirectories(this.imageStorageDirectory); } } @@ -68,7 +67,6 @@ public ResponseEntity uploadImage(@RequestPart(name = "image", required final String fileExtension = Optional.ofNullable(imageFile.getOriginalFilename()).flatMap(ImageController::getFileExtension).orElse(""); final String targetFileName = generateFileName() + "." + fileExtension; final Path targetPath = this.imageStorageDirectory.resolve(targetFileName); - System.out.println("****Hello****01" + targetPath.toString()); try (InputStream in = imageFile.getInputStream()) { try (OutputStream out = Files.newOutputStream(targetPath, StandardOpenOption.CREATE)) { in.transferTo(out); From 4d4797f72ce3b2d961d39c11b4cdda5ebd822ca6 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Thu, 25 Aug 2022 14:19:33 +0530 Subject: [PATCH 086/464] Update ImageController.java --- .../doconnect/controller/ImageController.java | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/ImageController.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/ImageController.java index f374588..c2ef321 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/ImageController.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/ImageController.java @@ -7,14 +7,15 @@ import java.nio.file.Path; import java.nio.file.StandardOpenOption; import java.time.Clock; +import java.util.Arrays; import java.util.Optional; import java.util.Random; import javax.annotation.PostConstruct; import org.springframework.beans.factory.annotation.Value; -import org.springframework.core.io.PathResource; -import org.springframework.core.io.Resource; +import org.springframework.core.io.InputStreamResource; +import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.CrossOrigin; @@ -32,6 +33,7 @@ public class ImageController { private final Path imageStorageDirectory; + private final String[] validExtensions = {"png", "jpeg"}; /* The target path can be configured in the application.properties */ public ImageController(@Value("${image-storage-directory}") Path imageStorageDirectory) { @@ -54,6 +56,13 @@ private static Optional getFileExtension(String fileName) { } } + private boolean isValidFileExtension(String fileExtension) { + if (fileExtension.isBlank()) { + return false; + } + return Arrays.stream(validExtensions).anyMatch(fileExtension::equals); + } + private static String generateFileName() { Random rnd = new Random(); int number = rnd.nextInt(99999); @@ -65,6 +74,9 @@ private static String generateFileName() { @PostMapping(value = "/images", produces = MediaType.TEXT_PLAIN_VALUE) public ResponseEntity uploadImage(@RequestPart(name = "image", required = true) MultipartFile imageFile) throws IOException { final String fileExtension = Optional.ofNullable(imageFile.getOriginalFilename()).flatMap(ImageController::getFileExtension).orElse(""); + if (!isValidFileExtension(fileExtension)) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("File extension is invalid. Should be either 'png' or 'jpeg'."); + } final String targetFileName = generateFileName() + "." + fileExtension; final Path targetPath = this.imageStorageDirectory.resolve(targetFileName); try (InputStream in = imageFile.getInputStream()) { @@ -76,12 +88,18 @@ public ResponseEntity uploadImage(@RequestPart(name = "image", required } @GetMapping("/images/{fileName}") - public ResponseEntity downloadImage(@PathVariable("fileName") String fileName) { + public ResponseEntity downloadImage(@PathVariable("fileName") String fileName) throws IOException { + String fileExtension = Optional.ofNullable(fileName).flatMap(ImageController::getFileExtension).orElse(""); + if (!isValidFileExtension(fileExtension)) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("File extension is invalid. Should be either 'png' or 'jpeg'."); + } + MediaType contentType = (fileExtension.equalsIgnoreCase("jpeg")) ? MediaType.IMAGE_JPEG : MediaType.IMAGE_PNG; final Path targetPath = this.imageStorageDirectory.resolve(fileName); if (!Files.exists(targetPath)) { return ResponseEntity.notFound().build(); } - return ResponseEntity.ok(new PathResource(targetPath)); + InputStream inputStream = Files.newInputStream(targetPath); + return ResponseEntity.ok().contentType(contentType).body(new InputStreamResource(inputStream)); } } From dc1e216d6ecc0a1e878149b5e4f0c13f213bb87d Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Thu, 25 Aug 2022 15:52:10 +0530 Subject: [PATCH 087/464] Update pom.xml --- DoConnect/pom.xml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/DoConnect/pom.xml b/DoConnect/pom.xml index 5b3aff2..f1672fe 100644 --- a/DoConnect/pom.xml +++ b/DoConnect/pom.xml @@ -35,11 +35,6 @@ mysql-connector-java runtime - - org.projectlombok - lombok - true - org.springframework.boot spring-boot-starter-test @@ -58,6 +53,10 @@ spring-security-test test --> + + org.springframework.boot + spring-boot-starter-mail + From ff95c17c81a18ece6454e0126e6227069b5b1e51 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Thu, 25 Aug 2022 15:52:15 +0530 Subject: [PATCH 088/464] Update ImageController.java --- .../cp/doconnect/controller/ImageController.java | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/ImageController.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/ImageController.java index c2ef321..dcb470b 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/ImageController.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/ImageController.java @@ -32,13 +32,11 @@ @RequestMapping("/api/v1") public class ImageController { - private final Path imageStorageDirectory; - private final String[] validExtensions = {"png", "jpeg"}; - - /* The target path can be configured in the application.properties */ - public ImageController(@Value("${image-storage-directory}") Path imageStorageDirectory) { - this.imageStorageDirectory = imageStorageDirectory; - } + @Value("${image-storage-directory}") + private Path imageStorageDirectory; + + @Value("${valid-image-extensions}") + private String[] validImageExtensions; @PostConstruct public void ensureDirectoryExists() throws IOException { @@ -60,7 +58,7 @@ private boolean isValidFileExtension(String fileExtension) { if (fileExtension.isBlank()) { return false; } - return Arrays.stream(validExtensions).anyMatch(fileExtension::equals); + return Arrays.stream(validImageExtensions).anyMatch(fileExtension::equals); } private static String generateFileName() { From 75cae3d5a564a098ff19880b5e2ba7029676784e Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Thu, 25 Aug 2022 15:52:19 +0530 Subject: [PATCH 089/464] Update application.properties --- DoConnect/src/main/resources/application.properties | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/DoConnect/src/main/resources/application.properties b/DoConnect/src/main/resources/application.properties index cfc5cbc..60e7a65 100644 --- a/DoConnect/src/main/resources/application.properties +++ b/DoConnect/src/main/resources/application.properties @@ -14,3 +14,11 @@ spring.main.allow-circular-references=true spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true image-storage-directory=/do_connect_images +valid-image-extensions=png,jpeg + +spring.mail.host=smtp.gmail.com +spring.mail.port=587 +spring.mail.username= +spring.mail.password= +spring.mail.properties.mail.smtp.auth=true +spring.mail.properties.mail.smtp.starttls.enable=true From a8f3ce21cd78ccae84dc9659a0aca93c3a5440b2 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Thu, 25 Aug 2022 17:02:06 +0530 Subject: [PATCH 090/464] Create Utilities.java --- .../wipro/cp/doconnect/util/Utilities.java | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/util/Utilities.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/util/Utilities.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/util/Utilities.java new file mode 100644 index 0000000..77d8003 --- /dev/null +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/util/Utilities.java @@ -0,0 +1,38 @@ +package com.wipro.cp.doconnect.util; + +import java.util.List; +import java.util.stream.Collectors; + +import com.wipro.cp.doconnect.dto.AnswerResponseDTO; +import com.wipro.cp.doconnect.dto.QuestionResponseDTO; +import com.wipro.cp.doconnect.entity.Answer; +import com.wipro.cp.doconnect.entity.Question; +import com.wipro.cp.doconnect.entity.User; + +public class Utilities { + + public static String[] getUserEmails(List userList) { + String[] array = new String[userList.size()]; + for (int i = 0; i < userList.size(); i++) { + array[i] = userList.get(i).getEmail(); + } + return array; + } + + public static QuestionResponseDTO convertQuestionToQuestionResponseDTO(Question question) { + return new QuestionResponseDTO(question.getId(), question.getQuestion(), question.getTopic(), question.getImages(), question.getPostedBy(), question.getPostedAt(), question.getApprovedBy(), question.getIsApproved()); + } + + public static List convertQuestionListToQuestionResponseDTOList(List questionList) { + return questionList.stream().map(question -> convertQuestionToQuestionResponseDTO(question)).collect(Collectors.toList()); + } + + public static AnswerResponseDTO convertAnswerToAnswerResponseDTO(Answer answer) { + return new AnswerResponseDTO(answer.getId(), answer.getAnswer(), answer.getImages(), answer.getPostedBy(), answer.getPostedAt(), answer.getApprovedBy(), answer.getIsApproved(), Utilities.convertQuestionToQuestionResponseDTO(answer.getQuestion())); + } + + public static List convertAnswerListToAnswerResponseDTOList(List answerList) { + return answerList.stream().map(answer -> convertAnswerToAnswerResponseDTO(answer)).collect(Collectors.toList()); + } + +} From f8a02935d40e47a96b87912034d4422daf9905bf Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Thu, 25 Aug 2022 17:02:15 +0530 Subject: [PATCH 091/464] Update QuestionServiceImp.java --- .../doconnect/service/QuestionServiceImp.java | 32 +++++++++++-------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/QuestionServiceImp.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/QuestionServiceImp.java index d3e03dd..12135c1 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/QuestionServiceImp.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/QuestionServiceImp.java @@ -2,17 +2,19 @@ import java.util.List; import java.util.Optional; -import java.util.stream.Collectors; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import com.wipro.cp.doconnect.dto.EmailDTO; import com.wipro.cp.doconnect.dto.QuestionRequestDTO; import com.wipro.cp.doconnect.dto.QuestionResponseDTO; import com.wipro.cp.doconnect.dto.QuestionUpdateDTO; import com.wipro.cp.doconnect.dto.StatusDTO; import com.wipro.cp.doconnect.entity.Question; import com.wipro.cp.doconnect.repository.QuestionRepository; +import com.wipro.cp.doconnect.repository.UserRepository; +import com.wipro.cp.doconnect.util.Utilities; @Service public class QuestionServiceImp implements IQuestionService { @@ -20,25 +22,23 @@ public class QuestionServiceImp implements IQuestionService { @Autowired private QuestionRepository questionRepository; - private QuestionResponseDTO convertQuestionToQuestionResponseDTO(Question question) { - return new QuestionResponseDTO(question.getId(), question.getQuestion(), question.getTopic(), question.getImages(), question.getPostedBy(), question.getPostedAt(), question.getApprovedBy(), question.getIsApproved()); - } + @Autowired + private UserRepository userRepository; - private List convertQuestionListToQuestionResponseDTOList(List questionList) { - return questionList.stream().map(question -> convertQuestionToQuestionResponseDTO(question)).collect(Collectors.toList()); - } + @Autowired + private EmailServiceImp emailServiceImp; @Override public StatusDTO> getAllQuestions(String status, String search) { if (search == null) { if (status.equalsIgnoreCase("all")) { - return new StatusDTO>("", true, convertQuestionListToQuestionResponseDTOList(questionRepository.findAll())); + return new StatusDTO>("", true, Utilities.convertQuestionListToQuestionResponseDTOList(questionRepository.findAll())); } else if (status.equalsIgnoreCase("approved")) { - return new StatusDTO>("", true, convertQuestionListToQuestionResponseDTOList(questionRepository.findByIsApprovedTrue())); + return new StatusDTO>("", true, Utilities.convertQuestionListToQuestionResponseDTOList(questionRepository.findByIsApprovedTrue())); } else if (status.equalsIgnoreCase("unapproved")) { - return new StatusDTO>("", true, convertQuestionListToQuestionResponseDTOList(questionRepository.findByIsApprovedFalse())); + return new StatusDTO>("", true, Utilities.convertQuestionListToQuestionResponseDTOList(questionRepository.findByIsApprovedFalse())); } else { return new StatusDTO>("Provided invalid status. Should be one of 'all', 'approved' or 'unapproved'.", false, null); @@ -46,7 +46,7 @@ else if (status.equalsIgnoreCase("unapproved")) { } else { if (status.equalsIgnoreCase("approved")) { - return new StatusDTO>("", true, convertQuestionListToQuestionResponseDTOList(questionRepository.findByQuestionContainingIgnoreCaseAndIsApprovedTrue(search))); + return new StatusDTO>("", true, Utilities.convertQuestionListToQuestionResponseDTOList(questionRepository.findByQuestionContainingIgnoreCaseAndIsApprovedTrue(search))); } else { return new StatusDTO>("Question search only works with 'approved' status.", false, null); @@ -57,8 +57,12 @@ else if (status.equalsIgnoreCase("unapproved")) { @Override public StatusDTO createQuestion(QuestionRequestDTO questionRequestDTO, String postedBy) { Question question = new Question(questionRequestDTO.getQuestion(), questionRequestDTO.getTopic(), questionRequestDTO.getImages(), postedBy); - // TODO: Send email to Admin that question is created - return new StatusDTO("", true, convertQuestionToQuestionResponseDTO(questionRepository.save(question))); + Question savedQuestion = questionRepository.save(question); + String[] recipients = Utilities.getUserEmails(userRepository.findByIsAdminTrue()); + String subject = "Action Required: Approval needed for newly added question"; + String body = "Dear Admin,\n\nA new question has been added to DoConnect application. Please visit the application to either approve or delete the newly added question.\n\nDoConnect Bot\n\n\n\n\n\nAuto generated email. Please do not reply."; + emailServiceImp.sendNotificationEmail(new EmailDTO(recipients, subject, body)); + return new StatusDTO("", true, Utilities.convertQuestionToQuestionResponseDTO(savedQuestion)); } @Override @@ -70,7 +74,7 @@ public StatusDTO updateQuestion(QuestionUpdateDTO questionU Question question = optionalQuestion.get(); question.setIsApproved(questionUpdateDTO.getIsApproved()); question.setApprovedBy(approvedBy); - return new StatusDTO("", true, convertQuestionToQuestionResponseDTO(questionRepository.save(question))); + return new StatusDTO("", true, Utilities.convertQuestionToQuestionResponseDTO(questionRepository.save(question))); } @Override From fb213687273c647ab90a8d8b6c01bfb5a1e6b782 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Thu, 25 Aug 2022 17:02:22 +0530 Subject: [PATCH 092/464] Create IEmailService.java --- .../com/wipro/cp/doconnect/service/IEmailService.java | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/service/IEmailService.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IEmailService.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IEmailService.java new file mode 100644 index 0000000..3237959 --- /dev/null +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IEmailService.java @@ -0,0 +1,9 @@ +package com.wipro.cp.doconnect.service; + +import com.wipro.cp.doconnect.dto.EmailDTO; + +public interface IEmailService { + + boolean sendNotificationEmail(EmailDTO emailDTO); + +} From 8341b23c69726c13b0fbdd2a1e7d269bb9e9e742 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Thu, 25 Aug 2022 17:02:27 +0530 Subject: [PATCH 093/464] Create EmailServiceImp.java --- .../cp/doconnect/service/EmailServiceImp.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/service/EmailServiceImp.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/EmailServiceImp.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/EmailServiceImp.java new file mode 100644 index 0000000..f77422c --- /dev/null +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/EmailServiceImp.java @@ -0,0 +1,37 @@ +package com.wipro.cp.doconnect.service; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.mail.SimpleMailMessage; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.stereotype.Service; + +import com.wipro.cp.doconnect.dto.EmailDTO; + +@Service +public class EmailServiceImp implements IEmailService { + + @Autowired + private JavaMailSender javaMailSender; + + @Value("${spring.mail.username}") + private String sender; + + @Override + public boolean sendNotificationEmail(EmailDTO emailDTO) { + try { + SimpleMailMessage simpleMailMessage = new SimpleMailMessage(); + simpleMailMessage.setFrom(sender); + simpleMailMessage.setTo(emailDTO.getRecipients()); + simpleMailMessage.setSubject(emailDTO.getSubject()); + simpleMailMessage.setText(emailDTO.getBody()); + javaMailSender.send(simpleMailMessage); + return true; + } + catch (Exception e) { + System.out.println(e.toString()); + return false; + } + } + +} From 4ec42142a9501d1da72ca08d09626ffd5de14f1f Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Thu, 25 Aug 2022 17:02:33 +0530 Subject: [PATCH 094/464] Update AnswerServiceImp.java --- .../doconnect/service/AnswerServiceImp.java | 41 +++++++++---------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/AnswerServiceImp.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/AnswerServiceImp.java index f3a2472..17811cb 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/AnswerServiceImp.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/AnswerServiceImp.java @@ -2,7 +2,6 @@ import java.util.List; import java.util.Optional; -import java.util.stream.Collectors; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -10,12 +9,14 @@ import com.wipro.cp.doconnect.dto.AnswerRequestDTO; import com.wipro.cp.doconnect.dto.AnswerResponseDTO; import com.wipro.cp.doconnect.dto.AnswerUpdateDTO; -import com.wipro.cp.doconnect.dto.QuestionResponseDTO; +import com.wipro.cp.doconnect.dto.EmailDTO; import com.wipro.cp.doconnect.dto.StatusDTO; import com.wipro.cp.doconnect.entity.Answer; import com.wipro.cp.doconnect.entity.Question; import com.wipro.cp.doconnect.repository.AnswerRepository; import com.wipro.cp.doconnect.repository.QuestionRepository; +import com.wipro.cp.doconnect.repository.UserRepository; +import com.wipro.cp.doconnect.util.Utilities; @Service public class AnswerServiceImp implements IAnswerService { @@ -26,28 +27,22 @@ public class AnswerServiceImp implements IAnswerService { @Autowired private QuestionRepository questionRepository; - private QuestionResponseDTO convertQuestionToQuestionResponseDTO(Question question) { - return new QuestionResponseDTO(question.getId(), question.getQuestion(), question.getTopic(), question.getImages(), question.getPostedBy(), question.getPostedAt(), question.getApprovedBy(), question.getIsApproved()); - } - - private AnswerResponseDTO convertAnswerToAnswerResponseDTO(Answer answer) { - return new AnswerResponseDTO(answer.getId(), answer.getAnswer(), answer.getImages(), answer.getPostedBy(), answer.getPostedAt(), answer.getApprovedBy(), answer.getIsApproved(), convertQuestionToQuestionResponseDTO(answer.getQuestion())); - } + @Autowired + private UserRepository userRepository; - private List convertAnswerListToAnswerResponseDTOList(List answerList) { - return answerList.stream().map(answer -> convertAnswerToAnswerResponseDTO(answer)).collect(Collectors.toList()); - } + @Autowired + private EmailServiceImp emailServiceImp; @Override public StatusDTO> getAllAnswers(String answerStatus) { if (answerStatus.equalsIgnoreCase("all")) { - return new StatusDTO>("", true, convertAnswerListToAnswerResponseDTOList(answerRepository.findAll())); + return new StatusDTO>("", true, Utilities.convertAnswerListToAnswerResponseDTOList(answerRepository.findAll())); } else if (answerStatus.equalsIgnoreCase("approved")) { - return new StatusDTO>("", true, convertAnswerListToAnswerResponseDTOList(answerRepository.findByIsApprovedTrue())); + return new StatusDTO>("", true, Utilities.convertAnswerListToAnswerResponseDTOList(answerRepository.findByIsApprovedTrue())); } else if (answerStatus.equalsIgnoreCase("unapproved")) { - return new StatusDTO>("", true, convertAnswerListToAnswerResponseDTOList(answerRepository.findByIsApprovedFalse())); + return new StatusDTO>("", true, Utilities.convertAnswerListToAnswerResponseDTOList(answerRepository.findByIsApprovedFalse())); } else { return new StatusDTO>("Provided invalid status. Should be one of 'all', 'approved' or 'unapproved'.", false, null); @@ -57,13 +52,13 @@ else if (answerStatus.equalsIgnoreCase("unapproved")) { @Override public StatusDTO> getAllAnswersForQuestionId(Long questionId, String answerStatus) { if (answerStatus.equalsIgnoreCase("all")) { - return new StatusDTO>("", true, convertAnswerListToAnswerResponseDTOList(answerRepository.findByQuestionId(questionId))); + return new StatusDTO>("", true, Utilities.convertAnswerListToAnswerResponseDTOList(answerRepository.findByQuestionId(questionId))); } else if (answerStatus.equalsIgnoreCase("approved")) { - return new StatusDTO>("", true, convertAnswerListToAnswerResponseDTOList(answerRepository.findByQuestionIdAndIsApprovedTrue(questionId))); + return new StatusDTO>("", true, Utilities.convertAnswerListToAnswerResponseDTOList(answerRepository.findByQuestionIdAndIsApprovedTrue(questionId))); } else if (answerStatus.equalsIgnoreCase("unapproved")) { - return new StatusDTO>("", true, convertAnswerListToAnswerResponseDTOList(answerRepository.findByQuestionIdAndIsApprovedFalse(questionId))); + return new StatusDTO>("", true, Utilities.convertAnswerListToAnswerResponseDTOList(answerRepository.findByQuestionIdAndIsApprovedFalse(questionId))); } else { return new StatusDTO>("Provided invalid status. Should be one of 'all', 'approved' or 'unapproved'.", false, null); @@ -77,8 +72,12 @@ public StatusDTO createAnswerForQuestionId(Long questionId, A return new StatusDTO("Question with id " + questionId + " does not exist.", false, null); } Answer answer = new Answer(answerRequestDTO.getAnswer(), answerRequestDTO.getImages(), postedBy, optionalQuestion.get()); - // TODO: Send email to Admin that answer is created - return new StatusDTO("", true, convertAnswerToAnswerResponseDTO(answerRepository.save(answer))); + Answer savedAnswer = answerRepository.save(answer); + String[] recipients = Utilities.getUserEmails(userRepository.findByIsAdminTrue()); + String subject = "Action Required: Approval needed for newly added answer"; + String body = "Dear Admin,\n\nA new answer has been added to DoConnect application for question - '" + optionalQuestion.get().getQuestion() + "'. Please visit the application to either approve or delete the newly added question.\n\nDoConnect Bot\n\n\n\n\n\nAuto generated email. Please do not reply."; + emailServiceImp.sendNotificationEmail(new EmailDTO(recipients, subject, body)); + return new StatusDTO("", true, Utilities.convertAnswerToAnswerResponseDTO(savedAnswer)); } @Override @@ -94,7 +93,7 @@ public StatusDTO updateAnswerForQuestionId(Long questionId, L Answer answer = optionalAnswer.get(); answer.setIsApproved(answerUpdateDTO.getIsApproved()); answer.setApprovedBy(approvedBy); - return new StatusDTO("", true, convertAnswerToAnswerResponseDTO(answerRepository.save(answer))); + return new StatusDTO("", true, Utilities.convertAnswerToAnswerResponseDTO(answerRepository.save(answer))); } @Override From 70755f53d9fe43d951baaab95cc9325f38bc4253 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Thu, 25 Aug 2022 17:02:41 +0530 Subject: [PATCH 095/464] Update UserRepository.java --- .../java/com/wipro/cp/doconnect/repository/UserRepository.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/UserRepository.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/UserRepository.java index 3ef6e25..fa6761b 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/UserRepository.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/UserRepository.java @@ -1,5 +1,6 @@ package com.wipro.cp.doconnect.repository; +import java.util.List; import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; @@ -15,5 +16,7 @@ public interface UserRepository extends JpaRepository { boolean existsByUsername(String username); boolean existsByEmail(String email); + + List findByIsAdminTrue(); } From 00732dca02d9415c5c8574c3a22cd5c10cce792a Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Thu, 25 Aug 2022 17:02:45 +0530 Subject: [PATCH 096/464] Create EmailDTO.java --- .../com/wipro/cp/doconnect/dto/EmailDTO.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/dto/EmailDTO.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/EmailDTO.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/EmailDTO.java new file mode 100644 index 0000000..21ce296 --- /dev/null +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/EmailDTO.java @@ -0,0 +1,30 @@ +package com.wipro.cp.doconnect.dto; + +public class EmailDTO { + + private String[] recipients; + private String subject; + private String body; + + public String[] getRecipients() { + return recipients; + } + public String getSubject() { + return subject; + } + public String getBody() { + return body; + } + + public EmailDTO(String[] recipients, String subject, String body) { + super(); + this.recipients = recipients; + this.subject = subject; + this.body = body; + } + + public EmailDTO() { + super(); + } + +} From 72d6a926ad560ff4ef21bdafc52598a9af2689d1 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Thu, 25 Aug 2022 19:20:01 +0530 Subject: [PATCH 097/464] Update AnswerResponseDTO.java --- .../com/wipro/cp/doconnect/dto/AnswerResponseDTO.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/AnswerResponseDTO.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/AnswerResponseDTO.java index fbe1918..4d30719 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/AnswerResponseDTO.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/AnswerResponseDTO.java @@ -12,7 +12,7 @@ public class AnswerResponseDTO { private Date postedAt; private String approvedBy; private boolean isApproved; - private QuestionResponseDTO questionResponseDTO; + private QuestionResponseDTO question; public long getId() { return id; @@ -42,12 +42,12 @@ public boolean getIsApproved() { return isApproved; } - public QuestionResponseDTO getQuestionResponseDTO() { - return questionResponseDTO; + public QuestionResponseDTO getQuestion() { + return question; } public AnswerResponseDTO(long id, String answer, List images, String postedBy, Date postedAt, - String approvedBy, boolean isApproved, QuestionResponseDTO questionResponseDTO) { + String approvedBy, boolean isApproved, QuestionResponseDTO question) { super(); this.id = id; this.answer = answer; @@ -56,7 +56,7 @@ public AnswerResponseDTO(long id, String answer, List images, String pos this.postedAt = postedAt; this.approvedBy = approvedBy; this.isApproved = isApproved; - this.questionResponseDTO = questionResponseDTO; + this.question = question; } public AnswerResponseDTO() { From 409ac93ae2a2e66e30e94f0dd685d1d1d5a9e78c Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Thu, 25 Aug 2022 19:44:39 +0530 Subject: [PATCH 098/464] Update QuestionServiceImp.java --- .../cp/doconnect/service/QuestionServiceImp.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/QuestionServiceImp.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/QuestionServiceImp.java index 12135c1..84f0272 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/QuestionServiceImp.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/QuestionServiceImp.java @@ -78,13 +78,17 @@ public StatusDTO updateQuestion(QuestionUpdateDTO questionU } @Override - public boolean deleteQuestionById(Long questionId) { + public StatusDTO deleteQuestionById(Long questionId) { Optional optionalQuestion = questionRepository.findById(questionId); if (optionalQuestion.isEmpty()) { - return false; + return new StatusDTO("Question with id " + questionId + " does not exist.", false, null); } - questionRepository.deleteById(questionId); - return true; + Question question = optionalQuestion.get(); + if (question.getIsApproved()) { + return new StatusDTO("Cannot delete an approved question.", false, false); + } + questionRepository.delete(question); + return new StatusDTO("", true, true); } } From fa36c26b7e1c10f68e4dc0d766e4d5339ee10739 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Thu, 25 Aug 2022 19:44:46 +0530 Subject: [PATCH 099/464] Update IQuestionService.java --- .../java/com/wipro/cp/doconnect/service/IQuestionService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IQuestionService.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IQuestionService.java index 945811b..01cc092 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IQuestionService.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IQuestionService.java @@ -12,6 +12,6 @@ public interface IQuestionService { public StatusDTO> getAllQuestions(String status, String search); public StatusDTO createQuestion(QuestionRequestDTO questionRequestDTO, String postedBy); public StatusDTO updateQuestion(QuestionUpdateDTO questionUpdateDTO, Long questionId, String approvedBy); - public boolean deleteQuestionById(Long questionId); + public StatusDTO deleteQuestionById(Long questionId); } From 1f95dcd7ced719978c7fc9e14aaef417ee690952 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Thu, 25 Aug 2022 19:45:01 +0530 Subject: [PATCH 100/464] Update AnswerServiceImp.java --- .../com/wipro/cp/doconnect/service/AnswerServiceImp.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/AnswerServiceImp.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/AnswerServiceImp.java index 17811cb..6287ff1 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/AnswerServiceImp.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/AnswerServiceImp.java @@ -106,7 +106,11 @@ public StatusDTO deleteAnswerForQuestionById(Long questionId, Long answ if (optionalAnswer.isEmpty()) { return new StatusDTO("Answer with id " + answerId + " does not exist for question with id " + questionId + ".", false, null); } - answerRepository.delete(optionalAnswer.get()); + Answer answer = optionalAnswer.get(); + if (answer.getIsApproved()) { + return new StatusDTO("Cannot delete an approved answer.", false, false); + } + answerRepository.delete(answer); return new StatusDTO("", true, true); } From aef124332644d3f90eeb3e08a40bf0342d0a170d Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Thu, 25 Aug 2022 19:45:24 +0530 Subject: [PATCH 101/464] Update QuestionController.java --- .../doconnect/controller/QuestionController.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/QuestionController.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/QuestionController.java index e562de9..d3d6d7e 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/QuestionController.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/QuestionController.java @@ -75,11 +75,17 @@ public ResponseEntity updateQuestion(@Valid @RequestBody QuestionUpdateDTO qu @DeleteMapping("/questions/{questionId}") public ResponseEntity deleteQuestionById(@PathVariable @Min(1) Long questionId) { - boolean deleted = questionServiceImp.deleteQuestionById(questionId); - if (deleted) { - return ResponseEntity.ok("Question deleted successfully."); + StatusDTO deletionStatus = questionServiceImp.deleteQuestionById(questionId); + if (!deletionStatus.getIsValid()) { + Boolean status = deletionStatus.getObject(); + if (status == null) { + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(deletionStatus.getStatusMessage()); + } + else { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(deletionStatus.getStatusMessage()); + } } - return ResponseEntity.status(HttpStatus.NOT_FOUND).body("Question with ID " + questionId + " does not exist."); + return ResponseEntity.ok("Question deleted successfully."); } } From fe0b00a6c0a409d04ce120ca381f36fa28f59d41 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Thu, 25 Aug 2022 19:45:31 +0530 Subject: [PATCH 102/464] Update AnswerController.java --- .../wipro/cp/doconnect/controller/AnswerController.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AnswerController.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AnswerController.java index 623c0cc..35a57df 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AnswerController.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AnswerController.java @@ -85,7 +85,13 @@ public ResponseEntity updateAnswerForQuestionId(@Valid @RequestBody AnswerUpd public ResponseEntity deleteAnswerForQuestionById(@PathVariable(value="questionId") Long questionId, @PathVariable(value="answerId") Long answerId) { StatusDTO deletionStatus = answerServiceImp.deleteAnswerForQuestionById(questionId, answerId); if (!deletionStatus.getIsValid()) { - return ResponseEntity.status(HttpStatus.NOT_FOUND).body(deletionStatus.getStatusMessage()); + Boolean status = deletionStatus.getObject(); + if (status == null) { + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(deletionStatus.getStatusMessage()); + } + else { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(deletionStatus.getStatusMessage()); + } } return ResponseEntity.ok("Answer for Question ID " + questionId + " deleted successfully."); } From bbb99ae3d2f386e811cd21cf4f79b604b6cee0de Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Thu, 25 Aug 2022 19:56:22 +0530 Subject: [PATCH 103/464] Update QuestionServiceImp.java --- .../cp/doconnect/service/QuestionServiceImp.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/QuestionServiceImp.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/QuestionServiceImp.java index 84f0272..e77fc8c 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/QuestionServiceImp.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/QuestionServiceImp.java @@ -4,6 +4,7 @@ import java.util.Optional; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import com.wipro.cp.doconnect.dto.EmailDTO; @@ -19,6 +20,9 @@ @Service public class QuestionServiceImp implements IQuestionService { + @Value("${enable-notification-emails:false}") + private boolean enableNotificationEmails; + @Autowired private QuestionRepository questionRepository; @@ -58,10 +62,12 @@ else if (status.equalsIgnoreCase("unapproved")) { public StatusDTO createQuestion(QuestionRequestDTO questionRequestDTO, String postedBy) { Question question = new Question(questionRequestDTO.getQuestion(), questionRequestDTO.getTopic(), questionRequestDTO.getImages(), postedBy); Question savedQuestion = questionRepository.save(question); - String[] recipients = Utilities.getUserEmails(userRepository.findByIsAdminTrue()); - String subject = "Action Required: Approval needed for newly added question"; - String body = "Dear Admin,\n\nA new question has been added to DoConnect application. Please visit the application to either approve or delete the newly added question.\n\nDoConnect Bot\n\n\n\n\n\nAuto generated email. Please do not reply."; - emailServiceImp.sendNotificationEmail(new EmailDTO(recipients, subject, body)); + if (enableNotificationEmails) { + String[] recipients = Utilities.getUserEmails(userRepository.findByIsAdminTrue()); + String subject = "Action Required: Approval needed for newly added question"; + String body = "Dear Admin,\n\nA new question has been added to DoConnect application. Please visit the application to either approve or delete the newly added question.\n\nDoConnect Bot\n\n\n\n\n\nAuto generated email. Please do not reply."; + emailServiceImp.sendNotificationEmail(new EmailDTO(recipients, subject, body)); + } return new StatusDTO("", true, Utilities.convertQuestionToQuestionResponseDTO(savedQuestion)); } From 7bebfa20f12c740ed2290e85faa5495dec3813d3 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Thu, 25 Aug 2022 19:56:26 +0530 Subject: [PATCH 104/464] Update AnswerServiceImp.java --- .../cp/doconnect/service/AnswerServiceImp.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/AnswerServiceImp.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/AnswerServiceImp.java index 6287ff1..ee2b9d5 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/AnswerServiceImp.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/AnswerServiceImp.java @@ -4,6 +4,7 @@ import java.util.Optional; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import com.wipro.cp.doconnect.dto.AnswerRequestDTO; @@ -21,6 +22,9 @@ @Service public class AnswerServiceImp implements IAnswerService { + @Value("${enable-notification-emails:false}") + private boolean enableNotificationEmails; + @Autowired private AnswerRepository answerRepository; @@ -73,10 +77,12 @@ public StatusDTO createAnswerForQuestionId(Long questionId, A } Answer answer = new Answer(answerRequestDTO.getAnswer(), answerRequestDTO.getImages(), postedBy, optionalQuestion.get()); Answer savedAnswer = answerRepository.save(answer); - String[] recipients = Utilities.getUserEmails(userRepository.findByIsAdminTrue()); - String subject = "Action Required: Approval needed for newly added answer"; - String body = "Dear Admin,\n\nA new answer has been added to DoConnect application for question - '" + optionalQuestion.get().getQuestion() + "'. Please visit the application to either approve or delete the newly added question.\n\nDoConnect Bot\n\n\n\n\n\nAuto generated email. Please do not reply."; - emailServiceImp.sendNotificationEmail(new EmailDTO(recipients, subject, body)); + if (enableNotificationEmails) { + String[] recipients = Utilities.getUserEmails(userRepository.findByIsAdminTrue()); + String subject = "Action Required: Approval needed for newly added answer"; + String body = "Dear Admin,\n\nA new answer has been added to DoConnect application for question - '" + optionalQuestion.get().getQuestion() + "'. Please visit the application to either approve or delete the newly added question.\n\nDoConnect Bot\n\n\n\n\n\nAuto generated email. Please do not reply."; + emailServiceImp.sendNotificationEmail(new EmailDTO(recipients, subject, body)); + } return new StatusDTO("", true, Utilities.convertAnswerToAnswerResponseDTO(savedAnswer)); } From 9503924875d5b2211fe2eab7418cf39248061cbf Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Thu, 25 Aug 2022 20:02:00 +0530 Subject: [PATCH 105/464] Update Answer.java --- .../src/main/java/com/wipro/cp/doconnect/entity/Answer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Answer.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Answer.java index 06b6891..38f0d5a 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Answer.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Answer.java @@ -28,7 +28,7 @@ public class Answer { @Id - @GeneratedValue(strategy=GenerationType.AUTO) + @GeneratedValue(strategy=GenerationType.IDENTITY) private long id; @NotNull From 6ee31eefe7899c732e7305117a077048e6055f89 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Thu, 25 Aug 2022 20:02:03 +0530 Subject: [PATCH 106/464] Update Question.java --- .../src/main/java/com/wipro/cp/doconnect/entity/Question.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Question.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Question.java index ee04a19..021f11d 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Question.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Question.java @@ -22,7 +22,7 @@ public class Question { @Id - @GeneratedValue(strategy=GenerationType.AUTO) + @GeneratedValue(strategy=GenerationType.IDENTITY) private long id; @NotNull From c2aff469c76fe3548619a9d3ee98c71e415cf643 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Thu, 25 Aug 2022 20:02:05 +0530 Subject: [PATCH 107/464] Update User.java --- DoConnect/src/main/java/com/wipro/cp/doconnect/entity/User.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/User.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/User.java index 1e96b6e..236c6c1 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/User.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/User.java @@ -16,7 +16,7 @@ public class User { @Id - @GeneratedValue(strategy=GenerationType.AUTO) + @GeneratedValue(strategy=GenerationType.IDENTITY) private Long id; @NotNull From e78f6d708ad4c56efdf92372efc630cc765c84c4 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 01:04:37 +0530 Subject: [PATCH 108/464] Update Utilities.java --- .../wipro/cp/doconnect/util/Utilities.java | 25 ++++++++++++++----- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/util/Utilities.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/util/Utilities.java index 77d8003..c01f583 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/util/Utilities.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/util/Utilities.java @@ -3,15 +3,23 @@ import java.util.List; import java.util.stream.Collectors; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.wipro.cp.doconnect.component.JwtTokenUtilityComponent; import com.wipro.cp.doconnect.dto.AnswerResponseDTO; import com.wipro.cp.doconnect.dto.QuestionResponseDTO; import com.wipro.cp.doconnect.entity.Answer; import com.wipro.cp.doconnect.entity.Question; import com.wipro.cp.doconnect.entity.User; +@Component public class Utilities { - public static String[] getUserEmails(List userList) { + @Autowired + private JwtTokenUtilityComponent jwtTokenUtilityComponent; + + public String[] getUserEmails(List userList) { String[] array = new String[userList.size()]; for (int i = 0; i < userList.size(); i++) { array[i] = userList.get(i).getEmail(); @@ -19,20 +27,25 @@ public static String[] getUserEmails(List userList) { return array; } - public static QuestionResponseDTO convertQuestionToQuestionResponseDTO(Question question) { + public QuestionResponseDTO convertQuestionToQuestionResponseDTO(Question question) { return new QuestionResponseDTO(question.getId(), question.getQuestion(), question.getTopic(), question.getImages(), question.getPostedBy(), question.getPostedAt(), question.getApprovedBy(), question.getIsApproved()); } - public static List convertQuestionListToQuestionResponseDTOList(List questionList) { + public List convertQuestionListToQuestionResponseDTOList(List questionList) { return questionList.stream().map(question -> convertQuestionToQuestionResponseDTO(question)).collect(Collectors.toList()); } - public static AnswerResponseDTO convertAnswerToAnswerResponseDTO(Answer answer) { - return new AnswerResponseDTO(answer.getId(), answer.getAnswer(), answer.getImages(), answer.getPostedBy(), answer.getPostedAt(), answer.getApprovedBy(), answer.getIsApproved(), Utilities.convertQuestionToQuestionResponseDTO(answer.getQuestion())); + public AnswerResponseDTO convertAnswerToAnswerResponseDTO(Answer answer) { + return new AnswerResponseDTO(answer.getId(), answer.getAnswer(), answer.getImages(), answer.getPostedBy(), answer.getPostedAt(), answer.getApprovedBy(), answer.getIsApproved(), convertQuestionToQuestionResponseDTO(answer.getQuestion())); } - public static List convertAnswerListToAnswerResponseDTOList(List answerList) { + public List convertAnswerListToAnswerResponseDTOList(List answerList) { return answerList.stream().map(answer -> convertAnswerToAnswerResponseDTO(answer)).collect(Collectors.toList()); } + + public String getUsernameFromAuthorizationHeader(String authorizationHeader) { + String jwtToken = authorizationHeader.substring(7); + return jwtTokenUtilityComponent.getUsernameFromToken(jwtToken); + } } From 1967e09c55b3f4a38eaeca887ff92cec51ec5d38 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 01:04:43 +0530 Subject: [PATCH 109/464] Update UserServiceImp.java --- .../cp/doconnect/service/UserServiceImp.java | 24 +++++++++++++++---- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/UserServiceImp.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/UserServiceImp.java index 3b7c55b..f352d47 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/UserServiceImp.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/UserServiceImp.java @@ -1,11 +1,15 @@ package com.wipro.cp.doconnect.service; +import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; import org.springframework.beans.factory.annotation.Autowired; -//import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import com.wipro.cp.doconnect.dto.StatusDTO; @@ -16,13 +20,13 @@ import com.wipro.cp.doconnect.repository.UserRepository; @Service -public class UserServiceImp implements IUserService { +public class UserServiceImp implements IUserService, UserDetailsService { @Autowired private UserRepository userRepository; -// @Autowired -// private PasswordEncoder bcryptEncoder; + @Autowired + private PasswordEncoder bcryptEncoder; private UserResponseDTO convertUserToUserResponseDTO(User user) { return new UserResponseDTO(user.getId(), user.getUsername(), user.getName(), user.getEmail(), user.getIsAdmin()); @@ -38,6 +42,16 @@ private StatusDTO convertOptionalUserToStatusDTOUserResponseDTO public StatusDTO getUserByUsername(String username) { return convertOptionalUserToStatusDTOUserResponseDTO(userRepository.findByUsername(username), "User with username " + username + " does not exist."); } + + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + Optional optionalUser = userRepository.findByUsername(username); + if (optionalUser.isEmpty()) { + throw new UsernameNotFoundException("User not found with username: " + username); + } + User user = optionalUser.get(); + return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), new ArrayList<>()); + } @Override public StatusDTO createUser(UserRegisterDTO userRegisterDTO) { @@ -50,7 +64,7 @@ public StatusDTO createUser(UserRegisterDTO userRegisterDTO) { if (userRegisterDTO.getPassword().length() < 8) { return new StatusDTO("Password should contain at least 8 characters.", false, null); } - User user = new User(userRegisterDTO.getUsername(), userRegisterDTO.getName(), userRegisterDTO.getPassword(), userRegisterDTO.getEmail(), userRegisterDTO.getIsAdmin()); + User user = new User(userRegisterDTO.getUsername(), userRegisterDTO.getName(), bcryptEncoder.encode(userRegisterDTO.getPassword()), userRegisterDTO.getEmail(), userRegisterDTO.getIsAdmin()); return new StatusDTO("", true, convertUserToUserResponseDTO(userRepository.save(user))); } From 18afb373894497d59503cb81631753cc1d709b3b Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 01:04:53 +0530 Subject: [PATCH 110/464] Update QuestionServiceImp.java --- .../doconnect/service/QuestionServiceImp.java | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/QuestionServiceImp.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/QuestionServiceImp.java index e77fc8c..804aa49 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/QuestionServiceImp.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/QuestionServiceImp.java @@ -32,17 +32,20 @@ public class QuestionServiceImp implements IQuestionService { @Autowired private EmailServiceImp emailServiceImp; + @Autowired + private Utilities utilities; + @Override public StatusDTO> getAllQuestions(String status, String search) { if (search == null) { if (status.equalsIgnoreCase("all")) { - return new StatusDTO>("", true, Utilities.convertQuestionListToQuestionResponseDTOList(questionRepository.findAll())); + return new StatusDTO>("", true, utilities.convertQuestionListToQuestionResponseDTOList(questionRepository.findAll())); } else if (status.equalsIgnoreCase("approved")) { - return new StatusDTO>("", true, Utilities.convertQuestionListToQuestionResponseDTOList(questionRepository.findByIsApprovedTrue())); + return new StatusDTO>("", true, utilities.convertQuestionListToQuestionResponseDTOList(questionRepository.findByIsApprovedTrue())); } else if (status.equalsIgnoreCase("unapproved")) { - return new StatusDTO>("", true, Utilities.convertQuestionListToQuestionResponseDTOList(questionRepository.findByIsApprovedFalse())); + return new StatusDTO>("", true, utilities.convertQuestionListToQuestionResponseDTOList(questionRepository.findByIsApprovedFalse())); } else { return new StatusDTO>("Provided invalid status. Should be one of 'all', 'approved' or 'unapproved'.", false, null); @@ -50,7 +53,7 @@ else if (status.equalsIgnoreCase("unapproved")) { } else { if (status.equalsIgnoreCase("approved")) { - return new StatusDTO>("", true, Utilities.convertQuestionListToQuestionResponseDTOList(questionRepository.findByQuestionContainingIgnoreCaseAndIsApprovedTrue(search))); + return new StatusDTO>("", true, utilities.convertQuestionListToQuestionResponseDTOList(questionRepository.findByQuestionContainingIgnoreCaseAndIsApprovedTrue(search))); } else { return new StatusDTO>("Question search only works with 'approved' status.", false, null); @@ -63,12 +66,12 @@ public StatusDTO createQuestion(QuestionRequestDTO question Question question = new Question(questionRequestDTO.getQuestion(), questionRequestDTO.getTopic(), questionRequestDTO.getImages(), postedBy); Question savedQuestion = questionRepository.save(question); if (enableNotificationEmails) { - String[] recipients = Utilities.getUserEmails(userRepository.findByIsAdminTrue()); + String[] recipients = utilities.getUserEmails(userRepository.findByIsAdminTrue()); String subject = "Action Required: Approval needed for newly added question"; String body = "Dear Admin,\n\nA new question has been added to DoConnect application. Please visit the application to either approve or delete the newly added question.\n\nDoConnect Bot\n\n\n\n\n\nAuto generated email. Please do not reply."; emailServiceImp.sendNotificationEmail(new EmailDTO(recipients, subject, body)); } - return new StatusDTO("", true, Utilities.convertQuestionToQuestionResponseDTO(savedQuestion)); + return new StatusDTO("", true, utilities.convertQuestionToQuestionResponseDTO(savedQuestion)); } @Override @@ -80,7 +83,7 @@ public StatusDTO updateQuestion(QuestionUpdateDTO questionU Question question = optionalQuestion.get(); question.setIsApproved(questionUpdateDTO.getIsApproved()); question.setApprovedBy(approvedBy); - return new StatusDTO("", true, Utilities.convertQuestionToQuestionResponseDTO(questionRepository.save(question))); + return new StatusDTO("", true, utilities.convertQuestionToQuestionResponseDTO(questionRepository.save(question))); } @Override From e8b68137eb1535eb5161a4cf7cb1d18adf0c31b9 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 01:05:04 +0530 Subject: [PATCH 111/464] Create LogoutTokenServiceImp.java --- .../service/LogoutTokenServiceImp.java | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/service/LogoutTokenServiceImp.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/LogoutTokenServiceImp.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/LogoutTokenServiceImp.java new file mode 100644 index 0000000..6ae7b15 --- /dev/null +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/LogoutTokenServiceImp.java @@ -0,0 +1,42 @@ +package com.wipro.cp.doconnect.service; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.wipro.cp.doconnect.entity.LogoutToken; +import com.wipro.cp.doconnect.repository.LogoutTokenRepository; + +@Service +public class LogoutTokenServiceImp implements ILogoutTokenService { + + @Autowired + LogoutTokenRepository logoutTokenRepository; + + @Override + public boolean checkIfTokenExists(String token) { + return logoutTokenRepository.existsByToken(token); + } + + @Override + public LogoutToken createToken(LogoutToken logoutToken) { + return logoutTokenRepository.save(logoutToken); + } + + @Override + public List createTokens(List logoutTokenList) { + return logoutTokenRepository.saveAllAndFlush(logoutTokenList); + } + + @Override + public List getAllTokens() { + return logoutTokenRepository.findAll(); + } + + @Override + public void deleteAllTokens() { + logoutTokenRepository.deleteAllInBatch(); + } + +} From b2779de320d513e277132eb6a70e6b27b5e31c19 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 01:05:27 +0530 Subject: [PATCH 112/464] Create ILogoutTokenService.java --- .../cp/doconnect/service/ILogoutTokenService.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/service/ILogoutTokenService.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/ILogoutTokenService.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/ILogoutTokenService.java new file mode 100644 index 0000000..9fb26fa --- /dev/null +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/ILogoutTokenService.java @@ -0,0 +1,15 @@ +package com.wipro.cp.doconnect.service; + +import java.util.List; + +import com.wipro.cp.doconnect.entity.LogoutToken; + +public interface ILogoutTokenService { + + public boolean checkIfTokenExists(String token); + public LogoutToken createToken(LogoutToken logoutToken); + public List createTokens(List logoutTokenList); + public List getAllTokens(); + public void deleteAllTokens(); + +} From a75a54ccd5ea4e09c5cd496f8cca840ad1dc95a0 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 01:05:35 +0530 Subject: [PATCH 113/464] Update AnswerServiceImp.java --- .../doconnect/service/AnswerServiceImp.java | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/AnswerServiceImp.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/AnswerServiceImp.java index ee2b9d5..9a07b25 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/AnswerServiceImp.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/AnswerServiceImp.java @@ -37,16 +37,19 @@ public class AnswerServiceImp implements IAnswerService { @Autowired private EmailServiceImp emailServiceImp; + @Autowired + private Utilities utilities; + @Override public StatusDTO> getAllAnswers(String answerStatus) { if (answerStatus.equalsIgnoreCase("all")) { - return new StatusDTO>("", true, Utilities.convertAnswerListToAnswerResponseDTOList(answerRepository.findAll())); + return new StatusDTO>("", true, utilities.convertAnswerListToAnswerResponseDTOList(answerRepository.findAll())); } else if (answerStatus.equalsIgnoreCase("approved")) { - return new StatusDTO>("", true, Utilities.convertAnswerListToAnswerResponseDTOList(answerRepository.findByIsApprovedTrue())); + return new StatusDTO>("", true, utilities.convertAnswerListToAnswerResponseDTOList(answerRepository.findByIsApprovedTrue())); } else if (answerStatus.equalsIgnoreCase("unapproved")) { - return new StatusDTO>("", true, Utilities.convertAnswerListToAnswerResponseDTOList(answerRepository.findByIsApprovedFalse())); + return new StatusDTO>("", true, utilities.convertAnswerListToAnswerResponseDTOList(answerRepository.findByIsApprovedFalse())); } else { return new StatusDTO>("Provided invalid status. Should be one of 'all', 'approved' or 'unapproved'.", false, null); @@ -56,13 +59,13 @@ else if (answerStatus.equalsIgnoreCase("unapproved")) { @Override public StatusDTO> getAllAnswersForQuestionId(Long questionId, String answerStatus) { if (answerStatus.equalsIgnoreCase("all")) { - return new StatusDTO>("", true, Utilities.convertAnswerListToAnswerResponseDTOList(answerRepository.findByQuestionId(questionId))); + return new StatusDTO>("", true, utilities.convertAnswerListToAnswerResponseDTOList(answerRepository.findByQuestionId(questionId))); } else if (answerStatus.equalsIgnoreCase("approved")) { - return new StatusDTO>("", true, Utilities.convertAnswerListToAnswerResponseDTOList(answerRepository.findByQuestionIdAndIsApprovedTrue(questionId))); + return new StatusDTO>("", true, utilities.convertAnswerListToAnswerResponseDTOList(answerRepository.findByQuestionIdAndIsApprovedTrue(questionId))); } else if (answerStatus.equalsIgnoreCase("unapproved")) { - return new StatusDTO>("", true, Utilities.convertAnswerListToAnswerResponseDTOList(answerRepository.findByQuestionIdAndIsApprovedFalse(questionId))); + return new StatusDTO>("", true, utilities.convertAnswerListToAnswerResponseDTOList(answerRepository.findByQuestionIdAndIsApprovedFalse(questionId))); } else { return new StatusDTO>("Provided invalid status. Should be one of 'all', 'approved' or 'unapproved'.", false, null); @@ -78,12 +81,12 @@ public StatusDTO createAnswerForQuestionId(Long questionId, A Answer answer = new Answer(answerRequestDTO.getAnswer(), answerRequestDTO.getImages(), postedBy, optionalQuestion.get()); Answer savedAnswer = answerRepository.save(answer); if (enableNotificationEmails) { - String[] recipients = Utilities.getUserEmails(userRepository.findByIsAdminTrue()); + String[] recipients = utilities.getUserEmails(userRepository.findByIsAdminTrue()); String subject = "Action Required: Approval needed for newly added answer"; String body = "Dear Admin,\n\nA new answer has been added to DoConnect application for question - '" + optionalQuestion.get().getQuestion() + "'. Please visit the application to either approve or delete the newly added question.\n\nDoConnect Bot\n\n\n\n\n\nAuto generated email. Please do not reply."; emailServiceImp.sendNotificationEmail(new EmailDTO(recipients, subject, body)); } - return new StatusDTO("", true, Utilities.convertAnswerToAnswerResponseDTO(savedAnswer)); + return new StatusDTO("", true, utilities.convertAnswerToAnswerResponseDTO(savedAnswer)); } @Override @@ -99,7 +102,7 @@ public StatusDTO updateAnswerForQuestionId(Long questionId, L Answer answer = optionalAnswer.get(); answer.setIsApproved(answerUpdateDTO.getIsApproved()); answer.setApprovedBy(approvedBy); - return new StatusDTO("", true, Utilities.convertAnswerToAnswerResponseDTO(answerRepository.save(answer))); + return new StatusDTO("", true, utilities.convertAnswerToAnswerResponseDTO(answerRepository.save(answer))); } @Override From e4ef910a47f8d9c531a3eb5010f4776970afdb5f Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 01:05:39 +0530 Subject: [PATCH 114/464] Create LogoutTokenRepository.java --- .../repository/LogoutTokenRepository.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/repository/LogoutTokenRepository.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/LogoutTokenRepository.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/LogoutTokenRepository.java new file mode 100644 index 0000000..d3d46c7 --- /dev/null +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/LogoutTokenRepository.java @@ -0,0 +1,17 @@ +package com.wipro.cp.doconnect.repository; + +import java.util.Optional; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import com.wipro.cp.doconnect.entity.LogoutToken; + +@Repository +public interface LogoutTokenRepository extends JpaRepository { + + Optional findByToken(String token); + + boolean existsByToken(String token); + +} From 6e2ffe97fbc1237f91a0293297edd00aa43e1540 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 01:05:47 +0530 Subject: [PATCH 115/464] Create AuthorizationInterceptor.java --- .../interceptor/AuthorizationInterceptor.java | 205 ++++++++++++++++++ 1 file changed, 205 insertions(+) create mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/interceptor/AuthorizationInterceptor.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/interceptor/AuthorizationInterceptor.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/interceptor/AuthorizationInterceptor.java new file mode 100644 index 0000000..25256f8 --- /dev/null +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/interceptor/AuthorizationInterceptor.java @@ -0,0 +1,205 @@ +package com.wipro.cp.doconnect.interceptor; + +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.web.servlet.HandlerInterceptor; + +import com.wipro.cp.doconnect.component.JwtTokenUtilityComponent; +import com.wipro.cp.doconnect.dto.StatusDTO; +import com.wipro.cp.doconnect.dto.UserResponseDTO; +import com.wipro.cp.doconnect.service.UserServiceImp; + +public class AuthorizationInterceptor implements HandlerInterceptor { + + @Autowired + private UserServiceImp userServiceImp; + + @Autowired + private JwtTokenUtilityComponent jwtTokenUtilityComponent; + + private String getParameterValue(Map parameterMap, String key) { + String[] value = parameterMap.getOrDefault(key, null); + if ((value == null) || (value.length != 1) || value[0].length() == 0) { + return null; + } + return value[0]; + } + + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + final String currentMethod = request.getMethod(); + final String currentURI = request.getRequestURI().toString(); + final Map parameterMap = request.getParameterMap(); + if (currentURI.equalsIgnoreCase("/api/v1/questions") && HttpMethod.GET.matches(currentMethod)) { + if (!parameterMap.containsKey("status") && !parameterMap.containsKey("search")) { + return true; + } + } + else if (currentURI.equalsIgnoreCase("/api/v1/register") || currentURI.equalsIgnoreCase("/api/v1/login")) { + if (HttpMethod.POST.matches(currentMethod)) { + return true; + } + response.sendError(HttpStatus.FORBIDDEN.value()); + return false; + } + final String requestTokenHeader = request.getHeader("Authorization"); + String username = null; + String jwtToken = null; + // JWT Token is in the form "Bearer token". Remove Bearer word and get only the token + if (requestTokenHeader != null && requestTokenHeader.startsWith("Bearer ")) { + jwtToken = requestTokenHeader.substring(7); + try { + username = jwtTokenUtilityComponent.getUsernameFromToken(jwtToken); + } catch (Exception e) { + System.out.println("Exception " + e.toString()); + } + } + if (username != null) { + StatusDTO userStatus = userServiceImp.getUserByUsername(username); + if (!userStatus.getIsValid()) { + response.sendError(HttpStatus.FORBIDDEN.value()); + return false; + } + UserResponseDTO userResponseDTO = userStatus.getObject(); + boolean isUserAdmin = userResponseDTO.getIsAdmin(); + if (currentURI.equalsIgnoreCase("/api/v1/signout") && HttpMethod.GET.matches(currentMethod)) { + return true; + } + else if (currentURI.equalsIgnoreCase("/api/v1/answers") && HttpMethod.GET.matches(currentMethod) && isUserAdmin) { + return true; + } + else if ( + currentURI.toLowerCase().startsWith("/api/v1/users") && + (HttpMethod.GET.matches(currentMethod) || HttpMethod.POST.matches(currentMethod) || HttpMethod.PUT.matches(currentMethod) || HttpMethod.DELETE.matches(currentMethod)) + ) { + if (isUserAdmin) { + return true; + } + response.sendError(HttpStatus.FORBIDDEN.value()); + return false; + } + else if (currentURI.toLowerCase().startsWith("/api/v1/questions")) { + String[] uriParts = currentURI.split("/"); + if (uriParts.length == 4) { + if (uriParts[3].equalsIgnoreCase("questions")) { + if (HttpMethod.POST.matches(currentMethod) && !isUserAdmin) { + return true; + } + else if (HttpMethod.GET.matches(currentMethod)) { + String statusValue = getParameterValue(parameterMap, "status"); + String searchValue = getParameterValue(parameterMap, "search"); + if (searchValue == null && statusValue != null) { + if (statusValue.equalsIgnoreCase("approved")) { + return true; + } + else if ((statusValue.equalsIgnoreCase("unapproved") || statusValue.equalsIgnoreCase("all")) && isUserAdmin) { + return true; + } + else { + response.sendError(HttpStatus.FORBIDDEN.value()); + return false; + } + } + else if (searchValue != null && statusValue == null) { + if (!isUserAdmin) { + return true; + } + else { + response.sendError(HttpStatus.FORBIDDEN.value()); + return false; + } + } + else { + if (statusValue.equalsIgnoreCase("approved") && !isUserAdmin) { + return true; + } + else { + response.sendError(HttpStatus.FORBIDDEN.value()); + return false; + } + } + } + else { + response.sendError(HttpStatus.FORBIDDEN.value()); + return false; + } + } + else { + response.sendError(HttpStatus.FORBIDDEN.value()); + return false; + } + } + else if (uriParts.length == 5) { + if ( + uriParts[3].equalsIgnoreCase("questions") && + (HttpMethod.PUT.matches(currentMethod) || HttpMethod.DELETE.matches(currentMethod)) && + isUserAdmin + ) { + return true; + } + else { + response.sendError(HttpStatus.FORBIDDEN.value()); + return false; + } + } + else if (uriParts.length == 6) { + if (uriParts[3].equalsIgnoreCase("questions") && uriParts[5].equalsIgnoreCase("answers")) { + if (HttpMethod.POST.matches(currentMethod) && !isUserAdmin) { + return true; + } + else if (HttpMethod.GET.matches(currentMethod)) { + String statusValue = getParameterValue(parameterMap, "status"); + if (statusValue == null || statusValue.equalsIgnoreCase("approved")) { + return true; + } + else if ((statusValue.equalsIgnoreCase("all") || statusValue.equalsIgnoreCase("unapproved")) && isUserAdmin) { + return true; + } + else { + response.sendError(HttpStatus.FORBIDDEN.value()); + return false; + } + } + else { + response.sendError(HttpStatus.FORBIDDEN.value()); + return false; + } + } + else { + response.sendError(HttpStatus.FORBIDDEN.value()); + return false; + } + } + else if (uriParts.length == 7) { + if ( + uriParts[3].equalsIgnoreCase("questions") && uriParts[5].equalsIgnoreCase("answers") && + (HttpMethod.PUT.matches(currentMethod) || HttpMethod.DELETE.matches(currentMethod)) && + isUserAdmin + ) { + return true; + } + else { + response.sendError(HttpStatus.FORBIDDEN.value()); + return false; + } + } + else { + response.sendError(HttpStatus.FORBIDDEN.value()); + return false; + } + } + else { + response.sendError(HttpStatus.FORBIDDEN.value()); + return false; + } + } + response.sendError(HttpStatus.FORBIDDEN.value()); + return false; + } + +} From da5fd417949e57b76cc04799c798dc0693d2402b Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 01:05:56 +0530 Subject: [PATCH 116/464] Update Question.java --- .../src/main/java/com/wipro/cp/doconnect/entity/Question.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Question.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Question.java index 021f11d..c325979 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Question.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Question.java @@ -12,6 +12,7 @@ import javax.persistence.Table; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; import org.hibernate.annotations.CreationTimestamp; @@ -27,6 +28,7 @@ public class Question { @NotNull @NotEmpty + @Size(max = 1024) private String question; @NotNull From b1a93298a385a7eb0908a3ef56c89cbde0320671 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 01:06:11 +0530 Subject: [PATCH 117/464] Create LogoutToken.java --- .../cp/doconnect/entity/LogoutToken.java | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/entity/LogoutToken.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/LogoutToken.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/LogoutToken.java new file mode 100644 index 0000000..f8b9ab3 --- /dev/null +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/LogoutToken.java @@ -0,0 +1,46 @@ +package com.wipro.cp.doconnect.entity; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +@Entity +@Table(name = "logout_token") +public class LogoutToken { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @NotNull + @NotEmpty + @Size(max = 512) + private String token; + + public Long getId() { + return id; + } + + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; + } + + public LogoutToken(@NotNull @NotEmpty String token) { + super(); + this.token = token; + } + + public LogoutToken() { + super(); + } + +} From 02bd594dca2f502b908c6b343334d053ebc7bc53 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 01:06:17 +0530 Subject: [PATCH 118/464] Update Answer.java --- .../src/main/java/com/wipro/cp/doconnect/entity/Answer.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Answer.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Answer.java index 38f0d5a..44c4c41 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Answer.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Answer.java @@ -15,6 +15,7 @@ import javax.persistence.Table; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; import org.hibernate.annotations.CreationTimestamp; import org.hibernate.annotations.OnDelete; @@ -33,6 +34,7 @@ public class Answer { @NotNull @NotEmpty + @Size(max = 1024) private String answer; @Column From f0e74ab606e8b8810c1c00f588c17815de32bc48 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 01:06:39 +0530 Subject: [PATCH 119/464] Create UserLoginResponseDTO.java --- .../doconnect/dto/UserLoginResponseDTO.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserLoginResponseDTO.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserLoginResponseDTO.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserLoginResponseDTO.java new file mode 100644 index 0000000..b246cd2 --- /dev/null +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserLoginResponseDTO.java @@ -0,0 +1,24 @@ +package com.wipro.cp.doconnect.dto; + +import java.io.Serializable; + +public class UserLoginResponseDTO implements Serializable { + + private static final long serialVersionUID = -8091879091924046844L; + private final String jwttoken; + private final String tokenType; + + public UserLoginResponseDTO(String jwttoken, String tokenType) { + this.jwttoken = jwttoken; + this.tokenType = tokenType; + } + + public String getToken() { + return this.jwttoken; + } + + public String getTokenType() { + return tokenType; + } + +} From 827fde93b48f3d728ba746683ddcb1570d18d2c7 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 01:06:45 +0530 Subject: [PATCH 120/464] Create UserLoginRequestDTO.java --- .../cp/doconnect/dto/UserLoginRequestDTO.java | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserLoginRequestDTO.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserLoginRequestDTO.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserLoginRequestDTO.java new file mode 100644 index 0000000..aa27e28 --- /dev/null +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserLoginRequestDTO.java @@ -0,0 +1,35 @@ +package com.wipro.cp.doconnect.dto; + +import java.io.Serializable; + +public class UserLoginRequestDTO implements Serializable { + + private static final long serialVersionUID = 5926468583005150707L; + + private String username; + private String password; + + public UserLoginRequestDTO() {} + + public UserLoginRequestDTO(String username, String password) { + this.setUsername(username); + this.setPassword(password); + } + + public String getUsername() { + return this.username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return this.password; + } + + public void setPassword(String password) { + this.password = password; + } + +} From 0eaf73f03fb7931813638ae39a139dcd5a40292d Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 01:06:52 +0530 Subject: [PATCH 121/464] Update QuestionController.java --- .../doconnect/controller/QuestionController.java | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/QuestionController.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/QuestionController.java index d3d6d7e..73a34e7 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/QuestionController.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/QuestionController.java @@ -7,6 +7,7 @@ import javax.validation.constraints.Min; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.CrossOrigin; @@ -16,6 +17,7 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @@ -25,6 +27,7 @@ import com.wipro.cp.doconnect.dto.QuestionUpdateDTO; import com.wipro.cp.doconnect.dto.StatusDTO; import com.wipro.cp.doconnect.service.QuestionServiceImp; +import com.wipro.cp.doconnect.util.Utilities; @RestController @CrossOrigin @@ -34,6 +37,9 @@ public class QuestionController { @Autowired private QuestionServiceImp questionServiceImp; + @Autowired + private Utilities utilities; + @GetMapping("/questions") public ResponseEntity getAllQuestions(@RequestParam(name="status") Optional optionalStatus, @RequestParam(name="search") Optional optionalSearch) { String status = "approved"; @@ -52,9 +58,8 @@ public ResponseEntity getAllQuestions(@RequestParam(name="status") Optional createQuestion(@Valid @RequestBody QuestionRequestDTO questionRequestDTO) { - // TODO: Read the postedBy value from Authorization Header - String postedBy = "Dummy"; + public ResponseEntity createQuestion(@Valid @RequestBody QuestionRequestDTO questionRequestDTO, @RequestHeader(HttpHeaders.AUTHORIZATION) String authorizationHeader) { + String postedBy = utilities.getUsernameFromAuthorizationHeader(authorizationHeader); StatusDTO questionStatus = questionServiceImp.createQuestion(questionRequestDTO, postedBy); if (!questionStatus.getIsValid()) { return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(questionStatus.getStatusMessage()); @@ -63,9 +68,8 @@ public ResponseEntity createQuestion(@Valid @RequestBody QuestionRequestDTO q } @PutMapping("/questions/{questionId}") - public ResponseEntity updateQuestion(@Valid @RequestBody QuestionUpdateDTO questionUpdateDTO, @PathVariable Long questionId) { - // TODO: Read the approvedBy value from Authorization Header - String approvedBy = ""; + public ResponseEntity updateQuestion(@Valid @RequestBody QuestionUpdateDTO questionUpdateDTO, @PathVariable Long questionId, @RequestHeader(HttpHeaders.AUTHORIZATION) String authorizationHeader) { + String approvedBy = utilities.getUsernameFromAuthorizationHeader(authorizationHeader); StatusDTO questionStatus = questionServiceImp.updateQuestion(questionUpdateDTO, questionId, approvedBy); if (!questionStatus.getIsValid()) { return ResponseEntity.status(HttpStatus.NOT_FOUND).body(questionStatus.getStatusMessage()); From 651dcf3a7a4f261afec83b66a140f9b301139d82 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 01:06:57 +0530 Subject: [PATCH 122/464] Create AuthenticationController.java --- .../controller/AuthenticationController.java | 89 +++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AuthenticationController.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AuthenticationController.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AuthenticationController.java new file mode 100644 index 0000000..5bec079 --- /dev/null +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AuthenticationController.java @@ -0,0 +1,89 @@ +package com.wipro.cp.doconnect.controller; + +import javax.validation.Valid; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.authentication.DisabledException; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.wipro.cp.doconnect.component.JwtTokenUtilityComponent; +import com.wipro.cp.doconnect.dto.StatusDTO; +import com.wipro.cp.doconnect.dto.UserLoginRequestDTO; +import com.wipro.cp.doconnect.dto.UserLoginResponseDTO; +import com.wipro.cp.doconnect.dto.UserRegisterDTO; +import com.wipro.cp.doconnect.dto.UserResponseDTO; +import com.wipro.cp.doconnect.entity.LogoutToken; +import com.wipro.cp.doconnect.service.LogoutTokenServiceImp; +import com.wipro.cp.doconnect.service.UserServiceImp; + +@RestController +@CrossOrigin +@RequestMapping("/api/v1") +public class AuthenticationController { + + @Autowired + private AuthenticationManager authenticationManager; + + @Autowired + private JwtTokenUtilityComponent jwtTokenUtilityComponent; + + @Autowired + private UserServiceImp userServiceImp; + + @Autowired + private LogoutTokenServiceImp logoutTokenServiceImp; + + @GetMapping("/signout") + public ResponseEntity logoutUser(@RequestHeader(HttpHeaders.AUTHORIZATION) String authorizationHeader) { + if (authorizationHeader.startsWith("Bearer ")) { + String jwtToken = authorizationHeader.substring(7); + logoutTokenServiceImp.createToken(new LogoutToken(jwtToken)); + return ResponseEntity.ok("You have been successfully logged out."); + } + else { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Authorization header does not begin with Bearer string."); + } + } + + @PostMapping("/register") + public ResponseEntity registerUser(@Valid @RequestBody UserRegisterDTO userRegisterDTO) { + StatusDTO userStatus = userServiceImp.createUser(userRegisterDTO); + if (!userStatus.getIsValid()) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(userStatus.getStatusMessage()); + } + UserResponseDTO userResponseDTO = userStatus.getObject(); + return ResponseEntity.ok(userResponseDTO.getUsername() + " has been registered successfully" + (userResponseDTO.getIsAdmin() ? " as an admin." : " as a user.") + " Proceed to login to get your authorization token."); + } + + @PostMapping("/login") + public ResponseEntity createAuthenticationToken(@RequestBody UserLoginRequestDTO userLoginRequestDTO) throws Exception { + authenticate(userLoginRequestDTO.getUsername(), userLoginRequestDTO.getPassword()); + final UserDetails userDetails = userServiceImp.loadUserByUsername(userLoginRequestDTO.getUsername()); + final String token = jwtTokenUtilityComponent.generateToken(userDetails); + return ResponseEntity.ok(new UserLoginResponseDTO(token, "Bearer")); + } + + private void authenticate(String username, String password) throws Exception { + try { + authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(username, password)); + } catch (DisabledException e) { + throw new Exception("USER_DISABLED", e); + } catch (BadCredentialsException e) { + throw new Exception("INVALID_CREDENTIALS", e); + } + } + +} From a054b36061fdb9f488d4ccbf721079d8c6ac70b0 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 01:07:02 +0530 Subject: [PATCH 123/464] Update AnswerController.java --- .../doconnect/controller/AnswerController.java | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AnswerController.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AnswerController.java index 35a57df..fc88b6a 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AnswerController.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AnswerController.java @@ -6,6 +6,7 @@ import javax.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.CrossOrigin; @@ -15,6 +16,7 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @@ -24,6 +26,7 @@ import com.wipro.cp.doconnect.dto.AnswerUpdateDTO; import com.wipro.cp.doconnect.dto.StatusDTO; import com.wipro.cp.doconnect.service.AnswerServiceImp; +import com.wipro.cp.doconnect.util.Utilities; @RestController @CrossOrigin @@ -33,6 +36,9 @@ public class AnswerController { @Autowired AnswerServiceImp answerServiceImp; + @Autowired + private Utilities utilities; + @GetMapping("/answers") public ResponseEntity getAllAnswers(@RequestParam(name="status") Optional optionalStatus) { String answerStatus = "approved"; @@ -60,9 +66,8 @@ public ResponseEntity getAllAnswersForQuestionId(@PathVariable(value="questio } @PostMapping("/questions/{questionId}/answers") - public ResponseEntity createAnswerForQuestionId(@PathVariable(value="questionId") Long questionId, @Valid @RequestBody AnswerRequestDTO answerRequestDTO) { - // TODO: Read the postedBy value from Authorization Header - String postedBy = "Dummy"; + public ResponseEntity createAnswerForQuestionId(@PathVariable(value="questionId") Long questionId, @Valid @RequestBody AnswerRequestDTO answerRequestDTO, @RequestHeader(HttpHeaders.AUTHORIZATION) String authorizationHeader) { + String postedBy = utilities.getUsernameFromAuthorizationHeader(authorizationHeader); StatusDTO answerResponseDTOStatus = answerServiceImp.createAnswerForQuestionId(questionId, answerRequestDTO, postedBy); if (!answerResponseDTOStatus.getIsValid()) { return ResponseEntity.status(HttpStatus.NOT_FOUND).body(answerResponseDTOStatus.getStatusMessage()); @@ -71,9 +76,8 @@ public ResponseEntity createAnswerForQuestionId(@PathVariable(value="question } @PutMapping("/questions/{questionId}/answers/{answerId}") - public ResponseEntity updateAnswerForQuestionId(@Valid @RequestBody AnswerUpdateDTO answerUpdateDTO, @PathVariable(value="questionId") Long questionId, @PathVariable(value="answerId") Long answerId) { - // TODO: Read the approvedBy value from Authorization Header - String approvedBy = ""; + public ResponseEntity updateAnswerForQuestionId(@Valid @RequestBody AnswerUpdateDTO answerUpdateDTO, @PathVariable(value="questionId") Long questionId, @PathVariable(value="answerId") Long answerId, @RequestHeader(HttpHeaders.AUTHORIZATION) String authorizationHeader) { + String approvedBy = utilities.getUsernameFromAuthorizationHeader(authorizationHeader); StatusDTO answerResponseDTOStatus = answerServiceImp.updateAnswerForQuestionId(questionId, answerId, answerUpdateDTO, approvedBy); if (!answerResponseDTOStatus.getIsValid()) { return ResponseEntity.status(HttpStatus.NOT_FOUND).body(answerResponseDTOStatus.getStatusMessage()); From c5a75f64d74f005ade65fb4af65647aa4b1ece0c Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 01:07:07 +0530 Subject: [PATCH 124/464] Create WebSecurityConfig.java --- .../doconnect/config/WebSecurityConfig.java | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/config/WebSecurityConfig.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/config/WebSecurityConfig.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/config/WebSecurityConfig.java new file mode 100644 index 0000000..c19c1f0 --- /dev/null +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/config/WebSecurityConfig.java @@ -0,0 +1,53 @@ +package com.wipro.cp.doconnect.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +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.SecurityFilterChain; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; + +import com.wipro.cp.doconnect.component.JwtAuthenticationEntryPointComponent; +import com.wipro.cp.doconnect.component.JwtRequestFilterComponent; + +@EnableWebSecurity +public class WebSecurityConfig { + + @Autowired + private JwtAuthenticationEntryPointComponent jwtAuthenticationEntryPointComponent; + + @Autowired + private JwtRequestFilterComponent jwtRequestFilterComponent; + + @Bean + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } + + @Bean + public AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration) throws Exception { + return authenticationConfiguration.getAuthenticationManager(); + } + + @Bean + public SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception { + // We don't need CSRF for this example + httpSecurity.csrf().disable() + // don't authenticate this particular request + .authorizeRequests().antMatchers("/api/v1/register", "/api/v1/login", "/api/v1/questions").permitAll() + // all other requests need to be authenticated + .anyRequest().authenticated().and() + // make sure we use state less session; session won't be used to store user's state. + .exceptionHandling().authenticationEntryPoint(jwtAuthenticationEntryPointComponent).and().sessionManagement() + .sessionCreationPolicy(SessionCreationPolicy.STATELESS); + // Add a filter to validate the tokens with every request + httpSecurity.addFilterBefore(jwtRequestFilterComponent, UsernamePasswordAuthenticationFilter.class); + return httpSecurity.build(); + } + +} From 52dc58f4e4570fa3185d81ac00d815cae6e6997c Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 01:07:12 +0530 Subject: [PATCH 125/464] Create LogoutTokenSchedulerConfig.java --- .../config/LogoutTokenSchedulerConfig.java | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/config/LogoutTokenSchedulerConfig.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/config/LogoutTokenSchedulerConfig.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/config/LogoutTokenSchedulerConfig.java new file mode 100644 index 0000000..a9895ac --- /dev/null +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/config/LogoutTokenSchedulerConfig.java @@ -0,0 +1,48 @@ +package com.wipro.cp.doconnect.config; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.Scheduled; + +import com.wipro.cp.doconnect.component.JwtTokenUtilityComponent; +import com.wipro.cp.doconnect.entity.LogoutToken; +import com.wipro.cp.doconnect.service.LogoutTokenServiceImp; + +import io.jsonwebtoken.ExpiredJwtException; + +@Configuration +@EnableScheduling +public class LogoutTokenSchedulerConfig { + + @Autowired + private LogoutTokenServiceImp logoutTokenServiceImp; + + @Autowired + private JwtTokenUtilityComponent jwtTokenUtilityComponent; + + @Scheduled(fixedDelay = 15 * 60 * 1000) // 15 Minutes + public void deleteExpiredJwtTokens() { + System.out.println("deleteExpiredJwtTokens scheduled job started at " + System.currentTimeMillis()); + List logoutTokenList = logoutTokenServiceImp.getAllTokens(); + logoutTokenServiceImp.deleteAllTokens(); + List validLogoutTokenList = new ArrayList<>(); + for (LogoutToken logoutToken : logoutTokenList) { + try { + if (jwtTokenUtilityComponent.isTokenExpired(logoutToken.getToken())) { + System.out.println("JWT Token " + logoutToken.getToken() + " removed from logout_token table."); + } else { + validLogoutTokenList.add(logoutToken); + } + } catch (ExpiredJwtException e) { + System.out.println("Exception in deleteExpiredJwtTokens - " + e.toString()); + } + } + logoutTokenServiceImp.createTokens(validLogoutTokenList); + System.out.println("deleteExpiredJwtTokens scheduled job finished at " + System.currentTimeMillis()); + } + +} From 9efbd337071c791a50bbd3bb8ca8aff90fa3daae Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 01:07:17 +0530 Subject: [PATCH 126/464] Create AuthorizationConfig.java --- .../doconnect/config/AuthorizationConfig.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/config/AuthorizationConfig.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/config/AuthorizationConfig.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/config/AuthorizationConfig.java new file mode 100644 index 0000000..0cd29fc --- /dev/null +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/config/AuthorizationConfig.java @@ -0,0 +1,25 @@ +package com.wipro.cp.doconnect.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import com.wipro.cp.doconnect.interceptor.AuthorizationInterceptor; + +@Configuration +@EnableWebMvc +public class AuthorizationConfig implements WebMvcConfigurer { + + @Bean + public AuthorizationInterceptor authorizationInterceptor() { + return new AuthorizationInterceptor(); + } + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(authorizationInterceptor()).addPathPatterns("/**"); + } + +} From a09d0ab7395ee7f0c23bf6e0c2ce30dd9da9b843 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 01:07:19 +0530 Subject: [PATCH 127/464] Create JwtTokenUtilityComponent.java --- .../component/JwtTokenUtilityComponent.java | 95 +++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/component/JwtTokenUtilityComponent.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/component/JwtTokenUtilityComponent.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/component/JwtTokenUtilityComponent.java new file mode 100644 index 0000000..05884df --- /dev/null +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/component/JwtTokenUtilityComponent.java @@ -0,0 +1,95 @@ +package com.wipro.cp.doconnect.component; + +import java.io.Serializable; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.function.Function; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.stereotype.Component; + +import com.wipro.cp.doconnect.dto.StatusDTO; +import com.wipro.cp.doconnect.dto.UserResponseDTO; +import com.wipro.cp.doconnect.service.LogoutTokenServiceImp; +import com.wipro.cp.doconnect.service.UserServiceImp; + +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; + +@Component +public class JwtTokenUtilityComponent implements Serializable { + + private static final long serialVersionUID = -2550185165626007488L; + + @Value("${jwt.token-validity-time}") + private int JWT_TOKEN_VALIDITY; + + @Value("${jwt.secret}") + private String secret; + + @Autowired + private LogoutTokenServiceImp logoutTokenServiceImp; + + @Autowired + private UserServiceImp userServiceImp; + + public String getUsernameFromToken(String token) { + return getClaimFromToken(token, Claims::getSubject); + } + + public Date getExpirationDateFromToken(String token) { + return getClaimFromToken(token, Claims::getExpiration); + } + + public T getClaimFromToken(String token, Function claimsResolver) { + final Claims claims = getAllClaimsFromToken(token); + return claimsResolver.apply(claims); + } + + private Claims getAllClaimsFromToken(String token) { + return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody(); + } + + public Boolean isTokenExpired(String token) { + final Date expiration = getExpirationDateFromToken(token); + return expiration.before(new Date()); + } + + public String generateToken(UserDetails userDetails) { + Map claims = new HashMap<>(); + StatusDTO userStatus = userServiceImp.getUserByUsername(userDetails.getUsername()); + if (userStatus.getIsValid()) { + UserResponseDTO user = userStatus.getObject(); + claims.put("isAdmin", user.getIsAdmin()); + claims.put("email", user.getEmail()); + claims.put("name", user.getName()); + } + return doGenerateToken(claims, userDetails.getUsername()); + } + + //while creating the token - + //1. Define claims of the token, like Issuer, Expiration, Subject, and the ID + //2. Sign the JWT using the HS512 algorithm and secret key. + //3. According to JWS Compact Serialization(https://tools.ietf.org/html/draft-ietf-jose-json-web-signature-41#section-3.1) compaction of the JWT to a URL-safe string + private String doGenerateToken(Map claims, String subject) { + return Jwts.builder().setClaims(claims).setSubject(subject).setIssuedAt(new Date(System.currentTimeMillis())) + .setExpiration(new Date(System.currentTimeMillis() + JWT_TOKEN_VALIDITY * 1000)) + .signWith(SignatureAlgorithm.HS512, secret).compact(); + } + + //validate token + //First check if the token is present in the logout tokens list, if it exists, then token is invalid + //If token is still valid then get user name from token and check if it is same as in user details and the token is not expired + public Boolean validateToken(String token, UserDetails userDetails) { + if (logoutTokenServiceImp.checkIfTokenExists(token)) { + return false; + } + final String username = getUsernameFromToken(token); + return (username.equals(userDetails.getUsername()) && !isTokenExpired(token)); + } + +} From a4a20415f5aafdda0285bd38c89e42bdaf88d687 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 01:07:25 +0530 Subject: [PATCH 128/464] Create JwtRequestFilterComponent.java --- .../component/JwtRequestFilterComponent.java | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/component/JwtRequestFilterComponent.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/component/JwtRequestFilterComponent.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/component/JwtRequestFilterComponent.java new file mode 100644 index 0000000..8772231 --- /dev/null +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/component/JwtRequestFilterComponent.java @@ -0,0 +1,64 @@ +package com.wipro.cp.doconnect.component; + +import java.io.IOException; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; + +import com.wipro.cp.doconnect.service.UserServiceImp; + +import io.jsonwebtoken.ExpiredJwtException; + +@Component +public class JwtRequestFilterComponent extends OncePerRequestFilter { + + @Autowired + private UserServiceImp userServiceImp; + + @Autowired + private JwtTokenUtilityComponent jwtTokenUtilityComponent; + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException { + final String requestTokenHeader = request.getHeader("Authorization"); + String username = null; + String jwtToken = null; + // JWT Token is in the form "Bearer token". Remove Bearer word and get only the token + if (requestTokenHeader != null && requestTokenHeader.startsWith("Bearer ")) { + jwtToken = requestTokenHeader.substring(7); + try { + username = jwtTokenUtilityComponent.getUsernameFromToken(jwtToken); + } catch (IllegalArgumentException e) { + logger.error("Unable to get JWT Token from Authorization header. " + e.toString()); + } catch (ExpiredJwtException e) { + logger.error("JWT Token " + jwtToken + " has expired. " + e.toString()); + } + } else { + logger.warn("JWT Token does not begin with Bearer string"); + } + // Once we get the token validate it. + if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) { + UserDetails userDetails = this.userServiceImp.loadUserByUsername(username); + // if token is valid configure Spring Security to manually set authentication + if (jwtTokenUtilityComponent.validateToken(jwtToken, userDetails)) { + UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); + usernamePasswordAuthenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); + // After setting the Authentication in the context, we specify that the current user is authenticated. So it passes the + // Spring Security Configurations successfully. + SecurityContextHolder.getContext().setAuthentication(usernamePasswordAuthenticationToken); + } + } + chain.doFilter(request, response); + } + +} From a602c43603fd2cf2949bc1d9abe6630ab231fd34 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 01:07:27 +0530 Subject: [PATCH 129/464] Create JwtAuthenticationEntryPointComponent.java --- .../JwtAuthenticationEntryPointComponent.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/component/JwtAuthenticationEntryPointComponent.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/component/JwtAuthenticationEntryPointComponent.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/component/JwtAuthenticationEntryPointComponent.java new file mode 100644 index 0000000..536db43 --- /dev/null +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/component/JwtAuthenticationEntryPointComponent.java @@ -0,0 +1,23 @@ +package com.wipro.cp.doconnect.component; + +import java.io.IOException; +import java.io.Serializable; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.web.AuthenticationEntryPoint; +import org.springframework.stereotype.Component; + +@Component +public class JwtAuthenticationEntryPointComponent implements AuthenticationEntryPoint, Serializable { + + private static final long serialVersionUID = -7858869558953243875L; + + @Override + public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException { + response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized"); + } + +} From 1b872bd9d27afcd004ec4ed61b0a5501ca213a98 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 01:07:36 +0530 Subject: [PATCH 130/464] Update pom.xml --- DoConnect/pom.xml | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/DoConnect/pom.xml b/DoConnect/pom.xml index f1672fe..e7070e3 100644 --- a/DoConnect/pom.xml +++ b/DoConnect/pom.xml @@ -40,19 +40,24 @@ spring-boot-starter-test test - + + + io.jsonwebtoken + jjwt + 0.9.1 + org.springframework.boot spring-boot-starter-validation - + org.springframework.boot spring-boot-starter-mail From e32de3a745a029374c9c8d8ef7a92ce3b8c54a81 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 01:09:54 +0530 Subject: [PATCH 131/464] Update application.properties --- DoConnect/src/main/resources/application.properties | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/DoConnect/src/main/resources/application.properties b/DoConnect/src/main/resources/application.properties index 60e7a65..9146c20 100644 --- a/DoConnect/src/main/resources/application.properties +++ b/DoConnect/src/main/resources/application.properties @@ -1,13 +1,15 @@ server.port=9090 spring.datasource.url=jdbc:mysql://localhost:3306/do_connect?createDatabaseIfNotExist=true&useSSL=false -spring.datasource.username=root -spring.datasource.password=Password@12345 +spring.datasource.username= +spring.datasource.password= spring.jpa.hibernate.ddl-auto=update spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect spring.jpa.open-in-view=false jwt.secret=devashishpathrabe +# 3 hours jwt token validity = 3 * 60 * 60 +jwt.token-validity-time=10800 spring.main.allow-circular-references=true @@ -16,6 +18,8 @@ spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true image-storage-directory=/do_connect_images valid-image-extensions=png,jpeg +enable-notification-emails=false + spring.mail.host=smtp.gmail.com spring.mail.port=587 spring.mail.username= From 24ff5396e7ea0c1676e87c2a781565e1d9073a0b Mon Sep 17 00:00:00 2001 From: tapasaha-01 Date: Fri, 26 Aug 2022 11:16:07 +0530 Subject: [PATCH 132/464] My second commit --- doconnect_chat_service-main/pom.xml | 10 ++++++ .../controller/MessageController.java | 10 +++--- .../wipro/doconnectchat/dto/MessageDTO.java | 18 +++++++---- .../wipro/doconnectchat/dto/ResponseDTO.java | 6 ---- .../wipro/doconnectchat/entity/Message.java | 32 ++++++++++++------- .../service/IMessageService.java | 3 +- .../service/IMessageServiceImpl.java | 29 +++++++++-------- .../src/main/resources/application.properties | 4 +-- 8 files changed, 67 insertions(+), 45 deletions(-) diff --git a/doconnect_chat_service-main/pom.xml b/doconnect_chat_service-main/pom.xml index 0f35ceb..3a913d3 100644 --- a/doconnect_chat_service-main/pom.xml +++ b/doconnect_chat_service-main/pom.xml @@ -49,6 +49,16 @@ spring-boot-starter-test test + + org.springframework.boot + spring-boot-starter + + + org.springframework.boot + spring-boot-devtools + runtime + true + diff --git a/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/controller/MessageController.java b/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/controller/MessageController.java index d40dece..1fa9bcd 100644 --- a/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/controller/MessageController.java +++ b/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/controller/MessageController.java @@ -13,25 +13,27 @@ import org.springframework.web.bind.annotation.RestController; import com.wipro.doconnectchat.dto.MessageDTO; +import com.wipro.doconnectchat.entity.Message; import com.wipro.doconnectchat.service.IMessageService; @RestController -@RequestMapping("/chat") +@RequestMapping("/api/v1/chats") @CrossOrigin public class MessageController { @Autowired private IMessageService messageService; - @PostMapping("/sendMessage") + @PostMapping("/addmessages") public MessageDTO sendMessage(@Valid @RequestBody MessageDTO messageDTO) { return messageService.sendMessage(messageDTO); } - @GetMapping("/getMessage") - public List getMessage() { + @GetMapping("/getmessages") + public List getMessage() { return messageService.getMessage(); } + } diff --git a/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/dto/MessageDTO.java b/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/dto/MessageDTO.java index f7c69e7..0b42f46 100644 --- a/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/dto/MessageDTO.java +++ b/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/dto/MessageDTO.java @@ -1,20 +1,26 @@ package com.wipro.doconnectchat.dto; +import java.sql.Timestamp; + import javax.validation.constraints.NotBlank; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; -@Data -@NoArgsConstructor -@AllArgsConstructor + public class MessageDTO { @NotBlank(message = "provide the user Details") private String fromUser; @NotBlank(message = "provide message") private String message; + + Long datetime = System.currentTimeMillis(); + private Timestamp timestamp=new Timestamp(datetime); + + public Timestamp getTimestamp() { + + return timestamp; + } + public String getFromUser() { return fromUser; } diff --git a/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/dto/ResponseDTO.java b/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/dto/ResponseDTO.java index c7757f2..d22539f 100644 --- a/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/dto/ResponseDTO.java +++ b/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/dto/ResponseDTO.java @@ -1,12 +1,6 @@ package com.wipro.doconnectchat.dto; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; -@Data -@NoArgsConstructor -@AllArgsConstructor public class ResponseDTO { private String response; diff --git a/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/entity/Message.java b/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/entity/Message.java index ddb6b0a..7b7931d 100644 --- a/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/entity/Message.java +++ b/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/entity/Message.java @@ -1,5 +1,7 @@ package com.wipro.doconnectchat.entity; +import java.sql.Timestamp; + import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; @@ -10,9 +12,7 @@ import lombok.NoArgsConstructor; @Entity -@Data -@NoArgsConstructor -@AllArgsConstructor + public class Message { @Id @@ -21,13 +21,22 @@ public class Message { // @NotBlank(message = "To which user u want to send") private String message; - private String fromUser; + + // to do timestamp + + private String username; + + Long datetime = System.currentTimeMillis(); + private Timestamp timestamp = new Timestamp(datetime); + + public Timestamp getTimestamp() { + + return timestamp; + } + public Long getId() { return id; } - public void setId(Long id) { - this.id = id; - } public String getMessage() { return message; } @@ -35,16 +44,15 @@ public void setMessage(String message) { this.message = message; } public String getFromUser() { - return fromUser; + return username; } public void setFromUser(String fromUser) { - this.fromUser = fromUser; + this.username = fromUser; } - public Message(Long id, String message, String fromUser) { + public Message(String message, String fromUser) { super(); - this.id = id; this.message = message; - this.fromUser = fromUser; + this.username = fromUser; } public Message() { super(); diff --git a/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/service/IMessageService.java b/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/service/IMessageService.java index 1f42951..01ecc76 100644 --- a/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/service/IMessageService.java +++ b/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/service/IMessageService.java @@ -5,11 +5,12 @@ import javax.validation.Valid; import com.wipro.doconnectchat.dto.MessageDTO; +import com.wipro.doconnectchat.entity.Message; public interface IMessageService { public MessageDTO sendMessage(@Valid MessageDTO messageDTO); - public List getMessage(); + public List getMessage(); } diff --git a/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/service/IMessageServiceImpl.java b/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/service/IMessageServiceImpl.java index 9b71ab6..8144bad 100644 --- a/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/service/IMessageServiceImpl.java +++ b/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/service/IMessageServiceImpl.java @@ -24,29 +24,30 @@ public MessageDTO sendMessage(@Valid MessageDTO messageDTO) { Message message = new Message(); message.setMessage(messageDTO.getMessage()); message.setFromUser(messageDTO.getFromUser()); - message = messageRepo.save(message); - messageDTO.setFromUser(message.getFromUser()); messageDTO.setMessage(message.getMessage()); - + message = messageRepo.save(message); return messageDTO; } @Override - public List getMessage() { + public List getMessage() { List data = new ArrayList(); List messages = messageRepo.findAll(); - for (Message message : messages) { - - MessageDTO messageDTO = new MessageDTO(); - messageDTO.setFromUser(message.getFromUser()); - messageDTO.setMessage(message.getMessage()); - data.add(messageDTO); - - } - - return data; +// if(messages.size()==0) { +// return new List +// } +// for (Message message : messages) { +// +// MessageDTO messageDTO = new MessageDTO(); +// messageDTO.setFromUser(message.getFromUser()); +// messageDTO.setMessage(message.getMessage()); +// data.add(messageDTO); +// +// } + + return messages; } } diff --git a/doconnect_chat_service-main/src/main/resources/application.properties b/doconnect_chat_service-main/src/main/resources/application.properties index 6802dd8..4f1ae40 100644 --- a/doconnect_chat_service-main/src/main/resources/application.properties +++ b/doconnect_chat_service-main/src/main/resources/application.properties @@ -1,6 +1,6 @@ #port Number -server.port=9595 +server.port=8080 #hibernate spring.jpa.hibernate.ddl-auto=update @@ -9,5 +9,5 @@ spring.jpa.show-sql=true #database configuration : mysql spring.datasource.url=jdbc:mysql://localhost:3306/doConectChatDB spring.datasource.username=root -spring.datasource.password=ROOT +spring.datasource.password=Sonu#2000 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver From 921f71bd38abb85b042c0e2e678cd2bf67a2676b Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 11:40:46 +0530 Subject: [PATCH 133/464] Update AuthorizationInterceptor.java --- .../cp/doconnect/interceptor/AuthorizationInterceptor.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/interceptor/AuthorizationInterceptor.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/interceptor/AuthorizationInterceptor.java index 25256f8..e1172c8 100644 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/interceptor/AuthorizationInterceptor.java +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/interceptor/AuthorizationInterceptor.java @@ -83,6 +83,12 @@ else if ( response.sendError(HttpStatus.FORBIDDEN.value()); return false; } + else if ( + currentURI.toLowerCase().startsWith("/api/v1/images") && + (HttpMethod.GET.matches(currentMethod) || HttpMethod.POST.matches(currentMethod)) && !isUserAdmin + ) { + return true; + } else if (currentURI.toLowerCase().startsWith("/api/v1/questions")) { String[] uriParts = currentURI.split("/"); if (uriParts.length == 4) { From f7cc0072235e85955d3b0d2bd5a4fbb5f5201186 Mon Sep 17 00:00:00 2001 From: tapasaha-01 Date: Fri, 26 Aug 2022 11:45:48 +0530 Subject: [PATCH 134/464] My third commit --- .../controller/MessageController.java | 2 +- .../wipro/doconnectchat/dto/MessageDTO.java | 10 ++++++- .../wipro/doconnectchat/entity/Message.java | 3 --- .../service/IMessageService.java | 2 +- .../service/IMessageServiceImpl.java | 26 ++++++------------- 5 files changed, 19 insertions(+), 24 deletions(-) diff --git a/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/controller/MessageController.java b/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/controller/MessageController.java index 1fa9bcd..a83e1ea 100644 --- a/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/controller/MessageController.java +++ b/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/controller/MessageController.java @@ -25,7 +25,7 @@ public class MessageController { private IMessageService messageService; @PostMapping("/addmessages") - public MessageDTO sendMessage(@Valid @RequestBody MessageDTO messageDTO) { + public Message sendMessage(@Valid @RequestBody MessageDTO messageDTO) { return messageService.sendMessage(messageDTO); } diff --git a/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/dto/MessageDTO.java b/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/dto/MessageDTO.java index 0b42f46..e79d704 100644 --- a/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/dto/MessageDTO.java +++ b/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/dto/MessageDTO.java @@ -10,9 +10,15 @@ public class MessageDTO { @NotBlank(message = "provide the user Details") private String fromUser; + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } @NotBlank(message = "provide message") private String message; - + private Long id; Long datetime = System.currentTimeMillis(); private Timestamp timestamp=new Timestamp(datetime); @@ -21,6 +27,8 @@ public Timestamp getTimestamp() { return timestamp; } + + public String getFromUser() { return fromUser; } diff --git a/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/entity/Message.java b/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/entity/Message.java index 7b7931d..adff7ed 100644 --- a/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/entity/Message.java +++ b/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/entity/Message.java @@ -7,9 +7,6 @@ import javax.persistence.GenerationType; import javax.persistence.Id; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; @Entity diff --git a/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/service/IMessageService.java b/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/service/IMessageService.java index 01ecc76..a099559 100644 --- a/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/service/IMessageService.java +++ b/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/service/IMessageService.java @@ -9,7 +9,7 @@ public interface IMessageService { - public MessageDTO sendMessage(@Valid MessageDTO messageDTO); + public Message sendMessage(@Valid MessageDTO messageDTO); public List getMessage(); diff --git a/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/service/IMessageServiceImpl.java b/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/service/IMessageServiceImpl.java index 8144bad..8b9b2eb 100644 --- a/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/service/IMessageServiceImpl.java +++ b/doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/service/IMessageServiceImpl.java @@ -19,33 +19,23 @@ public class IMessageServiceImpl implements IMessageService { private IMessageRepo messageRepo; @Override - public MessageDTO sendMessage(@Valid MessageDTO messageDTO) { + public Message sendMessage(@Valid MessageDTO messageDTO) { Message message = new Message(); message.setMessage(messageDTO.getMessage()); message.setFromUser(messageDTO.getFromUser()); - messageDTO.setFromUser(message.getFromUser()); - messageDTO.setMessage(message.getMessage()); - message = messageRepo.save(message); - return messageDTO; +// messageDTO.setFromUser(message.getFromUser()); +// messageDTO.setMessage(message.getMessage()); + + return messageRepo.save(message); +// return message; } @Override - public List getMessage() { - List data = new ArrayList(); + public List getMessage() { List messages = messageRepo.findAll(); -// if(messages.size()==0) { -// return new List -// } -// for (Message message : messages) { -// -// MessageDTO messageDTO = new MessageDTO(); -// messageDTO.setFromUser(message.getFromUser()); -// messageDTO.setMessage(message.getMessage()); -// data.add(messageDTO); -// -// } + return messages; } From 9f2c51d93e26a49522800d73d040a85733955043 Mon Sep 17 00:00:00 2001 From: ravi0818 Date: Fri, 26 Aug 2022 11:56:32 +0530 Subject: [PATCH 135/464] search and uploadimage added --- do_connect_frontend/db.json | 25 ++++++++++++++-- .../src/app/app.component.html | 3 ++ do_connect_frontend/src/app/app.component.ts | 1 + do_connect_frontend/src/app/app.module.ts | 2 ++ .../src/app/login/login.component.ts | 12 ++++---- .../src/app/navbar/navbar.component.css | 15 ++++++++++ .../src/app/navbar/navbar.component.html | 17 +++++++++-- .../src/app/navbar/navbar.component.ts | 2 ++ .../post-question.component.html | 19 +++++++++++- .../post-question/post-question.component.ts | 30 +++++++++++++++++-- .../src/app/register/register.component.html | 10 +++++++ .../src/app/register/register.component.ts | 4 ++- .../src/app/search/search.component.css | 10 +++++++ .../src/app/search/search.component.html | 18 +++++++++++ .../src/app/search/search.component.spec.ts | 23 ++++++++++++++ .../src/app/search/search.component.ts | 28 +++++++++++++++++ .../src/app/service/admin.service.ts | 2 +- .../src/app/service/search.service.spec.ts | 16 ++++++++++ .../src/app/service/search.service.ts | 11 +++++++ .../app/service/upload-files.service.spec.ts | 16 ++++++++++ .../src/app/service/upload-files.service.ts | 26 ++++++++++++++++ .../src/app/service/user.service.ts | 12 ++++---- 22 files changed, 279 insertions(+), 23 deletions(-) create mode 100644 do_connect_frontend/src/app/search/search.component.css create mode 100644 do_connect_frontend/src/app/search/search.component.html create mode 100644 do_connect_frontend/src/app/search/search.component.spec.ts create mode 100644 do_connect_frontend/src/app/search/search.component.ts create mode 100644 do_connect_frontend/src/app/service/search.service.spec.ts create mode 100644 do_connect_frontend/src/app/service/search.service.ts create mode 100644 do_connect_frontend/src/app/service/upload-files.service.spec.ts create mode 100644 do_connect_frontend/src/app/service/upload-files.service.ts diff --git a/do_connect_frontend/db.json b/do_connect_frontend/db.json index 405574c..2163e62 100644 --- a/do_connect_frontend/db.json +++ b/do_connect_frontend/db.json @@ -13,12 +13,33 @@ "password": "admin", "phone": 9872487324, "id": 2 + }, + { + "name": "Ravi Kant Prasad", + "email": "rkpr8@gmail.com", + "password": "admin", + "phone": 9872487324, + "id": 3 + }, + { + "name": "Ravi Kant Prasad", + "email": "rkpr8@gmail.com", + "password": "admin", + "phone": 9872487324, + "id": 4 + }, + { + "name": "Ravi Kant Prasad", + "email": "rkpr8@gmail.com", + "password": "admin", + "phone": 9872487324, + "id": 5 } ], "questions": [ { "id": 1, - "question": "What is Java Constructor?", + "question": "this is question?", "postedBy": "Ravi", "date": "24-08-2022", "answers": [ @@ -44,7 +65,7 @@ }, { "id": 2, - "question": "What is Java Constructor?", + "question": "this is question?", "postedBy": "Ravi", "date": "24-08-2022", "answers": [ diff --git a/do_connect_frontend/src/app/app.component.html b/do_connect_frontend/src/app/app.component.html index a8a2264..b1b30fb 100644 --- a/do_connect_frontend/src/app/app.component.html +++ b/do_connect_frontend/src/app/app.component.html @@ -12,6 +12,9 @@ " > +
+ +
diff --git a/do_connect_frontend/src/app/app.component.ts b/do_connect_frontend/src/app/app.component.ts index 7947766..3084d06 100644 --- a/do_connect_frontend/src/app/app.component.ts +++ b/do_connect_frontend/src/app/app.component.ts @@ -8,6 +8,7 @@ import { Component } from '@angular/core'; export class AppComponent { title = 'angular-project'; chatbox = 'none'; + searchbox = 'none'; toggleChatBox() { this.chatbox = this.chatbox === 'block' ? 'none' : 'block'; } diff --git a/do_connect_frontend/src/app/app.module.ts b/do_connect_frontend/src/app/app.module.ts index 6b9d250..3f4c0bb 100644 --- a/do_connect_frontend/src/app/app.module.ts +++ b/do_connect_frontend/src/app/app.module.ts @@ -16,6 +16,7 @@ import { HomeComponent } from './home/home.component'; import { PostQuestionComponent } from './post-question/post-question.component'; import { ChatComponent } from './chat/chat.component'; import { QuestionComponent } from './question/question.component'; +import { SearchComponent } from './search/search.component'; @NgModule({ declarations: [ @@ -30,6 +31,7 @@ import { QuestionComponent } from './question/question.component'; PostQuestionComponent, ChatComponent, QuestionComponent, + SearchComponent, ], imports: [ BrowserModule, diff --git a/do_connect_frontend/src/app/login/login.component.ts b/do_connect_frontend/src/app/login/login.component.ts index c6f4411..fea0739 100644 --- a/do_connect_frontend/src/app/login/login.component.ts +++ b/do_connect_frontend/src/app/login/login.component.ts @@ -19,17 +19,15 @@ export class LoginComponent implements OnInit { this.warning = 'All field required'; return; } - this._userService - .loginUser({ email: this.email, password: this.password }) - .subscribe((res: any) => { - console.log(res); - if (res !== null && res.password === this.password) { + this._userService.getUsers().subscribe((res: any) => { + res.forEach((user: any) => { + if (user.email === this.email && user.password === this.password) { this._userService.setUser(res); alert('Successfully Loggedin'); this.roter.navigate(['/dashboard']); - } else { - alert('Invalid Credentials'); } }); + alert('Invalid Credentials'); + }); } } diff --git a/do_connect_frontend/src/app/navbar/navbar.component.css b/do_connect_frontend/src/app/navbar/navbar.component.css index 02bb1c4..4865be1 100644 --- a/do_connect_frontend/src/app/navbar/navbar.component.css +++ b/do_connect_frontend/src/app/navbar/navbar.component.css @@ -1,3 +1,18 @@ /* nav { background-color: rgba(61, 61, 61, 0.592); } */ + +input, +input:focus { + color: white; + outline: none !important; + box-shadow: none; + background-color: rgba(237, 234, 234, 0.358); + border: none; + border-radius: 5 5; + border-bottom: 2px solid white; +} +button { + color: antiquewhite; + border: 1px solid-white; +} diff --git a/do_connect_frontend/src/app/navbar/navbar.component.html b/do_connect_frontend/src/app/navbar/navbar.component.html index cb5208c..359e688 100644 --- a/do_connect_frontend/src/app/navbar/navbar.component.html +++ b/do_connect_frontend/src/app/navbar/navbar.component.html @@ -16,8 +16,19 @@ id="navbarNavAltMarkup" >
diff --git a/do_connect_frontend/src/app/navbar/navbar.component.ts b/do_connect_frontend/src/app/navbar/navbar.component.ts index 646ecb4..c35732d 100644 --- a/do_connect_frontend/src/app/navbar/navbar.component.ts +++ b/do_connect_frontend/src/app/navbar/navbar.component.ts @@ -10,4 +10,6 @@ export class NavbarComponent implements OnInit { constructor(private _userService: UserService) {} ngOnInit(): void {} + + onSearch() {} } diff --git a/do_connect_frontend/src/app/post-question/post-question.component.html b/do_connect_frontend/src/app/post-question/post-question.component.html index 4f0b61d..fc78803 100644 --- a/do_connect_frontend/src/app/post-question/post-question.component.html +++ b/do_connect_frontend/src/app/post-question/post-question.component.html @@ -9,7 +9,7 @@ [(ngModel)]="question" class="form-control" name="question" - rows="10" + rows="5" required > @@ -23,6 +23,23 @@ +
+
+ +
+
+
+ + + +
diff --git a/do_connect_frontend/src/app/post-question/post-question.component.ts b/do_connect_frontend/src/app/post-question/post-question.component.ts index c04aeb4..9fba1dc 100644 --- a/do_connect_frontend/src/app/post-question/post-question.component.ts +++ b/do_connect_frontend/src/app/post-question/post-question.component.ts @@ -1,4 +1,7 @@ import { Component, OnInit } from '@angular/core'; +import { DomSanitizer, SafeUrl } from '@angular/platform-browser'; +import { Observable } from 'rxjs'; +import { UploadFilesService } from '../service/upload-files.service'; @Component({ selector: 'app-post-question', @@ -9,10 +12,33 @@ export class PostQuestionComponent implements OnInit { question = ''; topic = 'java'; warning = ''; - constructor() {} + uploadedImages: string[] = []; + file: File = new File(['init'], 'init.txt'); - ngOnInit(): void {} + constructor( + private uploadService: UploadFilesService, + private sanitizer: DomSanitizer + ) {} + ngOnInit(): void {} + onChange(event: any) { + this.file = event.target.files[0]; + } + sanitizeImageUrl(imageUrl: string): SafeUrl { + return this.sanitizer.bypassSecurityTrustUrl(imageUrl); + } + onUploadImage() { + console.log(this.file); + this.uploadService.upload(this.file).subscribe( + (res: any) => { + console.warn(res); + }, + (error) => { + console.warn(error); + this.uploadedImages.push(error.error.text); + } + ); + } onSubmit() { if (this.question === '') { this.warning = 'All fields are required!'; diff --git a/do_connect_frontend/src/app/register/register.component.html b/do_connect_frontend/src/app/register/register.component.html index e6defec..307df55 100644 --- a/do_connect_frontend/src/app/register/register.component.html +++ b/do_connect_frontend/src/app/register/register.component.html @@ -2,6 +2,16 @@

Sign up

+
+ + +
{ console.log(res); diff --git a/do_connect_frontend/src/app/search/search.component.css b/do_connect_frontend/src/app/search/search.component.css new file mode 100644 index 0000000..60f3b2f --- /dev/null +++ b/do_connect_frontend/src/app/search/search.component.css @@ -0,0 +1,10 @@ +.search { + height: 70vh; + width: 90vw; + background-color: aliceblue; + padding: 1rem 2rem; + position: absolute; + top: 10%; + left: 5%; + border-radius: 5px; +} diff --git a/do_connect_frontend/src/app/search/search.component.html b/do_connect_frontend/src/app/search/search.component.html new file mode 100644 index 0000000..6792ab6 --- /dev/null +++ b/do_connect_frontend/src/app/search/search.component.html @@ -0,0 +1,18 @@ + diff --git a/do_connect_frontend/src/app/search/search.component.spec.ts b/do_connect_frontend/src/app/search/search.component.spec.ts new file mode 100644 index 0000000..eb69af9 --- /dev/null +++ b/do_connect_frontend/src/app/search/search.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SearchComponent } from './search.component'; + +describe('SearchComponent', () => { + let component: SearchComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ SearchComponent ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(SearchComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/do_connect_frontend/src/app/search/search.component.ts b/do_connect_frontend/src/app/search/search.component.ts new file mode 100644 index 0000000..4224e9b --- /dev/null +++ b/do_connect_frontend/src/app/search/search.component.ts @@ -0,0 +1,28 @@ +import { Component, OnInit } from '@angular/core'; +import { Router } from '@angular/router'; +import { UserService } from '../service/user.service'; + +@Component({ + selector: 'app-search', + templateUrl: './search.component.html', + styleUrls: ['./search.component.css'], +}) +export class SearchComponent implements OnInit { + data: any; + constructor(private _userService: UserService, private roter: Router) {} + + ngOnInit(): void { + this._userService.getApprovedQuestions().subscribe((res) => { + this.data = res; + console.log(res); + }); + } + + openQuestion(id: any) { + this.roter.navigate([`/question/${id}`]); + } + + onClose() { + this.roter.navigate(['/']); + } +} diff --git a/do_connect_frontend/src/app/service/admin.service.ts b/do_connect_frontend/src/app/service/admin.service.ts index 31ab7b0..d799034 100644 --- a/do_connect_frontend/src/app/service/admin.service.ts +++ b/do_connect_frontend/src/app/service/admin.service.ts @@ -5,7 +5,7 @@ import { Injectable } from '@angular/core'; providedIn: 'root', }) export class AdminService { - baseURL = 'http://localhost:3000'; + baseURL = 'http://localhost:8181/api/v1'; constructor(private http: HttpClient) {} diff --git a/do_connect_frontend/src/app/service/search.service.spec.ts b/do_connect_frontend/src/app/service/search.service.spec.ts new file mode 100644 index 0000000..23c42c7 --- /dev/null +++ b/do_connect_frontend/src/app/service/search.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { SearchService } from './search.service'; + +describe('SearchService', () => { + let service: SearchService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(SearchService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/do_connect_frontend/src/app/service/search.service.ts b/do_connect_frontend/src/app/service/search.service.ts new file mode 100644 index 0000000..03244a7 --- /dev/null +++ b/do_connect_frontend/src/app/service/search.service.ts @@ -0,0 +1,11 @@ +import { Injectable } from '@angular/core'; + +@Injectable({ + providedIn: 'root', +}) +export class SearchService { + searchActive = 'none'; + constructor() {} + + onOpen() {} +} diff --git a/do_connect_frontend/src/app/service/upload-files.service.spec.ts b/do_connect_frontend/src/app/service/upload-files.service.spec.ts new file mode 100644 index 0000000..b68459a --- /dev/null +++ b/do_connect_frontend/src/app/service/upload-files.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { UploadFilesService } from './upload-files.service'; + +describe('UploadFilesService', () => { + let service: UploadFilesService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(UploadFilesService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/do_connect_frontend/src/app/service/upload-files.service.ts b/do_connect_frontend/src/app/service/upload-files.service.ts new file mode 100644 index 0000000..b980c13 --- /dev/null +++ b/do_connect_frontend/src/app/service/upload-files.service.ts @@ -0,0 +1,26 @@ +import { HttpClient, HttpEvent, HttpRequest } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { Observable } from 'rxjs'; + +@Injectable({ + providedIn: 'root', +}) +export class UploadFilesService { + private baseURL = 'http://localhost:8181/api/v1'; + constructor(private http: HttpClient) {} + // Returns an observable + upload(file: any): Observable { + // Create form data + const formData = new FormData(); + + // Store form name as "file" with file data + formData.append('image', file, file.name); + + // Make http post request over api + // with formData as req + return this.http.post(`${this.baseURL}/images`, formData); + } + getFiles(): Observable { + return this.http.get(`${this.baseURL}/images`); + } +} diff --git a/do_connect_frontend/src/app/service/user.service.ts b/do_connect_frontend/src/app/service/user.service.ts index eff41db..80a54d3 100644 --- a/do_connect_frontend/src/app/service/user.service.ts +++ b/do_connect_frontend/src/app/service/user.service.ts @@ -5,7 +5,7 @@ import { Injectable } from '@angular/core'; providedIn: 'root', }) export class UserService { - baseURL = 'http://localhost:3000'; + baseURL = 'http://localhost:8181/api/v1'; user: any = { id: 0, name: '', @@ -13,11 +13,11 @@ export class UserService { }; constructor(private http: HttpClient) {} - registerUser(user: any) { - return this.http.post(`${this.baseURL}/auth/register`, user); + createUser(user: any) { + return this.http.post(`${this.baseURL}/users`, user); } - loginUser(user: any) { - return this.http.post(`${this.baseURL}/auth/login`, user); + getUsers() { + return this.http.get(`${this.baseURL}/users`); } setUser(user: any) { this.user = { @@ -28,7 +28,7 @@ export class UserService { } getQuestion(id: any) { - return this.http.get(this.baseURL + '/questions/' + id); + return this.http.get(this.baseURL + '/questions'); } getApprovedQuestions() { From f4429cc57db2f274642c02998771347ac0e78c70 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 14:54:22 +0530 Subject: [PATCH 136/464] Create SimpleCORSFilter.java --- .../doconnect/component/SimpleCORSFilter.java | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/component/SimpleCORSFilter.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/component/SimpleCORSFilter.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/component/SimpleCORSFilter.java new file mode 100644 index 0000000..9333c4a --- /dev/null +++ b/DoConnect/src/main/java/com/wipro/cp/doconnect/component/SimpleCORSFilter.java @@ -0,0 +1,44 @@ +package com.wipro.cp.doconnect.component; + +import java.io.IOException; +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +@Component +public class SimpleCORSFilter implements Filter { + + private final Logger log = LoggerFactory.getLogger(SimpleCORSFilter.class); + + public SimpleCORSFilter() { + log.info("SimpleCORSFilter init"); + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { + HttpServletRequest httpRequest = (HttpServletRequest) request; + HttpServletResponse httpResponse = (HttpServletResponse) response; + httpResponse.setHeader("Access-Control-Allow-Origin", httpRequest.getHeader("Origin")); + httpResponse.setHeader("Access-Control-Allow-Credentials", "true"); + httpResponse.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE"); + httpResponse.setHeader("Access-Control-Max-Age", "3600"); + httpResponse.setHeader("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With, remember-me"); + chain.doFilter(request, response); + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} + +} From 33018fd820541da78b7088982229f0239ce65211 Mon Sep 17 00:00:00 2001 From: ravi0818 Date: Fri, 26 Aug 2022 15:40:25 +0530 Subject: [PATCH 137/464] login & register updated --- .../src/app/login/login.component.html | 8 ++--- .../src/app/login/login.component.ts | 18 +++++------ .../post-question/post-question.component.ts | 13 ++++++-- .../src/app/register/register.component.ts | 6 ++-- .../src/app/service/user.service.ts | 31 +++++++++---------- 5 files changed, 40 insertions(+), 36 deletions(-) diff --git a/do_connect_frontend/src/app/login/login.component.html b/do_connect_frontend/src/app/login/login.component.html index 6c37bfa..671d2b8 100644 --- a/do_connect_frontend/src/app/login/login.component.html +++ b/do_connect_frontend/src/app/login/login.component.html @@ -4,12 +4,12 @@

Sign in

- +
diff --git a/do_connect_frontend/src/app/login/login.component.ts b/do_connect_frontend/src/app/login/login.component.ts index fea0739..1d426c6 100644 --- a/do_connect_frontend/src/app/login/login.component.ts +++ b/do_connect_frontend/src/app/login/login.component.ts @@ -8,26 +8,22 @@ import { UserService } from '../service/user.service'; styleUrls: ['./login.component.css'], }) export class LoginComponent implements OnInit { - email = ''; + username = ''; password = ''; warning = ''; constructor(private roter: Router, private _userService: UserService) {} ngOnInit(): void {} onLogin() { - if (this.email === '' || this.password === '') { + if (this.username === '' || this.password === '') { this.warning = 'All field required'; return; } - this._userService.getUsers().subscribe((res: any) => { - res.forEach((user: any) => { - if (user.email === this.email && user.password === this.password) { - this._userService.setUser(res); - alert('Successfully Loggedin'); - this.roter.navigate(['/dashboard']); - } + this._userService + .login({ username: this.username, password: this.password }) + .subscribe((res) => { + console.log(res); + // alert('Invalid Credentials'); }); - alert('Invalid Credentials'); - }); } } diff --git a/do_connect_frontend/src/app/post-question/post-question.component.ts b/do_connect_frontend/src/app/post-question/post-question.component.ts index 9fba1dc..33bdd09 100644 --- a/do_connect_frontend/src/app/post-question/post-question.component.ts +++ b/do_connect_frontend/src/app/post-question/post-question.component.ts @@ -2,6 +2,7 @@ import { Component, OnInit } from '@angular/core'; import { DomSanitizer, SafeUrl } from '@angular/platform-browser'; import { Observable } from 'rxjs'; import { UploadFilesService } from '../service/upload-files.service'; +import { UserService } from '../service/user.service'; @Component({ selector: 'app-post-question', @@ -16,8 +17,9 @@ export class PostQuestionComponent implements OnInit { file: File = new File(['init'], 'init.txt'); constructor( - private uploadService: UploadFilesService, - private sanitizer: DomSanitizer + private _uploadService: UploadFilesService, + private sanitizer: DomSanitizer, + private _userService: UserService ) {} ngOnInit(): void {} @@ -29,7 +31,7 @@ export class PostQuestionComponent implements OnInit { } onUploadImage() { console.log(this.file); - this.uploadService.upload(this.file).subscribe( + this._uploadService.upload(this.file).subscribe( (res: any) => { console.warn(res); }, @@ -43,5 +45,10 @@ export class PostQuestionComponent implements OnInit { if (this.question === '') { this.warning = 'All fields are required!'; } + this._userService + .postQuestion({ question: this.question, topic: this.topic }) + .subscribe((res) => { + console.warn(res); + }); } } diff --git a/do_connect_frontend/src/app/register/register.component.ts b/do_connect_frontend/src/app/register/register.component.ts index bc115f8..47f8451 100644 --- a/do_connect_frontend/src/app/register/register.component.ts +++ b/do_connect_frontend/src/app/register/register.component.ts @@ -24,14 +24,16 @@ export class RegisterComponent implements OnInit { this.warning = 'All field required'; return; } + let isAdmin = this.role === 'User' ? false : true; this._userService - .createUser({ + .register({ name: this.name, email: this.email, password: this.password, username: this.username, + isAdmin: isAdmin, }) - .subscribe((res) => { + .subscribe((res: any) => { console.log(res); this.router.navigate(['/login']); }); diff --git a/do_connect_frontend/src/app/service/user.service.ts b/do_connect_frontend/src/app/service/user.service.ts index 80a54d3..5114346 100644 --- a/do_connect_frontend/src/app/service/user.service.ts +++ b/do_connect_frontend/src/app/service/user.service.ts @@ -1,4 +1,5 @@ -import { HttpClient } from '@angular/common/http'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { ConditionalExpr } from '@angular/compiler'; import { Injectable } from '@angular/core'; @Injectable({ @@ -6,26 +7,21 @@ import { Injectable } from '@angular/core'; }) export class UserService { baseURL = 'http://localhost:8181/api/v1'; - user: any = { - id: 0, - name: '', - email: '', - }; + constructor(private http: HttpClient) {} - createUser(user: any) { - return this.http.post(`${this.baseURL}/users`, user); + register(user: any) { + console.warn(user); + return this.http.post(`${this.baseURL}/register`, user); + } + login(user: any) { + console.warn(user); + return this.http.post(`${this.baseURL}/login`, user); } getUsers() { return this.http.get(`${this.baseURL}/users`); } - setUser(user: any) { - this.user = { - id: user.id, - name: user.name, - email: user.email, - }; - } + setUser(user: any) {} getQuestion(id: any) { return this.http.get(this.baseURL + '/questions'); @@ -35,5 +31,8 @@ export class UserService { return this.http.get(this.baseURL + '/questions'); } - postQuestion(answer: any) {} + postQuestion(question: any) { + console.log(question); + return this.http.post(this.baseURL + '/questions', question); + } } From 96a332801cbb8b76d1f1058a81adfc5f916d214c Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:42:17 +0530 Subject: [PATCH 138/464] Update .gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index e10e727..6251d70 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,4 @@ /.metadata/ + +*.jar +*.class From e4230a559a136d26b3b6a66ebcb7146e5849fb12 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:42:56 +0530 Subject: [PATCH 139/464] Create .gitignore --- do_connect_backend/DoConnect/.gitignore | 33 +++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 do_connect_backend/DoConnect/.gitignore diff --git a/do_connect_backend/DoConnect/.gitignore b/do_connect_backend/DoConnect/.gitignore new file mode 100644 index 0000000..549e00a --- /dev/null +++ b/do_connect_backend/DoConnect/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ From f6b70aa8cbe8c1b0000778a271e31592ee559139 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:43:02 +0530 Subject: [PATCH 140/464] Create .gitignore --- do_connect_backend/DoConnect/bin/.gitignore | 33 +++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 do_connect_backend/DoConnect/bin/.gitignore diff --git a/do_connect_backend/DoConnect/bin/.gitignore b/do_connect_backend/DoConnect/bin/.gitignore new file mode 100644 index 0000000..549e00a --- /dev/null +++ b/do_connect_backend/DoConnect/bin/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ From 112025f3b36c364208cb46f670589c5ae34f8454 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:43:09 +0530 Subject: [PATCH 141/464] Delete DoConnectApplicationTests.java --- .../cp/doconnect/DoConnectApplicationTests.java | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100644 DoConnect/src/test/java/com/wipro/cp/doconnect/DoConnectApplicationTests.java diff --git a/DoConnect/src/test/java/com/wipro/cp/doconnect/DoConnectApplicationTests.java b/DoConnect/src/test/java/com/wipro/cp/doconnect/DoConnectApplicationTests.java deleted file mode 100644 index df78148..0000000 --- a/DoConnect/src/test/java/com/wipro/cp/doconnect/DoConnectApplicationTests.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.wipro.cp.doconnect; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class DoConnectApplicationTests { - - @Test - void contextLoads() { - } - -} From 8ce67eb99baeb36922fd00b3f68cc92973b4d8c5 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:43:12 +0530 Subject: [PATCH 142/464] Delete application.properties --- .../src/main/resources/application.properties | 28 ------------------- 1 file changed, 28 deletions(-) delete mode 100644 DoConnect/src/main/resources/application.properties diff --git a/DoConnect/src/main/resources/application.properties b/DoConnect/src/main/resources/application.properties deleted file mode 100644 index 9146c20..0000000 --- a/DoConnect/src/main/resources/application.properties +++ /dev/null @@ -1,28 +0,0 @@ -server.port=9090 - -spring.datasource.url=jdbc:mysql://localhost:3306/do_connect?createDatabaseIfNotExist=true&useSSL=false -spring.datasource.username= -spring.datasource.password= -spring.jpa.hibernate.ddl-auto=update -spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect -spring.jpa.open-in-view=false - -jwt.secret=devashishpathrabe -# 3 hours jwt token validity = 3 * 60 * 60 -jwt.token-validity-time=10800 - -spring.main.allow-circular-references=true - -spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true - -image-storage-directory=/do_connect_images -valid-image-extensions=png,jpeg - -enable-notification-emails=false - -spring.mail.host=smtp.gmail.com -spring.mail.port=587 -spring.mail.username= -spring.mail.password= -spring.mail.properties.mail.smtp.auth=true -spring.mail.properties.mail.smtp.starttls.enable=true From 5ef0e531330696b51766489dd0e0ba075205744a Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:43:14 +0530 Subject: [PATCH 143/464] Delete Utilities.java --- .../wipro/cp/doconnect/util/Utilities.java | 51 ------------------- 1 file changed, 51 deletions(-) delete mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/util/Utilities.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/util/Utilities.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/util/Utilities.java deleted file mode 100644 index c01f583..0000000 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/util/Utilities.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.wipro.cp.doconnect.util; - -import java.util.List; -import java.util.stream.Collectors; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import com.wipro.cp.doconnect.component.JwtTokenUtilityComponent; -import com.wipro.cp.doconnect.dto.AnswerResponseDTO; -import com.wipro.cp.doconnect.dto.QuestionResponseDTO; -import com.wipro.cp.doconnect.entity.Answer; -import com.wipro.cp.doconnect.entity.Question; -import com.wipro.cp.doconnect.entity.User; - -@Component -public class Utilities { - - @Autowired - private JwtTokenUtilityComponent jwtTokenUtilityComponent; - - public String[] getUserEmails(List userList) { - String[] array = new String[userList.size()]; - for (int i = 0; i < userList.size(); i++) { - array[i] = userList.get(i).getEmail(); - } - return array; - } - - public QuestionResponseDTO convertQuestionToQuestionResponseDTO(Question question) { - return new QuestionResponseDTO(question.getId(), question.getQuestion(), question.getTopic(), question.getImages(), question.getPostedBy(), question.getPostedAt(), question.getApprovedBy(), question.getIsApproved()); - } - - public List convertQuestionListToQuestionResponseDTOList(List questionList) { - return questionList.stream().map(question -> convertQuestionToQuestionResponseDTO(question)).collect(Collectors.toList()); - } - - public AnswerResponseDTO convertAnswerToAnswerResponseDTO(Answer answer) { - return new AnswerResponseDTO(answer.getId(), answer.getAnswer(), answer.getImages(), answer.getPostedBy(), answer.getPostedAt(), answer.getApprovedBy(), answer.getIsApproved(), convertQuestionToQuestionResponseDTO(answer.getQuestion())); - } - - public List convertAnswerListToAnswerResponseDTOList(List answerList) { - return answerList.stream().map(answer -> convertAnswerToAnswerResponseDTO(answer)).collect(Collectors.toList()); - } - - public String getUsernameFromAuthorizationHeader(String authorizationHeader) { - String jwtToken = authorizationHeader.substring(7); - return jwtTokenUtilityComponent.getUsernameFromToken(jwtToken); - } - -} From 4bcca4b9a7922abd05fbb28033001f311a27d4f5 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:43:16 +0530 Subject: [PATCH 144/464] Delete ListToStringConverter.java --- .../doconnect/util/ListToStringConverter.java | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/util/ListToStringConverter.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/util/ListToStringConverter.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/util/ListToStringConverter.java deleted file mode 100644 index 88227b7..0000000 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/util/ListToStringConverter.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.wipro.cp.doconnect.util; - -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -import javax.persistence.AttributeConverter; - -public class ListToStringConverter implements AttributeConverter, String> { - @Override - public String convertToDatabaseColumn(List attribute) { - return (attribute == null || attribute.size() == 0) ? null : String.join(",", attribute); - } - - @Override - public List convertToEntityAttribute(String dbData) { - return dbData == null ? Collections.emptyList() : Arrays.asList(dbData.split(",")); - } -} From 2879af9fe7ad7002f2f5d4d410a77a8a93862d4b Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:43:18 +0530 Subject: [PATCH 145/464] Delete UserServiceImp.java --- .../cp/doconnect/service/UserServiceImp.java | 108 ------------------ 1 file changed, 108 deletions(-) delete mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/service/UserServiceImp.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/UserServiceImp.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/UserServiceImp.java deleted file mode 100644 index f352d47..0000000 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/UserServiceImp.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.wipro.cp.doconnect.service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.core.userdetails.UserDetailsService; -import org.springframework.security.core.userdetails.UsernameNotFoundException; -import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.stereotype.Service; - -import com.wipro.cp.doconnect.dto.StatusDTO; -import com.wipro.cp.doconnect.dto.UserRegisterDTO; -import com.wipro.cp.doconnect.dto.UserResponseDTO; -import com.wipro.cp.doconnect.dto.UserUpdateDTO; -import com.wipro.cp.doconnect.entity.User; -import com.wipro.cp.doconnect.repository.UserRepository; - -@Service -public class UserServiceImp implements IUserService, UserDetailsService { - - @Autowired - private UserRepository userRepository; - - @Autowired - private PasswordEncoder bcryptEncoder; - - private UserResponseDTO convertUserToUserResponseDTO(User user) { - return new UserResponseDTO(user.getId(), user.getUsername(), user.getName(), user.getEmail(), user.getIsAdmin()); - } - - private StatusDTO convertOptionalUserToStatusDTOUserResponseDTO(Optional optionalUser, String statusMessage) { - if (optionalUser.isEmpty()) { - return new StatusDTO(statusMessage, false, null); - } - return new StatusDTO("", true, convertUserToUserResponseDTO(optionalUser.get())); - } - - public StatusDTO getUserByUsername(String username) { - return convertOptionalUserToStatusDTOUserResponseDTO(userRepository.findByUsername(username), "User with username " + username + " does not exist."); - } - - @Override - public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { - Optional optionalUser = userRepository.findByUsername(username); - if (optionalUser.isEmpty()) { - throw new UsernameNotFoundException("User not found with username: " + username); - } - User user = optionalUser.get(); - return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), new ArrayList<>()); - } - - @Override - public StatusDTO createUser(UserRegisterDTO userRegisterDTO) { - if (userRepository.existsByUsername(userRegisterDTO.getUsername())) { - return new StatusDTO("User with username " + userRegisterDTO.getUsername() + " already exists. Please create user with different username.", false, null); - } - if (userRepository.existsByEmail(userRegisterDTO.getEmail())) { - return new StatusDTO("User with email " + userRegisterDTO.getEmail() + " already exists. Please create user with different email.", false, null); - } - if (userRegisterDTO.getPassword().length() < 8) { - return new StatusDTO("Password should contain at least 8 characters.", false, null); - } - User user = new User(userRegisterDTO.getUsername(), userRegisterDTO.getName(), bcryptEncoder.encode(userRegisterDTO.getPassword()), userRegisterDTO.getEmail(), userRegisterDTO.getIsAdmin()); - return new StatusDTO("", true, convertUserToUserResponseDTO(userRepository.save(user))); - } - - @Override - public List getAllUsers() { - return userRepository.findAll().stream().map(user -> convertUserToUserResponseDTO(user)).collect(Collectors.toList()); - } - - @Override - public StatusDTO getUserById(Long id) { - return convertOptionalUserToStatusDTOUserResponseDTO(userRepository.findById(id), "User with ID " + id + " does not exist."); - } - - @Override - public StatusDTO updateUser(UserUpdateDTO userUpdateDTO, Long id) { - Optional optionalUser = userRepository.findById(id); - if (optionalUser.isEmpty()) { - return new StatusDTO("User with ID " + id + " does not exist.", false, null); - } - User user = optionalUser.get(); - user.setIsAdmin(userUpdateDTO.getIsAdmin()); - user.setName(userUpdateDTO.getName()); - return new StatusDTO("", true, convertUserToUserResponseDTO(userRepository.save(user))); - } - - @Override - public boolean deleteUserById(Long id) { - Optional optionalUser = userRepository.findById(id); - if (optionalUser.isEmpty()) { - return false; - } - userRepository.deleteById(id); - return true; - } - - @Override - public void deleteAllUsers() { - userRepository.deleteAllInBatch(); - } - -} From 3006abdd222fbf9511991a4769245c5ced645078 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:43:20 +0530 Subject: [PATCH 146/464] Delete QuestionServiceImp.java --- .../doconnect/service/QuestionServiceImp.java | 103 ------------------ 1 file changed, 103 deletions(-) delete mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/service/QuestionServiceImp.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/QuestionServiceImp.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/QuestionServiceImp.java deleted file mode 100644 index 804aa49..0000000 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/QuestionServiceImp.java +++ /dev/null @@ -1,103 +0,0 @@ -package com.wipro.cp.doconnect.service; - -import java.util.List; -import java.util.Optional; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; - -import com.wipro.cp.doconnect.dto.EmailDTO; -import com.wipro.cp.doconnect.dto.QuestionRequestDTO; -import com.wipro.cp.doconnect.dto.QuestionResponseDTO; -import com.wipro.cp.doconnect.dto.QuestionUpdateDTO; -import com.wipro.cp.doconnect.dto.StatusDTO; -import com.wipro.cp.doconnect.entity.Question; -import com.wipro.cp.doconnect.repository.QuestionRepository; -import com.wipro.cp.doconnect.repository.UserRepository; -import com.wipro.cp.doconnect.util.Utilities; - -@Service -public class QuestionServiceImp implements IQuestionService { - - @Value("${enable-notification-emails:false}") - private boolean enableNotificationEmails; - - @Autowired - private QuestionRepository questionRepository; - - @Autowired - private UserRepository userRepository; - - @Autowired - private EmailServiceImp emailServiceImp; - - @Autowired - private Utilities utilities; - - @Override - public StatusDTO> getAllQuestions(String status, String search) { - if (search == null) { - if (status.equalsIgnoreCase("all")) { - return new StatusDTO>("", true, utilities.convertQuestionListToQuestionResponseDTOList(questionRepository.findAll())); - } - else if (status.equalsIgnoreCase("approved")) { - return new StatusDTO>("", true, utilities.convertQuestionListToQuestionResponseDTOList(questionRepository.findByIsApprovedTrue())); - } - else if (status.equalsIgnoreCase("unapproved")) { - return new StatusDTO>("", true, utilities.convertQuestionListToQuestionResponseDTOList(questionRepository.findByIsApprovedFalse())); - } - else { - return new StatusDTO>("Provided invalid status. Should be one of 'all', 'approved' or 'unapproved'.", false, null); - } - } - else { - if (status.equalsIgnoreCase("approved")) { - return new StatusDTO>("", true, utilities.convertQuestionListToQuestionResponseDTOList(questionRepository.findByQuestionContainingIgnoreCaseAndIsApprovedTrue(search))); - } - else { - return new StatusDTO>("Question search only works with 'approved' status.", false, null); - } - } - } - - @Override - public StatusDTO createQuestion(QuestionRequestDTO questionRequestDTO, String postedBy) { - Question question = new Question(questionRequestDTO.getQuestion(), questionRequestDTO.getTopic(), questionRequestDTO.getImages(), postedBy); - Question savedQuestion = questionRepository.save(question); - if (enableNotificationEmails) { - String[] recipients = utilities.getUserEmails(userRepository.findByIsAdminTrue()); - String subject = "Action Required: Approval needed for newly added question"; - String body = "Dear Admin,\n\nA new question has been added to DoConnect application. Please visit the application to either approve or delete the newly added question.\n\nDoConnect Bot\n\n\n\n\n\nAuto generated email. Please do not reply."; - emailServiceImp.sendNotificationEmail(new EmailDTO(recipients, subject, body)); - } - return new StatusDTO("", true, utilities.convertQuestionToQuestionResponseDTO(savedQuestion)); - } - - @Override - public StatusDTO updateQuestion(QuestionUpdateDTO questionUpdateDTO, Long questionId, String approvedBy) { - Optional optionalQuestion = questionRepository.findById(questionId); - if (optionalQuestion.isEmpty()) { - return new StatusDTO("Question with ID " + questionId + " does not exist.", false, null); - } - Question question = optionalQuestion.get(); - question.setIsApproved(questionUpdateDTO.getIsApproved()); - question.setApprovedBy(approvedBy); - return new StatusDTO("", true, utilities.convertQuestionToQuestionResponseDTO(questionRepository.save(question))); - } - - @Override - public StatusDTO deleteQuestionById(Long questionId) { - Optional optionalQuestion = questionRepository.findById(questionId); - if (optionalQuestion.isEmpty()) { - return new StatusDTO("Question with id " + questionId + " does not exist.", false, null); - } - Question question = optionalQuestion.get(); - if (question.getIsApproved()) { - return new StatusDTO("Cannot delete an approved question.", false, false); - } - questionRepository.delete(question); - return new StatusDTO("", true, true); - } - -} From d0192f3755e6646160cbe4a226f065adce74a254 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:43:22 +0530 Subject: [PATCH 147/464] Delete LogoutTokenServiceImp.java --- .../service/LogoutTokenServiceImp.java | 42 ------------------- 1 file changed, 42 deletions(-) delete mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/service/LogoutTokenServiceImp.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/LogoutTokenServiceImp.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/LogoutTokenServiceImp.java deleted file mode 100644 index 6ae7b15..0000000 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/LogoutTokenServiceImp.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.wipro.cp.doconnect.service; - -import java.util.List; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import com.wipro.cp.doconnect.entity.LogoutToken; -import com.wipro.cp.doconnect.repository.LogoutTokenRepository; - -@Service -public class LogoutTokenServiceImp implements ILogoutTokenService { - - @Autowired - LogoutTokenRepository logoutTokenRepository; - - @Override - public boolean checkIfTokenExists(String token) { - return logoutTokenRepository.existsByToken(token); - } - - @Override - public LogoutToken createToken(LogoutToken logoutToken) { - return logoutTokenRepository.save(logoutToken); - } - - @Override - public List createTokens(List logoutTokenList) { - return logoutTokenRepository.saveAllAndFlush(logoutTokenList); - } - - @Override - public List getAllTokens() { - return logoutTokenRepository.findAll(); - } - - @Override - public void deleteAllTokens() { - logoutTokenRepository.deleteAllInBatch(); - } - -} From aac6de1952fbbd4df4151d95add46157311f0f40 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:43:25 +0530 Subject: [PATCH 148/464] Delete IUserService.java --- .../cp/doconnect/service/IUserService.java | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/service/IUserService.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IUserService.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IUserService.java deleted file mode 100644 index 92d81f8..0000000 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IUserService.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.wipro.cp.doconnect.service; - -import java.util.List; - -import com.wipro.cp.doconnect.dto.StatusDTO; -import com.wipro.cp.doconnect.dto.UserRegisterDTO; -import com.wipro.cp.doconnect.dto.UserResponseDTO; -import com.wipro.cp.doconnect.dto.UserUpdateDTO; - -public interface IUserService { - - public StatusDTO createUser(UserRegisterDTO userRegisterDTO); - public List getAllUsers(); - public StatusDTO getUserById(Long id); - public StatusDTO updateUser(UserUpdateDTO userUpdateDTO, Long id); - public boolean deleteUserById(Long id); - public void deleteAllUsers(); - -} From f2561d36a6611f70e76b5172135873309664158b Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:43:27 +0530 Subject: [PATCH 149/464] Delete IQuestionService.java --- .../cp/doconnect/service/IQuestionService.java | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/service/IQuestionService.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IQuestionService.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IQuestionService.java deleted file mode 100644 index 01cc092..0000000 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IQuestionService.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.wipro.cp.doconnect.service; - -import java.util.List; - -import com.wipro.cp.doconnect.dto.QuestionRequestDTO; -import com.wipro.cp.doconnect.dto.QuestionResponseDTO; -import com.wipro.cp.doconnect.dto.QuestionUpdateDTO; -import com.wipro.cp.doconnect.dto.StatusDTO; - -public interface IQuestionService { - - public StatusDTO> getAllQuestions(String status, String search); - public StatusDTO createQuestion(QuestionRequestDTO questionRequestDTO, String postedBy); - public StatusDTO updateQuestion(QuestionUpdateDTO questionUpdateDTO, Long questionId, String approvedBy); - public StatusDTO deleteQuestionById(Long questionId); - -} From e91cf3a3a6caa82fefa855a95220f6ba5f17c1ea Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:43:29 +0530 Subject: [PATCH 150/464] Delete ILogoutTokenService.java --- .../cp/doconnect/service/ILogoutTokenService.java | 15 --------------- 1 file changed, 15 deletions(-) delete mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/service/ILogoutTokenService.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/ILogoutTokenService.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/ILogoutTokenService.java deleted file mode 100644 index 9fb26fa..0000000 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/ILogoutTokenService.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.wipro.cp.doconnect.service; - -import java.util.List; - -import com.wipro.cp.doconnect.entity.LogoutToken; - -public interface ILogoutTokenService { - - public boolean checkIfTokenExists(String token); - public LogoutToken createToken(LogoutToken logoutToken); - public List createTokens(List logoutTokenList); - public List getAllTokens(); - public void deleteAllTokens(); - -} From c21557379fa77ec317a36c0ac8bb5266855375df Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:43:31 +0530 Subject: [PATCH 151/464] Delete IEmailService.java --- .../com/wipro/cp/doconnect/service/IEmailService.java | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/service/IEmailService.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IEmailService.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IEmailService.java deleted file mode 100644 index 3237959..0000000 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IEmailService.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.wipro.cp.doconnect.service; - -import com.wipro.cp.doconnect.dto.EmailDTO; - -public interface IEmailService { - - boolean sendNotificationEmail(EmailDTO emailDTO); - -} From 99871082535ca7fe881d171db8fa647be604ab7d Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:43:35 +0530 Subject: [PATCH 152/464] Delete IAnswerService.java --- .../cp/doconnect/service/IAnswerService.java | 18 ------------------ 1 file changed, 18 deletions(-) delete mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/service/IAnswerService.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IAnswerService.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IAnswerService.java deleted file mode 100644 index 1a1a78f..0000000 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IAnswerService.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.wipro.cp.doconnect.service; - -import java.util.List; - -import com.wipro.cp.doconnect.dto.AnswerRequestDTO; -import com.wipro.cp.doconnect.dto.AnswerResponseDTO; -import com.wipro.cp.doconnect.dto.AnswerUpdateDTO; -import com.wipro.cp.doconnect.dto.StatusDTO; - -public interface IAnswerService { - - public StatusDTO> getAllAnswers(String answerStatus); - public StatusDTO> getAllAnswersForQuestionId(Long questionId, String answerStatus); - public StatusDTO createAnswerForQuestionId(Long questionId, AnswerRequestDTO answerRequestDTO, String postedBy); - public StatusDTO updateAnswerForQuestionId(Long questionId, Long answerId, AnswerUpdateDTO answerUpdateDTO, String approvedBy); - public StatusDTO deleteAnswerForQuestionById(Long questionId, Long answerId); - -} From d4a108a6dc3a3df513fc874ba86ac6921e741f2e Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:43:38 +0530 Subject: [PATCH 153/464] Delete EmailServiceImp.java --- .../cp/doconnect/service/EmailServiceImp.java | 37 ------------------- 1 file changed, 37 deletions(-) delete mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/service/EmailServiceImp.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/EmailServiceImp.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/EmailServiceImp.java deleted file mode 100644 index f77422c..0000000 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/EmailServiceImp.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.wipro.cp.doconnect.service; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.mail.SimpleMailMessage; -import org.springframework.mail.javamail.JavaMailSender; -import org.springframework.stereotype.Service; - -import com.wipro.cp.doconnect.dto.EmailDTO; - -@Service -public class EmailServiceImp implements IEmailService { - - @Autowired - private JavaMailSender javaMailSender; - - @Value("${spring.mail.username}") - private String sender; - - @Override - public boolean sendNotificationEmail(EmailDTO emailDTO) { - try { - SimpleMailMessage simpleMailMessage = new SimpleMailMessage(); - simpleMailMessage.setFrom(sender); - simpleMailMessage.setTo(emailDTO.getRecipients()); - simpleMailMessage.setSubject(emailDTO.getSubject()); - simpleMailMessage.setText(emailDTO.getBody()); - javaMailSender.send(simpleMailMessage); - return true; - } - catch (Exception e) { - System.out.println(e.toString()); - return false; - } - } - -} From b2d3b20999144799b31ce5af49e7ac1596339427 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:43:43 +0530 Subject: [PATCH 154/464] Delete AnswerServiceImp.java --- .../doconnect/service/AnswerServiceImp.java | 126 ------------------ 1 file changed, 126 deletions(-) delete mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/service/AnswerServiceImp.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/AnswerServiceImp.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/service/AnswerServiceImp.java deleted file mode 100644 index 9a07b25..0000000 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/service/AnswerServiceImp.java +++ /dev/null @@ -1,126 +0,0 @@ -package com.wipro.cp.doconnect.service; - -import java.util.List; -import java.util.Optional; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; - -import com.wipro.cp.doconnect.dto.AnswerRequestDTO; -import com.wipro.cp.doconnect.dto.AnswerResponseDTO; -import com.wipro.cp.doconnect.dto.AnswerUpdateDTO; -import com.wipro.cp.doconnect.dto.EmailDTO; -import com.wipro.cp.doconnect.dto.StatusDTO; -import com.wipro.cp.doconnect.entity.Answer; -import com.wipro.cp.doconnect.entity.Question; -import com.wipro.cp.doconnect.repository.AnswerRepository; -import com.wipro.cp.doconnect.repository.QuestionRepository; -import com.wipro.cp.doconnect.repository.UserRepository; -import com.wipro.cp.doconnect.util.Utilities; - -@Service -public class AnswerServiceImp implements IAnswerService { - - @Value("${enable-notification-emails:false}") - private boolean enableNotificationEmails; - - @Autowired - private AnswerRepository answerRepository; - - @Autowired - private QuestionRepository questionRepository; - - @Autowired - private UserRepository userRepository; - - @Autowired - private EmailServiceImp emailServiceImp; - - @Autowired - private Utilities utilities; - - @Override - public StatusDTO> getAllAnswers(String answerStatus) { - if (answerStatus.equalsIgnoreCase("all")) { - return new StatusDTO>("", true, utilities.convertAnswerListToAnswerResponseDTOList(answerRepository.findAll())); - } - else if (answerStatus.equalsIgnoreCase("approved")) { - return new StatusDTO>("", true, utilities.convertAnswerListToAnswerResponseDTOList(answerRepository.findByIsApprovedTrue())); - } - else if (answerStatus.equalsIgnoreCase("unapproved")) { - return new StatusDTO>("", true, utilities.convertAnswerListToAnswerResponseDTOList(answerRepository.findByIsApprovedFalse())); - } - else { - return new StatusDTO>("Provided invalid status. Should be one of 'all', 'approved' or 'unapproved'.", false, null); - } - } - - @Override - public StatusDTO> getAllAnswersForQuestionId(Long questionId, String answerStatus) { - if (answerStatus.equalsIgnoreCase("all")) { - return new StatusDTO>("", true, utilities.convertAnswerListToAnswerResponseDTOList(answerRepository.findByQuestionId(questionId))); - } - else if (answerStatus.equalsIgnoreCase("approved")) { - return new StatusDTO>("", true, utilities.convertAnswerListToAnswerResponseDTOList(answerRepository.findByQuestionIdAndIsApprovedTrue(questionId))); - } - else if (answerStatus.equalsIgnoreCase("unapproved")) { - return new StatusDTO>("", true, utilities.convertAnswerListToAnswerResponseDTOList(answerRepository.findByQuestionIdAndIsApprovedFalse(questionId))); - } - else { - return new StatusDTO>("Provided invalid status. Should be one of 'all', 'approved' or 'unapproved'.", false, null); - } - } - - @Override - public StatusDTO createAnswerForQuestionId(Long questionId, AnswerRequestDTO answerRequestDTO, String postedBy) { - Optional optionalQuestion = questionRepository.findById(questionId); - if (optionalQuestion.isEmpty()) { - return new StatusDTO("Question with id " + questionId + " does not exist.", false, null); - } - Answer answer = new Answer(answerRequestDTO.getAnswer(), answerRequestDTO.getImages(), postedBy, optionalQuestion.get()); - Answer savedAnswer = answerRepository.save(answer); - if (enableNotificationEmails) { - String[] recipients = utilities.getUserEmails(userRepository.findByIsAdminTrue()); - String subject = "Action Required: Approval needed for newly added answer"; - String body = "Dear Admin,\n\nA new answer has been added to DoConnect application for question - '" + optionalQuestion.get().getQuestion() + "'. Please visit the application to either approve or delete the newly added question.\n\nDoConnect Bot\n\n\n\n\n\nAuto generated email. Please do not reply."; - emailServiceImp.sendNotificationEmail(new EmailDTO(recipients, subject, body)); - } - return new StatusDTO("", true, utilities.convertAnswerToAnswerResponseDTO(savedAnswer)); - } - - @Override - public StatusDTO updateAnswerForQuestionId(Long questionId, Long answerId, AnswerUpdateDTO answerUpdateDTO, String approvedBy) { - boolean questionExists = questionRepository.existsById(questionId); - if (!questionExists) { - return new StatusDTO("Question with id " + questionId + " does not exist.", false, null); - } - Optional optionalAnswer = answerRepository.findByIdAndQuestionId(answerId, questionId); - if (optionalAnswer.isEmpty()) { - return new StatusDTO("Answer with id " + answerId + " does not exist for question with id " + questionId + ".", false, null); - } - Answer answer = optionalAnswer.get(); - answer.setIsApproved(answerUpdateDTO.getIsApproved()); - answer.setApprovedBy(approvedBy); - return new StatusDTO("", true, utilities.convertAnswerToAnswerResponseDTO(answerRepository.save(answer))); - } - - @Override - public StatusDTO deleteAnswerForQuestionById(Long questionId, Long answerId) { - boolean questionExists = questionRepository.existsById(questionId); - if (!questionExists) { - return new StatusDTO("Question with id " + questionId + " does not exist.", false, null); - } - Optional optionalAnswer = answerRepository.findByIdAndQuestionId(answerId, questionId); - if (optionalAnswer.isEmpty()) { - return new StatusDTO("Answer with id " + answerId + " does not exist for question with id " + questionId + ".", false, null); - } - Answer answer = optionalAnswer.get(); - if (answer.getIsApproved()) { - return new StatusDTO("Cannot delete an approved answer.", false, false); - } - answerRepository.delete(answer); - return new StatusDTO("", true, true); - } - -} From 1293c8acd5d13e011b9afadd1e148f9fa5e8bca4 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:43:45 +0530 Subject: [PATCH 155/464] Delete UserRepository.java --- .../doconnect/repository/UserRepository.java | 22 ------------------- 1 file changed, 22 deletions(-) delete mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/repository/UserRepository.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/UserRepository.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/UserRepository.java deleted file mode 100644 index fa6761b..0000000 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/UserRepository.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.wipro.cp.doconnect.repository; - -import java.util.List; -import java.util.Optional; - -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import com.wipro.cp.doconnect.entity.User; - -@Repository -public interface UserRepository extends JpaRepository { - - Optional findByUsername(String username); - - boolean existsByUsername(String username); - - boolean existsByEmail(String email); - - List findByIsAdminTrue(); - -} From 871841f553d98760fc306c9ede808f4e4d8caaac Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:43:47 +0530 Subject: [PATCH 156/464] Delete QuestionRepository.java --- .../repository/QuestionRepository.java | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/repository/QuestionRepository.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/QuestionRepository.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/QuestionRepository.java deleted file mode 100644 index 2d04f52..0000000 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/QuestionRepository.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.wipro.cp.doconnect.repository; - -import java.util.List; - -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import com.wipro.cp.doconnect.entity.Question; - -@Repository -public interface QuestionRepository extends JpaRepository { - - boolean existsById(Long id); - - List findByIsApprovedTrue(); - List findByIsApprovedFalse(); - - List findByQuestionContainingIgnoreCaseAndIsApprovedTrue(String question); -} From cf19da0145c8328873af2e503470412a1a748bb8 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:43:49 +0530 Subject: [PATCH 157/464] Delete LogoutTokenRepository.java --- .../repository/LogoutTokenRepository.java | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/repository/LogoutTokenRepository.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/LogoutTokenRepository.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/LogoutTokenRepository.java deleted file mode 100644 index d3d46c7..0000000 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/LogoutTokenRepository.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.wipro.cp.doconnect.repository; - -import java.util.Optional; - -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import com.wipro.cp.doconnect.entity.LogoutToken; - -@Repository -public interface LogoutTokenRepository extends JpaRepository { - - Optional findByToken(String token); - - boolean existsByToken(String token); - -} From 9d40afdeff7c63e01b0e7e81aa6d03a5bb176d08 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:43:51 +0530 Subject: [PATCH 158/464] Delete AnswerRepository.java --- .../repository/AnswerRepository.java | 23 ------------------- 1 file changed, 23 deletions(-) delete mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/repository/AnswerRepository.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/AnswerRepository.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/AnswerRepository.java deleted file mode 100644 index a2f89c0..0000000 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/AnswerRepository.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.wipro.cp.doconnect.repository; - -import java.util.List; -import java.util.Optional; - -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import com.wipro.cp.doconnect.entity.Answer; - -@Repository -public interface AnswerRepository extends JpaRepository { - - List findByIsApprovedTrue(); - List findByIsApprovedFalse(); - - List findByQuestionId(Long questionId); - Optional findByIdAndQuestionId(Long answerId, Long questionId); - - List findByQuestionIdAndIsApprovedTrue(Long questionId); - List findByQuestionIdAndIsApprovedFalse(Long questionId); - -} From 01c26f311b6f08f40b7d27507a2b26fd0fcad7d9 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:43:52 +0530 Subject: [PATCH 159/464] Delete AuthorizationInterceptor.java --- .../interceptor/AuthorizationInterceptor.java | 211 ------------------ 1 file changed, 211 deletions(-) delete mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/interceptor/AuthorizationInterceptor.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/interceptor/AuthorizationInterceptor.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/interceptor/AuthorizationInterceptor.java deleted file mode 100644 index e1172c8..0000000 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/interceptor/AuthorizationInterceptor.java +++ /dev/null @@ -1,211 +0,0 @@ -package com.wipro.cp.doconnect.interceptor; - -import java.util.Map; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpMethod; -import org.springframework.http.HttpStatus; -import org.springframework.web.servlet.HandlerInterceptor; - -import com.wipro.cp.doconnect.component.JwtTokenUtilityComponent; -import com.wipro.cp.doconnect.dto.StatusDTO; -import com.wipro.cp.doconnect.dto.UserResponseDTO; -import com.wipro.cp.doconnect.service.UserServiceImp; - -public class AuthorizationInterceptor implements HandlerInterceptor { - - @Autowired - private UserServiceImp userServiceImp; - - @Autowired - private JwtTokenUtilityComponent jwtTokenUtilityComponent; - - private String getParameterValue(Map parameterMap, String key) { - String[] value = parameterMap.getOrDefault(key, null); - if ((value == null) || (value.length != 1) || value[0].length() == 0) { - return null; - } - return value[0]; - } - - public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { - final String currentMethod = request.getMethod(); - final String currentURI = request.getRequestURI().toString(); - final Map parameterMap = request.getParameterMap(); - if (currentURI.equalsIgnoreCase("/api/v1/questions") && HttpMethod.GET.matches(currentMethod)) { - if (!parameterMap.containsKey("status") && !parameterMap.containsKey("search")) { - return true; - } - } - else if (currentURI.equalsIgnoreCase("/api/v1/register") || currentURI.equalsIgnoreCase("/api/v1/login")) { - if (HttpMethod.POST.matches(currentMethod)) { - return true; - } - response.sendError(HttpStatus.FORBIDDEN.value()); - return false; - } - final String requestTokenHeader = request.getHeader("Authorization"); - String username = null; - String jwtToken = null; - // JWT Token is in the form "Bearer token". Remove Bearer word and get only the token - if (requestTokenHeader != null && requestTokenHeader.startsWith("Bearer ")) { - jwtToken = requestTokenHeader.substring(7); - try { - username = jwtTokenUtilityComponent.getUsernameFromToken(jwtToken); - } catch (Exception e) { - System.out.println("Exception " + e.toString()); - } - } - if (username != null) { - StatusDTO userStatus = userServiceImp.getUserByUsername(username); - if (!userStatus.getIsValid()) { - response.sendError(HttpStatus.FORBIDDEN.value()); - return false; - } - UserResponseDTO userResponseDTO = userStatus.getObject(); - boolean isUserAdmin = userResponseDTO.getIsAdmin(); - if (currentURI.equalsIgnoreCase("/api/v1/signout") && HttpMethod.GET.matches(currentMethod)) { - return true; - } - else if (currentURI.equalsIgnoreCase("/api/v1/answers") && HttpMethod.GET.matches(currentMethod) && isUserAdmin) { - return true; - } - else if ( - currentURI.toLowerCase().startsWith("/api/v1/users") && - (HttpMethod.GET.matches(currentMethod) || HttpMethod.POST.matches(currentMethod) || HttpMethod.PUT.matches(currentMethod) || HttpMethod.DELETE.matches(currentMethod)) - ) { - if (isUserAdmin) { - return true; - } - response.sendError(HttpStatus.FORBIDDEN.value()); - return false; - } - else if ( - currentURI.toLowerCase().startsWith("/api/v1/images") && - (HttpMethod.GET.matches(currentMethod) || HttpMethod.POST.matches(currentMethod)) && !isUserAdmin - ) { - return true; - } - else if (currentURI.toLowerCase().startsWith("/api/v1/questions")) { - String[] uriParts = currentURI.split("/"); - if (uriParts.length == 4) { - if (uriParts[3].equalsIgnoreCase("questions")) { - if (HttpMethod.POST.matches(currentMethod) && !isUserAdmin) { - return true; - } - else if (HttpMethod.GET.matches(currentMethod)) { - String statusValue = getParameterValue(parameterMap, "status"); - String searchValue = getParameterValue(parameterMap, "search"); - if (searchValue == null && statusValue != null) { - if (statusValue.equalsIgnoreCase("approved")) { - return true; - } - else if ((statusValue.equalsIgnoreCase("unapproved") || statusValue.equalsIgnoreCase("all")) && isUserAdmin) { - return true; - } - else { - response.sendError(HttpStatus.FORBIDDEN.value()); - return false; - } - } - else if (searchValue != null && statusValue == null) { - if (!isUserAdmin) { - return true; - } - else { - response.sendError(HttpStatus.FORBIDDEN.value()); - return false; - } - } - else { - if (statusValue.equalsIgnoreCase("approved") && !isUserAdmin) { - return true; - } - else { - response.sendError(HttpStatus.FORBIDDEN.value()); - return false; - } - } - } - else { - response.sendError(HttpStatus.FORBIDDEN.value()); - return false; - } - } - else { - response.sendError(HttpStatus.FORBIDDEN.value()); - return false; - } - } - else if (uriParts.length == 5) { - if ( - uriParts[3].equalsIgnoreCase("questions") && - (HttpMethod.PUT.matches(currentMethod) || HttpMethod.DELETE.matches(currentMethod)) && - isUserAdmin - ) { - return true; - } - else { - response.sendError(HttpStatus.FORBIDDEN.value()); - return false; - } - } - else if (uriParts.length == 6) { - if (uriParts[3].equalsIgnoreCase("questions") && uriParts[5].equalsIgnoreCase("answers")) { - if (HttpMethod.POST.matches(currentMethod) && !isUserAdmin) { - return true; - } - else if (HttpMethod.GET.matches(currentMethod)) { - String statusValue = getParameterValue(parameterMap, "status"); - if (statusValue == null || statusValue.equalsIgnoreCase("approved")) { - return true; - } - else if ((statusValue.equalsIgnoreCase("all") || statusValue.equalsIgnoreCase("unapproved")) && isUserAdmin) { - return true; - } - else { - response.sendError(HttpStatus.FORBIDDEN.value()); - return false; - } - } - else { - response.sendError(HttpStatus.FORBIDDEN.value()); - return false; - } - } - else { - response.sendError(HttpStatus.FORBIDDEN.value()); - return false; - } - } - else if (uriParts.length == 7) { - if ( - uriParts[3].equalsIgnoreCase("questions") && uriParts[5].equalsIgnoreCase("answers") && - (HttpMethod.PUT.matches(currentMethod) || HttpMethod.DELETE.matches(currentMethod)) && - isUserAdmin - ) { - return true; - } - else { - response.sendError(HttpStatus.FORBIDDEN.value()); - return false; - } - } - else { - response.sendError(HttpStatus.FORBIDDEN.value()); - return false; - } - } - else { - response.sendError(HttpStatus.FORBIDDEN.value()); - return false; - } - } - response.sendError(HttpStatus.FORBIDDEN.value()); - return false; - } - -} From b522ed06131dcc62dee95ede7a7e81d7c9933541 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:43:54 +0530 Subject: [PATCH 160/464] Delete User.java --- .../com/wipro/cp/doconnect/entity/User.java | 109 ------------------ 1 file changed, 109 deletions(-) delete mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/entity/User.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/User.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/User.java deleted file mode 100644 index 236c6c1..0000000 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/User.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.wipro.cp.doconnect.entity; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Table; -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Pattern; -import javax.validation.constraints.Size; - -@Entity -@Table(name="users") -public class User { - - @Id - @GeneratedValue(strategy=GenerationType.IDENTITY) - private Long id; - - @NotNull - @NotEmpty - @Size(max = 512) - @Column(unique = true) - private String username; - - @NotNull - @NotEmpty - @Size(min = 8, max = 128) - private String password; - - @NotNull - @NotEmpty - @Size(max = 512) - private String name; - - @NotNull - @NotEmpty - @Pattern(regexp="[A-Za-z0-9._%-+]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}") - @Size(max = 512) - @Column(unique = true) - private String email; - - @NotNull - private boolean isAdmin; - - 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 String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - public boolean getIsAdmin() { - return isAdmin; - } - - public void setIsAdmin(boolean isAdmin) { - this.isAdmin = isAdmin; - } - - public Long getId() { - return id; - } - - public User(@NotNull @NotEmpty @Size(max = 512) String username, - @NotNull @NotEmpty @Size(max = 512) String name, - @NotNull @NotEmpty @Size(min = 8, max = 128) String password, - @NotNull @NotEmpty @Pattern(regexp = "[A-Za-z0-9._%-+]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}") @Size(max = 512) String email, - @NotNull boolean isAdmin) { - super(); - this.username = username; - this.password = password; - this.name = name; - this.email = email; - this.isAdmin = isAdmin; - } - - public User() { - super(); - } - -} From 72a15de3e99c6c7f2f5b0f30bdf5107f8e2301f3 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:43:56 +0530 Subject: [PATCH 161/464] Delete Question.java --- .../wipro/cp/doconnect/entity/Question.java | 125 ------------------ 1 file changed, 125 deletions(-) delete mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Question.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Question.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Question.java deleted file mode 100644 index c325979..0000000 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Question.java +++ /dev/null @@ -1,125 +0,0 @@ -package com.wipro.cp.doconnect.entity; - -import java.util.Date; -import java.util.List; - -import javax.persistence.Column; -import javax.persistence.Convert; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Table; -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; - -import org.hibernate.annotations.CreationTimestamp; - -import com.wipro.cp.doconnect.util.ListToStringConverter; - -@Entity -@Table(name="questions") -public class Question { - - @Id - @GeneratedValue(strategy=GenerationType.IDENTITY) - private long id; - - @NotNull - @NotEmpty - @Size(max = 1024) - private String question; - - @NotNull - @NotEmpty - private String topic; - - @Column - @Convert(converter = ListToStringConverter.class) - private List images; - - @NotNull - @NotEmpty - private String postedBy; - - @Column(nullable = false, updatable = false) - @CreationTimestamp - private Date postedAt; - - private String approvedBy; - - private boolean isApproved; - - public String getQuestion() { - return question; - } - - public void setQuestion(String question) { - this.question = question; - } - - public String getTopic() { - return topic; - } - - public void setTopic(String topic) { - this.topic = topic; - } - - public List getImages() { - return images; - } - - public void setImages(List images) { - this.images = images; - } - - public String getPostedBy() { - return postedBy; - } - - public void setPostedBy(String postedBy) { - this.postedBy = postedBy; - } - - public String getApprovedBy() { - return approvedBy; - } - - public void setApprovedBy(String approvedBy) { - this.approvedBy = approvedBy; - } - - public boolean getIsApproved() { - return isApproved; - } - - public void setIsApproved(boolean isApproved) { - this.isApproved = isApproved; - } - - public long getId() { - return id; - } - - public Date getPostedAt() { - return postedAt; - } - - public Question(@NotNull @NotEmpty String question, @NotNull @NotEmpty String topic, List images, - @NotNull @NotEmpty String postedBy) { - super(); - this.question = question; - this.topic = topic; - this.images = images; - this.postedBy = postedBy; - this.approvedBy = null; - this.isApproved = false; - } - - public Question() { - super(); - } - -} From ed075582ca6a9140eafb3fbb6c91fe17e7125b4d Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:43:58 +0530 Subject: [PATCH 162/464] Delete LogoutToken.java --- .../cp/doconnect/entity/LogoutToken.java | 46 ------------------- 1 file changed, 46 deletions(-) delete mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/entity/LogoutToken.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/LogoutToken.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/LogoutToken.java deleted file mode 100644 index f8b9ab3..0000000 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/LogoutToken.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.wipro.cp.doconnect.entity; - -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Table; -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; - -@Entity -@Table(name = "logout_token") -public class LogoutToken { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @NotNull - @NotEmpty - @Size(max = 512) - private String token; - - public Long getId() { - return id; - } - - public String getToken() { - return token; - } - - public void setToken(String token) { - this.token = token; - } - - public LogoutToken(@NotNull @NotEmpty String token) { - super(); - this.token = token; - } - - public LogoutToken() { - super(); - } - -} From c5bc116e143fd3bcbfa34653ad234ee944e8fcd9 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:44:00 +0530 Subject: [PATCH 163/464] Delete Answer.java --- .../com/wipro/cp/doconnect/entity/Answer.java | 132 ------------------ 1 file changed, 132 deletions(-) delete mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Answer.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Answer.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Answer.java deleted file mode 100644 index 44c4c41..0000000 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Answer.java +++ /dev/null @@ -1,132 +0,0 @@ -package com.wipro.cp.doconnect.entity; - -import java.util.Date; -import java.util.List; - -import javax.persistence.Column; -import javax.persistence.Convert; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.Table; -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; - -import org.hibernate.annotations.CreationTimestamp; -import org.hibernate.annotations.OnDelete; -import org.hibernate.annotations.OnDeleteAction; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.wipro.cp.doconnect.util.ListToStringConverter; - -@Entity -@Table(name="answers") -public class Answer { - - @Id - @GeneratedValue(strategy=GenerationType.IDENTITY) - private long id; - - @NotNull - @NotEmpty - @Size(max = 1024) - private String answer; - - @Column - @Convert(converter = ListToStringConverter.class) - private List images; - - @NotNull - @NotEmpty - private String postedBy; - - @Column(nullable = false, updatable = false) - @CreationTimestamp - private Date postedAt; - - private String approvedBy; - - private boolean isApproved; - - @ManyToOne(fetch = FetchType.LAZY, optional = false) - @JoinColumn(name = "question_id", nullable = false) - @OnDelete(action = OnDeleteAction.CASCADE) - @JsonIgnore - private Question question; - - public String getAnswer() { - return answer; - } - - public void setAnswer(String answer) { - this.answer = answer; - } - - public List getImages() { - return images; - } - - public void setImages(List images) { - this.images = images; - } - - public boolean getIsApproved() { - return isApproved; - } - - public void setIsApproved(boolean isApproved) { - this.isApproved = isApproved; - } - - public String getPostedBy() { - return postedBy; - } - - public void setPostedBy(String postedBy) { - this.postedBy = postedBy; - } - - public String getApprovedBy() { - return approvedBy; - } - - public void setApprovedBy(String approvedBy) { - this.approvedBy = approvedBy; - } - - public long getId() { - return id; - } - - public Date getPostedAt() { - return postedAt; - } - - public Question getQuestion() { - return question; - } - - public void setQuestion(Question question) { - this.question = question; - } - - public Answer(@NotNull @NotEmpty String answer, List images, @NotNull @NotEmpty String postedBy, Question question) { - super(); - this.answer = answer; - this.images = images; - this.postedBy = postedBy; - this.approvedBy = null; - this.isApproved = false; - this.question = question; - } - - public Answer() { - super(); - } - -} From ac996b04512dc26708a4d09ce0816af02aad3197 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:44:02 +0530 Subject: [PATCH 164/464] Delete UserUpdateDTO.java --- .../wipro/cp/doconnect/dto/UserUpdateDTO.java | 31 ------------------- 1 file changed, 31 deletions(-) delete mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserUpdateDTO.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserUpdateDTO.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserUpdateDTO.java deleted file mode 100644 index 93b6b37..0000000 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserUpdateDTO.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.wipro.cp.doconnect.dto; - -public class UserUpdateDTO { - - private String name; - private boolean isAdmin; - - public String getName() { - return name; - } - public void setName(String name) { - this.name = name; - } - public boolean getIsAdmin() { - return isAdmin; - } - public void setIsAdmin(boolean isAdmin) { - this.isAdmin = isAdmin; - } - - public UserUpdateDTO(String name, boolean isAdmin) { - super(); - this.name = name; - this.isAdmin = isAdmin; - } - - public UserUpdateDTO() { - super(); - } - -} From 2e30373380477a3b4df28a280f60b9bee165d469 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:44:05 +0530 Subject: [PATCH 165/464] Delete UserResponseDTO.java --- .../cp/doconnect/dto/UserResponseDTO.java | 36 ------------------- 1 file changed, 36 deletions(-) delete mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserResponseDTO.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserResponseDTO.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserResponseDTO.java deleted file mode 100644 index 7499c2a..0000000 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserResponseDTO.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.wipro.cp.doconnect.dto; - -public class UserResponseDTO { - - private Long id; - private String username; - private String name; - private String email; - private boolean isAdmin; - - public Long getId() { - return id; - } - public String getUsername() { - return username; - } - public String getName() { - return name; - } - public String getEmail() { - return email; - } - public boolean getIsAdmin() { - return isAdmin; - } - - public UserResponseDTO(Long id, String username, String name, String email, boolean isAdmin) { - super(); - this.id = id; - this.username = username; - this.name = name; - this.email = email; - this.isAdmin = isAdmin; - } - -} From b219a21e7f3bfa4fe185e84078fba3b5c72b3e3d Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:44:11 +0530 Subject: [PATCH 166/464] Delete UserRegisterDTO.java --- .../cp/doconnect/dto/UserRegisterDTO.java | 54 ------------------- 1 file changed, 54 deletions(-) delete mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserRegisterDTO.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserRegisterDTO.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserRegisterDTO.java deleted file mode 100644 index 328a164..0000000 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserRegisterDTO.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.wipro.cp.doconnect.dto; - -public class UserRegisterDTO { - - private String username; - private String name; - private String email; - private String password; - private boolean isAdmin; - - public String getUsername() { - return username; - } - public void setUsername(String username) { - this.username = username; - } - public String getName() { - return name; - } - public void setName(String name) { - this.name = name; - } - public String getEmail() { - return email; - } - public void setEmail(String email) { - this.email = email; - } - public String getPassword() { - return password; - } - public void setPassword(String password) { - this.password = password; - } - public boolean getIsAdmin() { - return isAdmin; - } - public void setIsAdmin(boolean isAdmin) { - this.isAdmin = isAdmin; - } - - public UserRegisterDTO(String username, String name, String email, String password, boolean isAdmin) { - super(); - this.username = username; - this.name = name; - this.email = email; - this.password = password; - this.isAdmin = isAdmin; - } - public UserRegisterDTO() { - super(); - } - -} From 338cc1d33074728fdce9427578c819d52e9d39bb Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:44:13 +0530 Subject: [PATCH 167/464] Delete UserLoginResponseDTO.java --- .../doconnect/dto/UserLoginResponseDTO.java | 24 ------------------- 1 file changed, 24 deletions(-) delete mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserLoginResponseDTO.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserLoginResponseDTO.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserLoginResponseDTO.java deleted file mode 100644 index b246cd2..0000000 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserLoginResponseDTO.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.wipro.cp.doconnect.dto; - -import java.io.Serializable; - -public class UserLoginResponseDTO implements Serializable { - - private static final long serialVersionUID = -8091879091924046844L; - private final String jwttoken; - private final String tokenType; - - public UserLoginResponseDTO(String jwttoken, String tokenType) { - this.jwttoken = jwttoken; - this.tokenType = tokenType; - } - - public String getToken() { - return this.jwttoken; - } - - public String getTokenType() { - return tokenType; - } - -} From 9685705e65711bdd69cd3085555f6d5fe63ddd45 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:44:15 +0530 Subject: [PATCH 168/464] Delete UserLoginRequestDTO.java --- .../cp/doconnect/dto/UserLoginRequestDTO.java | 35 ------------------- 1 file changed, 35 deletions(-) delete mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserLoginRequestDTO.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserLoginRequestDTO.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserLoginRequestDTO.java deleted file mode 100644 index aa27e28..0000000 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserLoginRequestDTO.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.wipro.cp.doconnect.dto; - -import java.io.Serializable; - -public class UserLoginRequestDTO implements Serializable { - - private static final long serialVersionUID = 5926468583005150707L; - - private String username; - private String password; - - public UserLoginRequestDTO() {} - - public UserLoginRequestDTO(String username, String password) { - this.setUsername(username); - this.setPassword(password); - } - - public String getUsername() { - return this.username; - } - - public void setUsername(String username) { - this.username = username; - } - - public String getPassword() { - return this.password; - } - - public void setPassword(String password) { - this.password = password; - } - -} From de8b2fef3e5bd42d2f177026203c4c96b6592733 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:44:17 +0530 Subject: [PATCH 169/464] Delete StatusDTO.java --- .../com/wipro/cp/doconnect/dto/StatusDTO.java | 26 ------------------- 1 file changed, 26 deletions(-) delete mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/dto/StatusDTO.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/StatusDTO.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/StatusDTO.java deleted file mode 100644 index 4f1d7de..0000000 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/StatusDTO.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.wipro.cp.doconnect.dto; - -public class StatusDTO { - - private String statusMessage; - private boolean isValid; - private T object; - - public String getStatusMessage() { - return statusMessage; - } - public boolean getIsValid() { - return isValid; - } - public T getObject() { - return object; - } - - public StatusDTO(String statusMessage, boolean isValid, T object) { - super(); - this.statusMessage = statusMessage; - this.isValid = isValid; - this.object = object; - } - -} From 5b76c184159c6586b54efe2e90bc098bd4d24088 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:44:19 +0530 Subject: [PATCH 170/464] Delete QuestionUpdateDTO.java --- .../cp/doconnect/dto/QuestionUpdateDTO.java | 24 ------------------- 1 file changed, 24 deletions(-) delete mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/dto/QuestionUpdateDTO.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/QuestionUpdateDTO.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/QuestionUpdateDTO.java deleted file mode 100644 index 92e199a..0000000 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/QuestionUpdateDTO.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.wipro.cp.doconnect.dto; - -public class QuestionUpdateDTO { - - private boolean isApproved; - - public boolean getIsApproved() { - return isApproved; - } - - public void setIsApproved(boolean isApproved) { - this.isApproved = isApproved; - } - - public QuestionUpdateDTO(boolean isApproved) { - super(); - this.isApproved = isApproved; - } - - public QuestionUpdateDTO() { - super(); - } - -} From 46911d10b2aa7d53130db4975967f3fe1630f54e Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:44:21 +0530 Subject: [PATCH 171/464] Delete QuestionResponseDTO.java --- .../cp/doconnect/dto/QuestionResponseDTO.java | 59 ------------------- 1 file changed, 59 deletions(-) delete mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/dto/QuestionResponseDTO.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/QuestionResponseDTO.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/QuestionResponseDTO.java deleted file mode 100644 index 8eee9c3..0000000 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/QuestionResponseDTO.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.wipro.cp.doconnect.dto; - -import java.util.Date; -import java.util.List; - -public class QuestionResponseDTO { - - private long id; - private String question; - private String topic; - private List images; - private String postedBy; - private Date postedAt; - private String approvedBy; - private boolean isApproved; - - public long getId() { - return id; - } - public String getQuestion() { - return question; - } - public String getTopic() { - return topic; - } - public List getImages() { - return images; - } - public String getPostedBy() { - return postedBy; - } - public Date getPostedAt() { - return postedAt; - } - public String getApprovedBy() { - return approvedBy; - } - public boolean getIsApproved() { - return isApproved; - } - - public QuestionResponseDTO(long id, String question, String topic, List images, String postedBy, - Date postedAt, String approvedBy, boolean isApproved) { - super(); - this.id = id; - this.question = question; - this.topic = topic; - this.images = images; - this.postedBy = postedBy; - this.postedAt = postedAt; - this.approvedBy = approvedBy; - this.isApproved = isApproved; - } - - public QuestionResponseDTO() { - super(); - } - -} From 27faf018da45cbbfe54148f4885fe9bc45768be8 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:44:23 +0530 Subject: [PATCH 172/464] Delete QuestionRequestDTO.java --- .../cp/doconnect/dto/QuestionRequestDTO.java | 41 ------------------- 1 file changed, 41 deletions(-) delete mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/dto/QuestionRequestDTO.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/QuestionRequestDTO.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/QuestionRequestDTO.java deleted file mode 100644 index ccb1db1..0000000 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/QuestionRequestDTO.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.wipro.cp.doconnect.dto; - -import java.util.List; - -public class QuestionRequestDTO { - - private String question; - private String topic; - private List images; - - public String getQuestion() { - return question; - } - public void setQuestion(String question) { - this.question = question; - } - public String getTopic() { - return topic; - } - public void setTopic(String topic) { - this.topic = topic; - } - public List getImages() { - return images; - } - public void setImages(List images) { - this.images = images; - } - - public QuestionRequestDTO(String question, String topic, List images) { - super(); - this.question = question; - this.topic = topic; - this.images = images; - } - - public QuestionRequestDTO() { - super(); - } - -} From 1f47b58cb9520b499f57236a4abc1c0adca21904 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:44:25 +0530 Subject: [PATCH 173/464] Delete EmailDTO.java --- .../com/wipro/cp/doconnect/dto/EmailDTO.java | 30 ------------------- 1 file changed, 30 deletions(-) delete mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/dto/EmailDTO.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/EmailDTO.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/EmailDTO.java deleted file mode 100644 index 21ce296..0000000 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/EmailDTO.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.wipro.cp.doconnect.dto; - -public class EmailDTO { - - private String[] recipients; - private String subject; - private String body; - - public String[] getRecipients() { - return recipients; - } - public String getSubject() { - return subject; - } - public String getBody() { - return body; - } - - public EmailDTO(String[] recipients, String subject, String body) { - super(); - this.recipients = recipients; - this.subject = subject; - this.body = body; - } - - public EmailDTO() { - super(); - } - -} From 9c0eb53685ebc5f93f633912d2c600cc650ef5d1 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:44:27 +0530 Subject: [PATCH 174/464] Delete AnswerUpdateDTO.java --- .../cp/doconnect/dto/AnswerUpdateDTO.java | 24 ------------------- 1 file changed, 24 deletions(-) delete mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/dto/AnswerUpdateDTO.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/AnswerUpdateDTO.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/AnswerUpdateDTO.java deleted file mode 100644 index 4b86c68..0000000 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/AnswerUpdateDTO.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.wipro.cp.doconnect.dto; - -public class AnswerUpdateDTO { - - private boolean isApproved; - - public boolean getIsApproved() { - return isApproved; - } - - public void setIsApproved(boolean isApproved) { - this.isApproved = isApproved; - } - - public AnswerUpdateDTO(boolean isApproved) { - super(); - this.isApproved = isApproved; - } - - public AnswerUpdateDTO() { - super(); - } - -} From be302a7401cd2c76d8d7649154b64f5bf9522729 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:44:32 +0530 Subject: [PATCH 175/464] Delete AnswerResponseDTO.java --- .../cp/doconnect/dto/AnswerResponseDTO.java | 66 ------------------- 1 file changed, 66 deletions(-) delete mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/dto/AnswerResponseDTO.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/AnswerResponseDTO.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/AnswerResponseDTO.java deleted file mode 100644 index 4d30719..0000000 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/AnswerResponseDTO.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.wipro.cp.doconnect.dto; - -import java.util.Date; -import java.util.List; - -public class AnswerResponseDTO { - - private long id; - private String answer; - private List images; - private String postedBy; - private Date postedAt; - private String approvedBy; - private boolean isApproved; - private QuestionResponseDTO question; - - public long getId() { - return id; - } - - public String getAnswer() { - return answer; - } - - public List getImages() { - return images; - } - - public String getPostedBy() { - return postedBy; - } - - public Date getPostedAt() { - return postedAt; - } - - public String getApprovedBy() { - return approvedBy; - } - - public boolean getIsApproved() { - return isApproved; - } - - public QuestionResponseDTO getQuestion() { - return question; - } - - public AnswerResponseDTO(long id, String answer, List images, String postedBy, Date postedAt, - String approvedBy, boolean isApproved, QuestionResponseDTO question) { - super(); - this.id = id; - this.answer = answer; - this.images = images; - this.postedBy = postedBy; - this.postedAt = postedAt; - this.approvedBy = approvedBy; - this.isApproved = isApproved; - this.question = question; - } - - public AnswerResponseDTO() { - super(); - } - -} From 9c5bc0ac3dbd4f99d7d57d4bac888bdf0052bc29 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:44:35 +0530 Subject: [PATCH 176/464] Delete AnswerRequestDTO.java --- .../cp/doconnect/dto/AnswerRequestDTO.java | 33 ------------------- 1 file changed, 33 deletions(-) delete mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/dto/AnswerRequestDTO.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/AnswerRequestDTO.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/AnswerRequestDTO.java deleted file mode 100644 index 4f67671..0000000 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/AnswerRequestDTO.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.wipro.cp.doconnect.dto; - -import java.util.List; - -public class AnswerRequestDTO { - - private String answer; - private List images; - - public String getAnswer() { - return answer; - } - public void setAnswer(String answer) { - this.answer = answer; - } - public List getImages() { - return images; - } - public void setImages(List images) { - this.images = images; - } - - public AnswerRequestDTO(String answer, List images) { - super(); - this.answer = answer; - this.images = images; - } - - public AnswerRequestDTO() { - super(); - } - -} From 113ee30a974928f128c457592a9ab579ec3695f8 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:44:37 +0530 Subject: [PATCH 177/464] Delete DoConnectApplication.java --- .../wipro/cp/doconnect/DoConnectApplication.java | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/DoConnectApplication.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/DoConnectApplication.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/DoConnectApplication.java deleted file mode 100644 index 00f9b20..0000000 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/DoConnectApplication.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.wipro.cp.doconnect; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class DoConnectApplication { - - public static void main(String[] args) { - SpringApplication.run(DoConnectApplication.class, args); - } - -} From 23bdfd7729fc4f78452f052bce728ed7af371c8f Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:44:39 +0530 Subject: [PATCH 178/464] Delete UserController.java --- .../doconnect/controller/UserController.java | 82 ------------------- 1 file changed, 82 deletions(-) delete mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/controller/UserController.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/UserController.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/UserController.java deleted file mode 100644 index 91f1a60..0000000 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/UserController.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.wipro.cp.doconnect.controller; - -import java.util.List; - -import javax.validation.Valid; -import javax.validation.constraints.Min; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.CrossOrigin; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.wipro.cp.doconnect.dto.StatusDTO; -import com.wipro.cp.doconnect.dto.UserRegisterDTO; -import com.wipro.cp.doconnect.dto.UserResponseDTO; -import com.wipro.cp.doconnect.dto.UserUpdateDTO; -import com.wipro.cp.doconnect.service.UserServiceImp; - -@RestController -@CrossOrigin -@RequestMapping("/api/v1") -public class UserController { - - @Autowired - private UserServiceImp userServiceImp; - - @GetMapping("/users") - public ResponseEntity> getAllUsers() { - return ResponseEntity.ok(userServiceImp.getAllUsers()); - } - - @GetMapping("/users/{id}") - public ResponseEntity getUserById(@PathVariable @Min(1) Long id) { - StatusDTO userStatus = userServiceImp.getUserById(id); - if (!userStatus.getIsValid()) { - return ResponseEntity.status(HttpStatus.NOT_FOUND).body(userStatus.getStatusMessage()); - } - return ResponseEntity.ok(userStatus.getObject()); - } - - @PostMapping("/users") - public ResponseEntity createUser(@Valid @RequestBody UserRegisterDTO userRegisterDTO) { - StatusDTO userStatus = userServiceImp.createUser(userRegisterDTO); - if (!userStatus.getIsValid()) { - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(userStatus.getStatusMessage()); - } - return ResponseEntity.status(HttpStatus.CREATED).body(userStatus.getObject()); - } - - @PutMapping("/users/{id}") - public ResponseEntity updateUser(@Valid @RequestBody UserUpdateDTO userUpdateDTO, @PathVariable Long id) { - StatusDTO userStatus = userServiceImp.updateUser(userUpdateDTO, id); - if (!userStatus.getIsValid()) { - return ResponseEntity.status(HttpStatus.NOT_FOUND).body(userStatus.getStatusMessage()); - } - return ResponseEntity.ok(userStatus.getObject()); - } - - @DeleteMapping("/users/{id}") - public ResponseEntity deleteUserById(@PathVariable @Min(1) Long id) { - boolean deleted = userServiceImp.deleteUserById(id); - if (deleted) { - return ResponseEntity.ok("User deleted successfully."); - } - return ResponseEntity.status(HttpStatus.NOT_FOUND).body("User with ID " + id + " does not exist."); - } - - @DeleteMapping("/users") - public ResponseEntity deleteAllUser() { - userServiceImp.deleteAllUsers(); - return ResponseEntity.ok("All users deleted successfully."); - } - -} From 35e5fe01ba2b947a4326eadbb5e80048255025a0 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:44:41 +0530 Subject: [PATCH 179/464] Delete QuestionController.java --- .../controller/QuestionController.java | 95 ------------------- 1 file changed, 95 deletions(-) delete mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/controller/QuestionController.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/QuestionController.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/QuestionController.java deleted file mode 100644 index 73a34e7..0000000 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/QuestionController.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.wipro.cp.doconnect.controller; - -import java.util.List; -import java.util.Optional; - -import javax.validation.Valid; -import javax.validation.constraints.Min; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.CrossOrigin; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestHeader; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import com.wipro.cp.doconnect.dto.QuestionRequestDTO; -import com.wipro.cp.doconnect.dto.QuestionResponseDTO; -import com.wipro.cp.doconnect.dto.QuestionUpdateDTO; -import com.wipro.cp.doconnect.dto.StatusDTO; -import com.wipro.cp.doconnect.service.QuestionServiceImp; -import com.wipro.cp.doconnect.util.Utilities; - -@RestController -@CrossOrigin -@RequestMapping("/api/v1") -public class QuestionController { - - @Autowired - private QuestionServiceImp questionServiceImp; - - @Autowired - private Utilities utilities; - - @GetMapping("/questions") - public ResponseEntity getAllQuestions(@RequestParam(name="status") Optional optionalStatus, @RequestParam(name="search") Optional optionalSearch) { - String status = "approved"; - if (optionalStatus.isPresent()) { - status = optionalStatus.get(); - } - String search = null; - if (optionalSearch.isPresent()) { - search = optionalSearch.get(); - } - StatusDTO> questionStatus = questionServiceImp.getAllQuestions(status, search); - if (!questionStatus.getIsValid()) { - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(questionStatus.getStatusMessage()); - } - return ResponseEntity.ok(questionStatus.getObject()); - } - - @PostMapping("/questions") - public ResponseEntity createQuestion(@Valid @RequestBody QuestionRequestDTO questionRequestDTO, @RequestHeader(HttpHeaders.AUTHORIZATION) String authorizationHeader) { - String postedBy = utilities.getUsernameFromAuthorizationHeader(authorizationHeader); - StatusDTO questionStatus = questionServiceImp.createQuestion(questionRequestDTO, postedBy); - if (!questionStatus.getIsValid()) { - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(questionStatus.getStatusMessage()); - } - return ResponseEntity.status(HttpStatus.CREATED).body(questionStatus.getObject()); - } - - @PutMapping("/questions/{questionId}") - public ResponseEntity updateQuestion(@Valid @RequestBody QuestionUpdateDTO questionUpdateDTO, @PathVariable Long questionId, @RequestHeader(HttpHeaders.AUTHORIZATION) String authorizationHeader) { - String approvedBy = utilities.getUsernameFromAuthorizationHeader(authorizationHeader); - StatusDTO questionStatus = questionServiceImp.updateQuestion(questionUpdateDTO, questionId, approvedBy); - if (!questionStatus.getIsValid()) { - return ResponseEntity.status(HttpStatus.NOT_FOUND).body(questionStatus.getStatusMessage()); - } - return ResponseEntity.ok(questionStatus.getObject()); - } - - @DeleteMapping("/questions/{questionId}") - public ResponseEntity deleteQuestionById(@PathVariable @Min(1) Long questionId) { - StatusDTO deletionStatus = questionServiceImp.deleteQuestionById(questionId); - if (!deletionStatus.getIsValid()) { - Boolean status = deletionStatus.getObject(); - if (status == null) { - return ResponseEntity.status(HttpStatus.NOT_FOUND).body(deletionStatus.getStatusMessage()); - } - else { - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(deletionStatus.getStatusMessage()); - } - } - return ResponseEntity.ok("Question deleted successfully."); - } - -} From 6ce6bb8c078b6147645d854f9c87bc8ecc3e845c Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:44:43 +0530 Subject: [PATCH 180/464] Delete ImageController.java --- .../doconnect/controller/ImageController.java | 103 ------------------ 1 file changed, 103 deletions(-) delete mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/controller/ImageController.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/ImageController.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/ImageController.java deleted file mode 100644 index dcb470b..0000000 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/ImageController.java +++ /dev/null @@ -1,103 +0,0 @@ -package com.wipro.cp.doconnect.controller; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.StandardOpenOption; -import java.time.Clock; -import java.util.Arrays; -import java.util.Optional; -import java.util.Random; - -import javax.annotation.PostConstruct; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.core.io.InputStreamResource; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.CrossOrigin; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestPart; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; - -@RestController -@CrossOrigin -@RequestMapping("/api/v1") -public class ImageController { - - @Value("${image-storage-directory}") - private Path imageStorageDirectory; - - @Value("${valid-image-extensions}") - private String[] validImageExtensions; - - @PostConstruct - public void ensureDirectoryExists() throws IOException { - if (!Files.exists(this.imageStorageDirectory)) { - Files.createDirectories(this.imageStorageDirectory); - } - } - - private static Optional getFileExtension(String fileName) { - final int indexOfLastDot = fileName.lastIndexOf('.'); - if (indexOfLastDot == -1) { - return Optional.empty(); - } else { - return Optional.of(fileName.substring(indexOfLastDot + 1)); - } - } - - private boolean isValidFileExtension(String fileExtension) { - if (fileExtension.isBlank()) { - return false; - } - return Arrays.stream(validImageExtensions).anyMatch(fileExtension::equals); - } - - private static String generateFileName() { - Random rnd = new Random(); - int number = rnd.nextInt(99999); - Clock clock = Clock.systemDefaultZone(); - long milliseconds = clock.millis(); - return String.format("%d%05d", milliseconds, number); - } - - @PostMapping(value = "/images", produces = MediaType.TEXT_PLAIN_VALUE) - public ResponseEntity uploadImage(@RequestPart(name = "image", required = true) MultipartFile imageFile) throws IOException { - final String fileExtension = Optional.ofNullable(imageFile.getOriginalFilename()).flatMap(ImageController::getFileExtension).orElse(""); - if (!isValidFileExtension(fileExtension)) { - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("File extension is invalid. Should be either 'png' or 'jpeg'."); - } - final String targetFileName = generateFileName() + "." + fileExtension; - final Path targetPath = this.imageStorageDirectory.resolve(targetFileName); - try (InputStream in = imageFile.getInputStream()) { - try (OutputStream out = Files.newOutputStream(targetPath, StandardOpenOption.CREATE)) { - in.transferTo(out); - } - } - return ResponseEntity.ok(targetFileName); - } - - @GetMapping("/images/{fileName}") - public ResponseEntity downloadImage(@PathVariable("fileName") String fileName) throws IOException { - String fileExtension = Optional.ofNullable(fileName).flatMap(ImageController::getFileExtension).orElse(""); - if (!isValidFileExtension(fileExtension)) { - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("File extension is invalid. Should be either 'png' or 'jpeg'."); - } - MediaType contentType = (fileExtension.equalsIgnoreCase("jpeg")) ? MediaType.IMAGE_JPEG : MediaType.IMAGE_PNG; - final Path targetPath = this.imageStorageDirectory.resolve(fileName); - if (!Files.exists(targetPath)) { - return ResponseEntity.notFound().build(); - } - InputStream inputStream = Files.newInputStream(targetPath); - return ResponseEntity.ok().contentType(contentType).body(new InputStreamResource(inputStream)); - } - -} From 4165f768fdd411c32a12bc7668db163942b195f5 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:44:45 +0530 Subject: [PATCH 181/464] Delete AuthenticationController.java --- .../controller/AuthenticationController.java | 89 ------------------- 1 file changed, 89 deletions(-) delete mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AuthenticationController.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AuthenticationController.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AuthenticationController.java deleted file mode 100644 index 5bec079..0000000 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AuthenticationController.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.wipro.cp.doconnect.controller; - -import javax.validation.Valid; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.security.authentication.AuthenticationManager; -import org.springframework.security.authentication.BadCredentialsException; -import org.springframework.security.authentication.DisabledException; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.web.bind.annotation.CrossOrigin; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestHeader; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.wipro.cp.doconnect.component.JwtTokenUtilityComponent; -import com.wipro.cp.doconnect.dto.StatusDTO; -import com.wipro.cp.doconnect.dto.UserLoginRequestDTO; -import com.wipro.cp.doconnect.dto.UserLoginResponseDTO; -import com.wipro.cp.doconnect.dto.UserRegisterDTO; -import com.wipro.cp.doconnect.dto.UserResponseDTO; -import com.wipro.cp.doconnect.entity.LogoutToken; -import com.wipro.cp.doconnect.service.LogoutTokenServiceImp; -import com.wipro.cp.doconnect.service.UserServiceImp; - -@RestController -@CrossOrigin -@RequestMapping("/api/v1") -public class AuthenticationController { - - @Autowired - private AuthenticationManager authenticationManager; - - @Autowired - private JwtTokenUtilityComponent jwtTokenUtilityComponent; - - @Autowired - private UserServiceImp userServiceImp; - - @Autowired - private LogoutTokenServiceImp logoutTokenServiceImp; - - @GetMapping("/signout") - public ResponseEntity logoutUser(@RequestHeader(HttpHeaders.AUTHORIZATION) String authorizationHeader) { - if (authorizationHeader.startsWith("Bearer ")) { - String jwtToken = authorizationHeader.substring(7); - logoutTokenServiceImp.createToken(new LogoutToken(jwtToken)); - return ResponseEntity.ok("You have been successfully logged out."); - } - else { - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Authorization header does not begin with Bearer string."); - } - } - - @PostMapping("/register") - public ResponseEntity registerUser(@Valid @RequestBody UserRegisterDTO userRegisterDTO) { - StatusDTO userStatus = userServiceImp.createUser(userRegisterDTO); - if (!userStatus.getIsValid()) { - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(userStatus.getStatusMessage()); - } - UserResponseDTO userResponseDTO = userStatus.getObject(); - return ResponseEntity.ok(userResponseDTO.getUsername() + " has been registered successfully" + (userResponseDTO.getIsAdmin() ? " as an admin." : " as a user.") + " Proceed to login to get your authorization token."); - } - - @PostMapping("/login") - public ResponseEntity createAuthenticationToken(@RequestBody UserLoginRequestDTO userLoginRequestDTO) throws Exception { - authenticate(userLoginRequestDTO.getUsername(), userLoginRequestDTO.getPassword()); - final UserDetails userDetails = userServiceImp.loadUserByUsername(userLoginRequestDTO.getUsername()); - final String token = jwtTokenUtilityComponent.generateToken(userDetails); - return ResponseEntity.ok(new UserLoginResponseDTO(token, "Bearer")); - } - - private void authenticate(String username, String password) throws Exception { - try { - authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(username, password)); - } catch (DisabledException e) { - throw new Exception("USER_DISABLED", e); - } catch (BadCredentialsException e) { - throw new Exception("INVALID_CREDENTIALS", e); - } - } - -} From b3c3a9a6514b3ab76da6f656cfe7daea9d0e3c6d Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:44:47 +0530 Subject: [PATCH 182/464] Delete AnswerController.java --- .../controller/AnswerController.java | 103 ------------------ 1 file changed, 103 deletions(-) delete mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AnswerController.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AnswerController.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AnswerController.java deleted file mode 100644 index fc88b6a..0000000 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AnswerController.java +++ /dev/null @@ -1,103 +0,0 @@ -package com.wipro.cp.doconnect.controller; - -import java.util.List; -import java.util.Optional; - -import javax.validation.Valid; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.CrossOrigin; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestHeader; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import com.wipro.cp.doconnect.dto.AnswerRequestDTO; -import com.wipro.cp.doconnect.dto.AnswerResponseDTO; -import com.wipro.cp.doconnect.dto.AnswerUpdateDTO; -import com.wipro.cp.doconnect.dto.StatusDTO; -import com.wipro.cp.doconnect.service.AnswerServiceImp; -import com.wipro.cp.doconnect.util.Utilities; - -@RestController -@CrossOrigin -@RequestMapping("/api/v1") -public class AnswerController { - - @Autowired - AnswerServiceImp answerServiceImp; - - @Autowired - private Utilities utilities; - - @GetMapping("/answers") - public ResponseEntity getAllAnswers(@RequestParam(name="status") Optional optionalStatus) { - String answerStatus = "approved"; - if (optionalStatus.isPresent()) { - answerStatus = optionalStatus.get(); - } - StatusDTO> answerResponseDTOStatus = answerServiceImp.getAllAnswers(answerStatus); - if (!answerResponseDTOStatus.getIsValid()) { - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(answerResponseDTOStatus.getStatusMessage()); - } - return ResponseEntity.ok(answerResponseDTOStatus.getObject()); - } - - @GetMapping("/questions/{questionId}/answers") - public ResponseEntity getAllAnswersForQuestionId(@PathVariable(value="questionId") Long questionId, @RequestParam(name="status") Optional optionalStatus) { - String answerStatus = "approved"; - if (optionalStatus.isPresent()) { - answerStatus = optionalStatus.get(); - } - StatusDTO> answerResponseDTOStatus = answerServiceImp.getAllAnswersForQuestionId(questionId, answerStatus); - if (!answerResponseDTOStatus.getIsValid()) { - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(answerResponseDTOStatus.getStatusMessage()); - } - return ResponseEntity.ok(answerResponseDTOStatus.getObject()); - } - - @PostMapping("/questions/{questionId}/answers") - public ResponseEntity createAnswerForQuestionId(@PathVariable(value="questionId") Long questionId, @Valid @RequestBody AnswerRequestDTO answerRequestDTO, @RequestHeader(HttpHeaders.AUTHORIZATION) String authorizationHeader) { - String postedBy = utilities.getUsernameFromAuthorizationHeader(authorizationHeader); - StatusDTO answerResponseDTOStatus = answerServiceImp.createAnswerForQuestionId(questionId, answerRequestDTO, postedBy); - if (!answerResponseDTOStatus.getIsValid()) { - return ResponseEntity.status(HttpStatus.NOT_FOUND).body(answerResponseDTOStatus.getStatusMessage()); - } - return ResponseEntity.status(HttpStatus.CREATED).body(answerResponseDTOStatus.getObject()); - } - - @PutMapping("/questions/{questionId}/answers/{answerId}") - public ResponseEntity updateAnswerForQuestionId(@Valid @RequestBody AnswerUpdateDTO answerUpdateDTO, @PathVariable(value="questionId") Long questionId, @PathVariable(value="answerId") Long answerId, @RequestHeader(HttpHeaders.AUTHORIZATION) String authorizationHeader) { - String approvedBy = utilities.getUsernameFromAuthorizationHeader(authorizationHeader); - StatusDTO answerResponseDTOStatus = answerServiceImp.updateAnswerForQuestionId(questionId, answerId, answerUpdateDTO, approvedBy); - if (!answerResponseDTOStatus.getIsValid()) { - return ResponseEntity.status(HttpStatus.NOT_FOUND).body(answerResponseDTOStatus.getStatusMessage()); - } - return ResponseEntity.ok(answerResponseDTOStatus.getObject()); - } - - @DeleteMapping("/questions/{questionId}/answers/{answerId}") - public ResponseEntity deleteAnswerForQuestionById(@PathVariable(value="questionId") Long questionId, @PathVariable(value="answerId") Long answerId) { - StatusDTO deletionStatus = answerServiceImp.deleteAnswerForQuestionById(questionId, answerId); - if (!deletionStatus.getIsValid()) { - Boolean status = deletionStatus.getObject(); - if (status == null) { - return ResponseEntity.status(HttpStatus.NOT_FOUND).body(deletionStatus.getStatusMessage()); - } - else { - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(deletionStatus.getStatusMessage()); - } - } - return ResponseEntity.ok("Answer for Question ID " + questionId + " deleted successfully."); - } - -} From a15155e256fc471556d32f0f3aa26db51cbeb0a6 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:44:49 +0530 Subject: [PATCH 183/464] Delete WebSecurityConfig.java --- .../doconnect/config/WebSecurityConfig.java | 53 ------------------- 1 file changed, 53 deletions(-) delete mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/config/WebSecurityConfig.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/config/WebSecurityConfig.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/config/WebSecurityConfig.java deleted file mode 100644 index c19c1f0..0000000 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/config/WebSecurityConfig.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.wipro.cp.doconnect.config; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Bean; -import org.springframework.security.authentication.AuthenticationManager; -import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -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.SecurityFilterChain; -import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; - -import com.wipro.cp.doconnect.component.JwtAuthenticationEntryPointComponent; -import com.wipro.cp.doconnect.component.JwtRequestFilterComponent; - -@EnableWebSecurity -public class WebSecurityConfig { - - @Autowired - private JwtAuthenticationEntryPointComponent jwtAuthenticationEntryPointComponent; - - @Autowired - private JwtRequestFilterComponent jwtRequestFilterComponent; - - @Bean - public PasswordEncoder passwordEncoder() { - return new BCryptPasswordEncoder(); - } - - @Bean - public AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration) throws Exception { - return authenticationConfiguration.getAuthenticationManager(); - } - - @Bean - public SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception { - // We don't need CSRF for this example - httpSecurity.csrf().disable() - // don't authenticate this particular request - .authorizeRequests().antMatchers("/api/v1/register", "/api/v1/login", "/api/v1/questions").permitAll() - // all other requests need to be authenticated - .anyRequest().authenticated().and() - // make sure we use state less session; session won't be used to store user's state. - .exceptionHandling().authenticationEntryPoint(jwtAuthenticationEntryPointComponent).and().sessionManagement() - .sessionCreationPolicy(SessionCreationPolicy.STATELESS); - // Add a filter to validate the tokens with every request - httpSecurity.addFilterBefore(jwtRequestFilterComponent, UsernamePasswordAuthenticationFilter.class); - return httpSecurity.build(); - } - -} From 363f5217d8c220af4e008d4c6b3a9802d3aed004 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:44:51 +0530 Subject: [PATCH 184/464] Delete LogoutTokenSchedulerConfig.java --- .../config/LogoutTokenSchedulerConfig.java | 48 ------------------- 1 file changed, 48 deletions(-) delete mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/config/LogoutTokenSchedulerConfig.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/config/LogoutTokenSchedulerConfig.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/config/LogoutTokenSchedulerConfig.java deleted file mode 100644 index a9895ac..0000000 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/config/LogoutTokenSchedulerConfig.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.wipro.cp.doconnect.config; - -import java.util.ArrayList; -import java.util.List; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Configuration; -import org.springframework.scheduling.annotation.EnableScheduling; -import org.springframework.scheduling.annotation.Scheduled; - -import com.wipro.cp.doconnect.component.JwtTokenUtilityComponent; -import com.wipro.cp.doconnect.entity.LogoutToken; -import com.wipro.cp.doconnect.service.LogoutTokenServiceImp; - -import io.jsonwebtoken.ExpiredJwtException; - -@Configuration -@EnableScheduling -public class LogoutTokenSchedulerConfig { - - @Autowired - private LogoutTokenServiceImp logoutTokenServiceImp; - - @Autowired - private JwtTokenUtilityComponent jwtTokenUtilityComponent; - - @Scheduled(fixedDelay = 15 * 60 * 1000) // 15 Minutes - public void deleteExpiredJwtTokens() { - System.out.println("deleteExpiredJwtTokens scheduled job started at " + System.currentTimeMillis()); - List logoutTokenList = logoutTokenServiceImp.getAllTokens(); - logoutTokenServiceImp.deleteAllTokens(); - List validLogoutTokenList = new ArrayList<>(); - for (LogoutToken logoutToken : logoutTokenList) { - try { - if (jwtTokenUtilityComponent.isTokenExpired(logoutToken.getToken())) { - System.out.println("JWT Token " + logoutToken.getToken() + " removed from logout_token table."); - } else { - validLogoutTokenList.add(logoutToken); - } - } catch (ExpiredJwtException e) { - System.out.println("Exception in deleteExpiredJwtTokens - " + e.toString()); - } - } - logoutTokenServiceImp.createTokens(validLogoutTokenList); - System.out.println("deleteExpiredJwtTokens scheduled job finished at " + System.currentTimeMillis()); - } - -} From a4646ee84d44e7c63bbe98425684e3d3448a94c1 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:44:53 +0530 Subject: [PATCH 185/464] Delete AuthorizationConfig.java --- .../doconnect/config/AuthorizationConfig.java | 25 ------------------- 1 file changed, 25 deletions(-) delete mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/config/AuthorizationConfig.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/config/AuthorizationConfig.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/config/AuthorizationConfig.java deleted file mode 100644 index 0cd29fc..0000000 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/config/AuthorizationConfig.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.wipro.cp.doconnect.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.config.annotation.EnableWebMvc; -import org.springframework.web.servlet.config.annotation.InterceptorRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - -import com.wipro.cp.doconnect.interceptor.AuthorizationInterceptor; - -@Configuration -@EnableWebMvc -public class AuthorizationConfig implements WebMvcConfigurer { - - @Bean - public AuthorizationInterceptor authorizationInterceptor() { - return new AuthorizationInterceptor(); - } - - @Override - public void addInterceptors(InterceptorRegistry registry) { - registry.addInterceptor(authorizationInterceptor()).addPathPatterns("/**"); - } - -} From 377bf2eb51ab13123157d92a8b01d3c92635bceb Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:44:55 +0530 Subject: [PATCH 186/464] Delete SimpleCORSFilter.java --- .../doconnect/component/SimpleCORSFilter.java | 44 ------------------- 1 file changed, 44 deletions(-) delete mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/component/SimpleCORSFilter.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/component/SimpleCORSFilter.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/component/SimpleCORSFilter.java deleted file mode 100644 index 9333c4a..0000000 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/component/SimpleCORSFilter.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.wipro.cp.doconnect.component; - -import java.io.IOException; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; - -@Component -public class SimpleCORSFilter implements Filter { - - private final Logger log = LoggerFactory.getLogger(SimpleCORSFilter.class); - - public SimpleCORSFilter() { - log.info("SimpleCORSFilter init"); - } - - @Override - public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { - HttpServletRequest httpRequest = (HttpServletRequest) request; - HttpServletResponse httpResponse = (HttpServletResponse) response; - httpResponse.setHeader("Access-Control-Allow-Origin", httpRequest.getHeader("Origin")); - httpResponse.setHeader("Access-Control-Allow-Credentials", "true"); - httpResponse.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE"); - httpResponse.setHeader("Access-Control-Max-Age", "3600"); - httpResponse.setHeader("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With, remember-me"); - chain.doFilter(request, response); - } - - @Override - public void init(FilterConfig filterConfig) {} - - @Override - public void destroy() {} - -} From ed731bf6834f80c9899697b0da4300c4a08c96c2 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:44:57 +0530 Subject: [PATCH 187/464] Delete JwtTokenUtilityComponent.java --- .../component/JwtTokenUtilityComponent.java | 95 ------------------- 1 file changed, 95 deletions(-) delete mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/component/JwtTokenUtilityComponent.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/component/JwtTokenUtilityComponent.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/component/JwtTokenUtilityComponent.java deleted file mode 100644 index 05884df..0000000 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/component/JwtTokenUtilityComponent.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.wipro.cp.doconnect.component; - -import java.io.Serializable; -import java.util.Date; -import java.util.HashMap; -import java.util.Map; -import java.util.function.Function; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.stereotype.Component; - -import com.wipro.cp.doconnect.dto.StatusDTO; -import com.wipro.cp.doconnect.dto.UserResponseDTO; -import com.wipro.cp.doconnect.service.LogoutTokenServiceImp; -import com.wipro.cp.doconnect.service.UserServiceImp; - -import io.jsonwebtoken.Claims; -import io.jsonwebtoken.Jwts; -import io.jsonwebtoken.SignatureAlgorithm; - -@Component -public class JwtTokenUtilityComponent implements Serializable { - - private static final long serialVersionUID = -2550185165626007488L; - - @Value("${jwt.token-validity-time}") - private int JWT_TOKEN_VALIDITY; - - @Value("${jwt.secret}") - private String secret; - - @Autowired - private LogoutTokenServiceImp logoutTokenServiceImp; - - @Autowired - private UserServiceImp userServiceImp; - - public String getUsernameFromToken(String token) { - return getClaimFromToken(token, Claims::getSubject); - } - - public Date getExpirationDateFromToken(String token) { - return getClaimFromToken(token, Claims::getExpiration); - } - - public T getClaimFromToken(String token, Function claimsResolver) { - final Claims claims = getAllClaimsFromToken(token); - return claimsResolver.apply(claims); - } - - private Claims getAllClaimsFromToken(String token) { - return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody(); - } - - public Boolean isTokenExpired(String token) { - final Date expiration = getExpirationDateFromToken(token); - return expiration.before(new Date()); - } - - public String generateToken(UserDetails userDetails) { - Map claims = new HashMap<>(); - StatusDTO userStatus = userServiceImp.getUserByUsername(userDetails.getUsername()); - if (userStatus.getIsValid()) { - UserResponseDTO user = userStatus.getObject(); - claims.put("isAdmin", user.getIsAdmin()); - claims.put("email", user.getEmail()); - claims.put("name", user.getName()); - } - return doGenerateToken(claims, userDetails.getUsername()); - } - - //while creating the token - - //1. Define claims of the token, like Issuer, Expiration, Subject, and the ID - //2. Sign the JWT using the HS512 algorithm and secret key. - //3. According to JWS Compact Serialization(https://tools.ietf.org/html/draft-ietf-jose-json-web-signature-41#section-3.1) compaction of the JWT to a URL-safe string - private String doGenerateToken(Map claims, String subject) { - return Jwts.builder().setClaims(claims).setSubject(subject).setIssuedAt(new Date(System.currentTimeMillis())) - .setExpiration(new Date(System.currentTimeMillis() + JWT_TOKEN_VALIDITY * 1000)) - .signWith(SignatureAlgorithm.HS512, secret).compact(); - } - - //validate token - //First check if the token is present in the logout tokens list, if it exists, then token is invalid - //If token is still valid then get user name from token and check if it is same as in user details and the token is not expired - public Boolean validateToken(String token, UserDetails userDetails) { - if (logoutTokenServiceImp.checkIfTokenExists(token)) { - return false; - } - final String username = getUsernameFromToken(token); - return (username.equals(userDetails.getUsername()) && !isTokenExpired(token)); - } - -} From cb014637cfd7bbb14406ee73665c0e707d2afede Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:44:58 +0530 Subject: [PATCH 188/464] Delete JwtRequestFilterComponent.java --- .../component/JwtRequestFilterComponent.java | 64 ------------------- 1 file changed, 64 deletions(-) delete mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/component/JwtRequestFilterComponent.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/component/JwtRequestFilterComponent.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/component/JwtRequestFilterComponent.java deleted file mode 100644 index 8772231..0000000 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/component/JwtRequestFilterComponent.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.wipro.cp.doconnect.component; - -import java.io.IOException; - -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; -import org.springframework.stereotype.Component; -import org.springframework.web.filter.OncePerRequestFilter; - -import com.wipro.cp.doconnect.service.UserServiceImp; - -import io.jsonwebtoken.ExpiredJwtException; - -@Component -public class JwtRequestFilterComponent extends OncePerRequestFilter { - - @Autowired - private UserServiceImp userServiceImp; - - @Autowired - private JwtTokenUtilityComponent jwtTokenUtilityComponent; - - @Override - protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException { - final String requestTokenHeader = request.getHeader("Authorization"); - String username = null; - String jwtToken = null; - // JWT Token is in the form "Bearer token". Remove Bearer word and get only the token - if (requestTokenHeader != null && requestTokenHeader.startsWith("Bearer ")) { - jwtToken = requestTokenHeader.substring(7); - try { - username = jwtTokenUtilityComponent.getUsernameFromToken(jwtToken); - } catch (IllegalArgumentException e) { - logger.error("Unable to get JWT Token from Authorization header. " + e.toString()); - } catch (ExpiredJwtException e) { - logger.error("JWT Token " + jwtToken + " has expired. " + e.toString()); - } - } else { - logger.warn("JWT Token does not begin with Bearer string"); - } - // Once we get the token validate it. - if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) { - UserDetails userDetails = this.userServiceImp.loadUserByUsername(username); - // if token is valid configure Spring Security to manually set authentication - if (jwtTokenUtilityComponent.validateToken(jwtToken, userDetails)) { - UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); - usernamePasswordAuthenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); - // After setting the Authentication in the context, we specify that the current user is authenticated. So it passes the - // Spring Security Configurations successfully. - SecurityContextHolder.getContext().setAuthentication(usernamePasswordAuthenticationToken); - } - } - chain.doFilter(request, response); - } - -} From 6d89c75cb8c2351074057dd3630b19ea2bbde27f Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:45:00 +0530 Subject: [PATCH 189/464] Delete JwtAuthenticationEntryPointComponent.java --- .../JwtAuthenticationEntryPointComponent.java | 23 ------------------- 1 file changed, 23 deletions(-) delete mode 100644 DoConnect/src/main/java/com/wipro/cp/doconnect/component/JwtAuthenticationEntryPointComponent.java diff --git a/DoConnect/src/main/java/com/wipro/cp/doconnect/component/JwtAuthenticationEntryPointComponent.java b/DoConnect/src/main/java/com/wipro/cp/doconnect/component/JwtAuthenticationEntryPointComponent.java deleted file mode 100644 index 536db43..0000000 --- a/DoConnect/src/main/java/com/wipro/cp/doconnect/component/JwtAuthenticationEntryPointComponent.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.wipro.cp.doconnect.component; - -import java.io.IOException; -import java.io.Serializable; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.springframework.security.core.AuthenticationException; -import org.springframework.security.web.AuthenticationEntryPoint; -import org.springframework.stereotype.Component; - -@Component -public class JwtAuthenticationEntryPointComponent implements AuthenticationEntryPoint, Serializable { - - private static final long serialVersionUID = -7858869558953243875L; - - @Override - public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException { - response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized"); - } - -} From 4c258bd13baccebc561902b4834f49c53a52ec29 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:45:03 +0530 Subject: [PATCH 190/464] Delete pom.xml --- DoConnect/pom.xml | 84 ----------------------------------------------- 1 file changed, 84 deletions(-) delete mode 100644 DoConnect/pom.xml diff --git a/DoConnect/pom.xml b/DoConnect/pom.xml deleted file mode 100644 index e7070e3..0000000 --- a/DoConnect/pom.xml +++ /dev/null @@ -1,84 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starter-parent - 2.7.3 - - - com.wipro.cp - doconnect - 0.0.1-SNAPSHOT - DoConnect - Demo project for Spring Boot - - 17 - - - - org.springframework.boot - spring-boot-starter-actuator - - - org.springframework.boot - spring-boot-starter-data-jpa - - - org.springframework.boot - spring-boot-starter-web - - - - mysql - mysql-connector-java - runtime - - - org.springframework.boot - spring-boot-starter-test - test - - - org.springframework.boot - spring-boot-starter-security - - - io.jsonwebtoken - jjwt - 0.9.1 - - - org.springframework.boot - spring-boot-starter-validation - - - org.springframework.security - spring-security-test - test - - - org.springframework.boot - spring-boot-starter-mail - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - org.projectlombok - lombok - - - - - - - - From 6ba17ae0a25c6cdd488cf6340b96892c68e4649c Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:45:05 +0530 Subject: [PATCH 191/464] Delete mvnw.cmd --- DoConnect/mvnw.cmd | 188 --------------------------------------------- 1 file changed, 188 deletions(-) delete mode 100644 DoConnect/mvnw.cmd diff --git a/DoConnect/mvnw.cmd b/DoConnect/mvnw.cmd deleted file mode 100644 index 1d8ab01..0000000 --- a/DoConnect/mvnw.cmd +++ /dev/null @@ -1,188 +0,0 @@ -@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 https://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 "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* -if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\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/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" - -FOR /F "usebackq 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%/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.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 "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" -if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\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% - -cmd /C exit /B %ERROR_CODE% From 5037e5a6eb992834a775bdc86b498600523a41db Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:45:08 +0530 Subject: [PATCH 192/464] Delete mvnw --- DoConnect/mvnw | 316 ------------------------------------------------- 1 file changed, 316 deletions(-) delete mode 100644 DoConnect/mvnw diff --git a/DoConnect/mvnw b/DoConnect/mvnw deleted file mode 100644 index 8a8fb22..0000000 --- a/DoConnect/mvnw +++ /dev/null @@ -1,316 +0,0 @@ -#!/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 -# -# https://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 /usr/local/etc/mavenrc ] ; then - . /usr/local/etc/mavenrc - fi - - 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="`\\unset -f command; \\command -v 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/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" - else - jarUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.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" || rm -f "$wrapperJarPath" - else - wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" || rm -f "$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 \ - $MAVEN_DEBUG_OPTS \ - -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ - "-Dmaven.home=${M2_HOME}" \ - "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ - ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" From 5e673279e07e9f0f1a9b725eb90a15d67f33f1e4 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:45:11 +0530 Subject: [PATCH 193/464] Delete application.properties --- .../bin/src/main/resources/application.properties | 12 ------------ 1 file changed, 12 deletions(-) delete mode 100644 DoConnect/bin/src/main/resources/application.properties diff --git a/DoConnect/bin/src/main/resources/application.properties b/DoConnect/bin/src/main/resources/application.properties deleted file mode 100644 index 2d280fe..0000000 --- a/DoConnect/bin/src/main/resources/application.properties +++ /dev/null @@ -1,12 +0,0 @@ -server.port=9090 - -spring.datasource.url=jdbc:mysql://localhost:3306/do_connect?createDatabaseIfNotExist=true&useSSL=false -spring.datasource.username=root -spring.datasource.password=Password@12345 -spring.jpa.hibernate.ddl-auto=update -spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect -spring.jpa.open-in-view=false - -jwt.secret=devashishpathrabe - -spring.main.allow-circular-references=true From 60034a7c4c76640ffe692b97389c597c475422f0 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:45:13 +0530 Subject: [PATCH 194/464] Delete pom.xml --- DoConnect/bin/pom.xml | 80 ------------------------------------------- 1 file changed, 80 deletions(-) delete mode 100644 DoConnect/bin/pom.xml diff --git a/DoConnect/bin/pom.xml b/DoConnect/bin/pom.xml deleted file mode 100644 index ec78161..0000000 --- a/DoConnect/bin/pom.xml +++ /dev/null @@ -1,80 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starter-parent - 2.7.3 - - - com.wipro.cp - doconnect - 0.0.1-SNAPSHOT - DoConnect - Demo project for Spring Boot - - 17 - - - - org.springframework.boot - spring-boot-starter-actuator - - - org.springframework.boot - spring-boot-starter-data-jpa - - - org.springframework.boot - spring-boot-starter-web - - - - mysql - mysql-connector-java - runtime - - - org.projectlombok - lombok - true - - - org.springframework.boot - spring-boot-starter-test - test - - - org.springframework.boot - spring-boot-starter-security - - - org.springframework.boot - spring-boot-starter-validation - - - org.springframework.security - spring-security-test - test - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - org.projectlombok - lombok - - - - - - - - From 68d6a894a5f68b9db3236e63a13b8b0e7eaf2a8f Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:45:15 +0530 Subject: [PATCH 195/464] Delete maven-wrapper.properties --- DoConnect/.mvn/wrapper/maven-wrapper.properties | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 DoConnect/.mvn/wrapper/maven-wrapper.properties diff --git a/DoConnect/.mvn/wrapper/maven-wrapper.properties b/DoConnect/.mvn/wrapper/maven-wrapper.properties deleted file mode 100644 index b74bf7f..0000000 --- a/DoConnect/.mvn/wrapper/maven-wrapper.properties +++ /dev/null @@ -1,2 +0,0 @@ -distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.6/apache-maven-3.8.6-bin.zip -wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar From cc4d5b61bc071e01653e662e7aa4651985c58ba3 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:45:17 +0530 Subject: [PATCH 196/464] Delete maven-wrapper.jar --- DoConnect/.mvn/wrapper/maven-wrapper.jar | Bin 58727 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 DoConnect/.mvn/wrapper/maven-wrapper.jar diff --git a/DoConnect/.mvn/wrapper/maven-wrapper.jar b/DoConnect/.mvn/wrapper/maven-wrapper.jar deleted file mode 100644 index c1dd12f17644411d6e840bd5a10c6ecda0175f18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58727 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%0ANsA|A3-jj|r`KAo%oTajX3>^E` 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 YM{}PByk10KD_nuQ4E7Du?}+~TKh4V)`~Uy| From 614e34b83f830d56a77e58ce1f18ca6e39b6808f Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:45:20 +0530 Subject: [PATCH 197/464] Delete .gitignore --- DoConnect/.gitignore | 33 --------------------------------- 1 file changed, 33 deletions(-) delete mode 100644 DoConnect/.gitignore diff --git a/DoConnect/.gitignore b/DoConnect/.gitignore deleted file mode 100644 index 549e00a..0000000 --- a/DoConnect/.gitignore +++ /dev/null @@ -1,33 +0,0 @@ -HELP.md -target/ -!.mvn/wrapper/maven-wrapper.jar -!**/src/main/**/target/ -!**/src/test/**/target/ - -### STS ### -.apt_generated -.classpath -.factorypath -.project -.settings -.springBeans -.sts4-cache - -### IntelliJ IDEA ### -.idea -*.iws -*.iml -*.ipr - -### NetBeans ### -/nbproject/private/ -/nbbuild/ -/dist/ -/nbdist/ -/.nb-gradle/ -build/ -!**/src/main/**/build/ -!**/src/test/**/build/ - -### VS Code ### -.vscode/ From 183efba4b29a8e13b0bdf476b76a8a072483b99f Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:45:22 +0530 Subject: [PATCH 198/464] Create DoConnectApplicationTests.java --- .../cp/doconnect/DoConnectApplicationTests.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 do_connect_backend/DoConnect/src/test/java/com/wipro/cp/doconnect/DoConnectApplicationTests.java diff --git a/do_connect_backend/DoConnect/src/test/java/com/wipro/cp/doconnect/DoConnectApplicationTests.java b/do_connect_backend/DoConnect/src/test/java/com/wipro/cp/doconnect/DoConnectApplicationTests.java new file mode 100644 index 0000000..df78148 --- /dev/null +++ b/do_connect_backend/DoConnect/src/test/java/com/wipro/cp/doconnect/DoConnectApplicationTests.java @@ -0,0 +1,13 @@ +package com.wipro.cp.doconnect; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class DoConnectApplicationTests { + + @Test + void contextLoads() { + } + +} From d25147a839bf1102ed9ccc934610a9a391bf8dea Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:45:29 +0530 Subject: [PATCH 199/464] Create Utilities.java --- .../wipro/cp/doconnect/util/Utilities.java | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/util/Utilities.java diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/util/Utilities.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/util/Utilities.java new file mode 100644 index 0000000..c01f583 --- /dev/null +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/util/Utilities.java @@ -0,0 +1,51 @@ +package com.wipro.cp.doconnect.util; + +import java.util.List; +import java.util.stream.Collectors; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.wipro.cp.doconnect.component.JwtTokenUtilityComponent; +import com.wipro.cp.doconnect.dto.AnswerResponseDTO; +import com.wipro.cp.doconnect.dto.QuestionResponseDTO; +import com.wipro.cp.doconnect.entity.Answer; +import com.wipro.cp.doconnect.entity.Question; +import com.wipro.cp.doconnect.entity.User; + +@Component +public class Utilities { + + @Autowired + private JwtTokenUtilityComponent jwtTokenUtilityComponent; + + public String[] getUserEmails(List userList) { + String[] array = new String[userList.size()]; + for (int i = 0; i < userList.size(); i++) { + array[i] = userList.get(i).getEmail(); + } + return array; + } + + public QuestionResponseDTO convertQuestionToQuestionResponseDTO(Question question) { + return new QuestionResponseDTO(question.getId(), question.getQuestion(), question.getTopic(), question.getImages(), question.getPostedBy(), question.getPostedAt(), question.getApprovedBy(), question.getIsApproved()); + } + + public List convertQuestionListToQuestionResponseDTOList(List questionList) { + return questionList.stream().map(question -> convertQuestionToQuestionResponseDTO(question)).collect(Collectors.toList()); + } + + public AnswerResponseDTO convertAnswerToAnswerResponseDTO(Answer answer) { + return new AnswerResponseDTO(answer.getId(), answer.getAnswer(), answer.getImages(), answer.getPostedBy(), answer.getPostedAt(), answer.getApprovedBy(), answer.getIsApproved(), convertQuestionToQuestionResponseDTO(answer.getQuestion())); + } + + public List convertAnswerListToAnswerResponseDTOList(List answerList) { + return answerList.stream().map(answer -> convertAnswerToAnswerResponseDTO(answer)).collect(Collectors.toList()); + } + + public String getUsernameFromAuthorizationHeader(String authorizationHeader) { + String jwtToken = authorizationHeader.substring(7); + return jwtTokenUtilityComponent.getUsernameFromToken(jwtToken); + } + +} From 28edd1a2235399bbc7e7be648858c130c9a74677 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:45:32 +0530 Subject: [PATCH 200/464] Create ListToStringConverter.java --- .../doconnect/util/ListToStringConverter.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/util/ListToStringConverter.java diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/util/ListToStringConverter.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/util/ListToStringConverter.java new file mode 100644 index 0000000..88227b7 --- /dev/null +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/util/ListToStringConverter.java @@ -0,0 +1,19 @@ +package com.wipro.cp.doconnect.util; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import javax.persistence.AttributeConverter; + +public class ListToStringConverter implements AttributeConverter, String> { + @Override + public String convertToDatabaseColumn(List attribute) { + return (attribute == null || attribute.size() == 0) ? null : String.join(",", attribute); + } + + @Override + public List convertToEntityAttribute(String dbData) { + return dbData == null ? Collections.emptyList() : Arrays.asList(dbData.split(",")); + } +} From ad0c96e2622f398527811c488e78ed7b3662877c Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:45:35 +0530 Subject: [PATCH 201/464] Create UserServiceImp.java --- .../cp/doconnect/service/UserServiceImp.java | 108 ++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/UserServiceImp.java diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/UserServiceImp.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/UserServiceImp.java new file mode 100644 index 0000000..f352d47 --- /dev/null +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/UserServiceImp.java @@ -0,0 +1,108 @@ +package com.wipro.cp.doconnect.service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; + +import com.wipro.cp.doconnect.dto.StatusDTO; +import com.wipro.cp.doconnect.dto.UserRegisterDTO; +import com.wipro.cp.doconnect.dto.UserResponseDTO; +import com.wipro.cp.doconnect.dto.UserUpdateDTO; +import com.wipro.cp.doconnect.entity.User; +import com.wipro.cp.doconnect.repository.UserRepository; + +@Service +public class UserServiceImp implements IUserService, UserDetailsService { + + @Autowired + private UserRepository userRepository; + + @Autowired + private PasswordEncoder bcryptEncoder; + + private UserResponseDTO convertUserToUserResponseDTO(User user) { + return new UserResponseDTO(user.getId(), user.getUsername(), user.getName(), user.getEmail(), user.getIsAdmin()); + } + + private StatusDTO convertOptionalUserToStatusDTOUserResponseDTO(Optional optionalUser, String statusMessage) { + if (optionalUser.isEmpty()) { + return new StatusDTO(statusMessage, false, null); + } + return new StatusDTO("", true, convertUserToUserResponseDTO(optionalUser.get())); + } + + public StatusDTO getUserByUsername(String username) { + return convertOptionalUserToStatusDTOUserResponseDTO(userRepository.findByUsername(username), "User with username " + username + " does not exist."); + } + + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + Optional optionalUser = userRepository.findByUsername(username); + if (optionalUser.isEmpty()) { + throw new UsernameNotFoundException("User not found with username: " + username); + } + User user = optionalUser.get(); + return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), new ArrayList<>()); + } + + @Override + public StatusDTO createUser(UserRegisterDTO userRegisterDTO) { + if (userRepository.existsByUsername(userRegisterDTO.getUsername())) { + return new StatusDTO("User with username " + userRegisterDTO.getUsername() + " already exists. Please create user with different username.", false, null); + } + if (userRepository.existsByEmail(userRegisterDTO.getEmail())) { + return new StatusDTO("User with email " + userRegisterDTO.getEmail() + " already exists. Please create user with different email.", false, null); + } + if (userRegisterDTO.getPassword().length() < 8) { + return new StatusDTO("Password should contain at least 8 characters.", false, null); + } + User user = new User(userRegisterDTO.getUsername(), userRegisterDTO.getName(), bcryptEncoder.encode(userRegisterDTO.getPassword()), userRegisterDTO.getEmail(), userRegisterDTO.getIsAdmin()); + return new StatusDTO("", true, convertUserToUserResponseDTO(userRepository.save(user))); + } + + @Override + public List getAllUsers() { + return userRepository.findAll().stream().map(user -> convertUserToUserResponseDTO(user)).collect(Collectors.toList()); + } + + @Override + public StatusDTO getUserById(Long id) { + return convertOptionalUserToStatusDTOUserResponseDTO(userRepository.findById(id), "User with ID " + id + " does not exist."); + } + + @Override + public StatusDTO updateUser(UserUpdateDTO userUpdateDTO, Long id) { + Optional optionalUser = userRepository.findById(id); + if (optionalUser.isEmpty()) { + return new StatusDTO("User with ID " + id + " does not exist.", false, null); + } + User user = optionalUser.get(); + user.setIsAdmin(userUpdateDTO.getIsAdmin()); + user.setName(userUpdateDTO.getName()); + return new StatusDTO("", true, convertUserToUserResponseDTO(userRepository.save(user))); + } + + @Override + public boolean deleteUserById(Long id) { + Optional optionalUser = userRepository.findById(id); + if (optionalUser.isEmpty()) { + return false; + } + userRepository.deleteById(id); + return true; + } + + @Override + public void deleteAllUsers() { + userRepository.deleteAllInBatch(); + } + +} From 0f6f0e1e7c56ac45def5caaa6d7666dc7e11e7be Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:45:38 +0530 Subject: [PATCH 202/464] Create QuestionServiceImp.java --- .../doconnect/service/QuestionServiceImp.java | 103 ++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/QuestionServiceImp.java diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/QuestionServiceImp.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/QuestionServiceImp.java new file mode 100644 index 0000000..804aa49 --- /dev/null +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/QuestionServiceImp.java @@ -0,0 +1,103 @@ +package com.wipro.cp.doconnect.service; + +import java.util.List; +import java.util.Optional; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import com.wipro.cp.doconnect.dto.EmailDTO; +import com.wipro.cp.doconnect.dto.QuestionRequestDTO; +import com.wipro.cp.doconnect.dto.QuestionResponseDTO; +import com.wipro.cp.doconnect.dto.QuestionUpdateDTO; +import com.wipro.cp.doconnect.dto.StatusDTO; +import com.wipro.cp.doconnect.entity.Question; +import com.wipro.cp.doconnect.repository.QuestionRepository; +import com.wipro.cp.doconnect.repository.UserRepository; +import com.wipro.cp.doconnect.util.Utilities; + +@Service +public class QuestionServiceImp implements IQuestionService { + + @Value("${enable-notification-emails:false}") + private boolean enableNotificationEmails; + + @Autowired + private QuestionRepository questionRepository; + + @Autowired + private UserRepository userRepository; + + @Autowired + private EmailServiceImp emailServiceImp; + + @Autowired + private Utilities utilities; + + @Override + public StatusDTO> getAllQuestions(String status, String search) { + if (search == null) { + if (status.equalsIgnoreCase("all")) { + return new StatusDTO>("", true, utilities.convertQuestionListToQuestionResponseDTOList(questionRepository.findAll())); + } + else if (status.equalsIgnoreCase("approved")) { + return new StatusDTO>("", true, utilities.convertQuestionListToQuestionResponseDTOList(questionRepository.findByIsApprovedTrue())); + } + else if (status.equalsIgnoreCase("unapproved")) { + return new StatusDTO>("", true, utilities.convertQuestionListToQuestionResponseDTOList(questionRepository.findByIsApprovedFalse())); + } + else { + return new StatusDTO>("Provided invalid status. Should be one of 'all', 'approved' or 'unapproved'.", false, null); + } + } + else { + if (status.equalsIgnoreCase("approved")) { + return new StatusDTO>("", true, utilities.convertQuestionListToQuestionResponseDTOList(questionRepository.findByQuestionContainingIgnoreCaseAndIsApprovedTrue(search))); + } + else { + return new StatusDTO>("Question search only works with 'approved' status.", false, null); + } + } + } + + @Override + public StatusDTO createQuestion(QuestionRequestDTO questionRequestDTO, String postedBy) { + Question question = new Question(questionRequestDTO.getQuestion(), questionRequestDTO.getTopic(), questionRequestDTO.getImages(), postedBy); + Question savedQuestion = questionRepository.save(question); + if (enableNotificationEmails) { + String[] recipients = utilities.getUserEmails(userRepository.findByIsAdminTrue()); + String subject = "Action Required: Approval needed for newly added question"; + String body = "Dear Admin,\n\nA new question has been added to DoConnect application. Please visit the application to either approve or delete the newly added question.\n\nDoConnect Bot\n\n\n\n\n\nAuto generated email. Please do not reply."; + emailServiceImp.sendNotificationEmail(new EmailDTO(recipients, subject, body)); + } + return new StatusDTO("", true, utilities.convertQuestionToQuestionResponseDTO(savedQuestion)); + } + + @Override + public StatusDTO updateQuestion(QuestionUpdateDTO questionUpdateDTO, Long questionId, String approvedBy) { + Optional optionalQuestion = questionRepository.findById(questionId); + if (optionalQuestion.isEmpty()) { + return new StatusDTO("Question with ID " + questionId + " does not exist.", false, null); + } + Question question = optionalQuestion.get(); + question.setIsApproved(questionUpdateDTO.getIsApproved()); + question.setApprovedBy(approvedBy); + return new StatusDTO("", true, utilities.convertQuestionToQuestionResponseDTO(questionRepository.save(question))); + } + + @Override + public StatusDTO deleteQuestionById(Long questionId) { + Optional optionalQuestion = questionRepository.findById(questionId); + if (optionalQuestion.isEmpty()) { + return new StatusDTO("Question with id " + questionId + " does not exist.", false, null); + } + Question question = optionalQuestion.get(); + if (question.getIsApproved()) { + return new StatusDTO("Cannot delete an approved question.", false, false); + } + questionRepository.delete(question); + return new StatusDTO("", true, true); + } + +} From 1da90395d5040e58d85f7925d34f751a149bf8cb Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:45:41 +0530 Subject: [PATCH 203/464] Create LogoutTokenServiceImp.java --- .../service/LogoutTokenServiceImp.java | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/LogoutTokenServiceImp.java diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/LogoutTokenServiceImp.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/LogoutTokenServiceImp.java new file mode 100644 index 0000000..6ae7b15 --- /dev/null +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/LogoutTokenServiceImp.java @@ -0,0 +1,42 @@ +package com.wipro.cp.doconnect.service; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.wipro.cp.doconnect.entity.LogoutToken; +import com.wipro.cp.doconnect.repository.LogoutTokenRepository; + +@Service +public class LogoutTokenServiceImp implements ILogoutTokenService { + + @Autowired + LogoutTokenRepository logoutTokenRepository; + + @Override + public boolean checkIfTokenExists(String token) { + return logoutTokenRepository.existsByToken(token); + } + + @Override + public LogoutToken createToken(LogoutToken logoutToken) { + return logoutTokenRepository.save(logoutToken); + } + + @Override + public List createTokens(List logoutTokenList) { + return logoutTokenRepository.saveAllAndFlush(logoutTokenList); + } + + @Override + public List getAllTokens() { + return logoutTokenRepository.findAll(); + } + + @Override + public void deleteAllTokens() { + logoutTokenRepository.deleteAllInBatch(); + } + +} From cfeb8cbb871065bf4fa2393d235c94a0bcf0a76c Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:45:43 +0530 Subject: [PATCH 204/464] Create IUserService.java --- .../cp/doconnect/service/IUserService.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IUserService.java diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IUserService.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IUserService.java new file mode 100644 index 0000000..92d81f8 --- /dev/null +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IUserService.java @@ -0,0 +1,19 @@ +package com.wipro.cp.doconnect.service; + +import java.util.List; + +import com.wipro.cp.doconnect.dto.StatusDTO; +import com.wipro.cp.doconnect.dto.UserRegisterDTO; +import com.wipro.cp.doconnect.dto.UserResponseDTO; +import com.wipro.cp.doconnect.dto.UserUpdateDTO; + +public interface IUserService { + + public StatusDTO createUser(UserRegisterDTO userRegisterDTO); + public List getAllUsers(); + public StatusDTO getUserById(Long id); + public StatusDTO updateUser(UserUpdateDTO userUpdateDTO, Long id); + public boolean deleteUserById(Long id); + public void deleteAllUsers(); + +} From 36f17e0d8a5ca56add3e87fba0163abd6f8d6426 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:45:46 +0530 Subject: [PATCH 205/464] Create IQuestionService.java --- .../cp/doconnect/service/IQuestionService.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IQuestionService.java diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IQuestionService.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IQuestionService.java new file mode 100644 index 0000000..01cc092 --- /dev/null +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IQuestionService.java @@ -0,0 +1,17 @@ +package com.wipro.cp.doconnect.service; + +import java.util.List; + +import com.wipro.cp.doconnect.dto.QuestionRequestDTO; +import com.wipro.cp.doconnect.dto.QuestionResponseDTO; +import com.wipro.cp.doconnect.dto.QuestionUpdateDTO; +import com.wipro.cp.doconnect.dto.StatusDTO; + +public interface IQuestionService { + + public StatusDTO> getAllQuestions(String status, String search); + public StatusDTO createQuestion(QuestionRequestDTO questionRequestDTO, String postedBy); + public StatusDTO updateQuestion(QuestionUpdateDTO questionUpdateDTO, Long questionId, String approvedBy); + public StatusDTO deleteQuestionById(Long questionId); + +} From 32a8ee0d1acdab663898e10b95883344501ffd77 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:45:49 +0530 Subject: [PATCH 206/464] Create ILogoutTokenService.java --- .../cp/doconnect/service/ILogoutTokenService.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/ILogoutTokenService.java diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/ILogoutTokenService.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/ILogoutTokenService.java new file mode 100644 index 0000000..9fb26fa --- /dev/null +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/ILogoutTokenService.java @@ -0,0 +1,15 @@ +package com.wipro.cp.doconnect.service; + +import java.util.List; + +import com.wipro.cp.doconnect.entity.LogoutToken; + +public interface ILogoutTokenService { + + public boolean checkIfTokenExists(String token); + public LogoutToken createToken(LogoutToken logoutToken); + public List createTokens(List logoutTokenList); + public List getAllTokens(); + public void deleteAllTokens(); + +} From 55528fd07e4454946d5ad446ac67e34e6ec6617e Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:45:51 +0530 Subject: [PATCH 207/464] Create IEmailService.java --- .../com/wipro/cp/doconnect/service/IEmailService.java | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IEmailService.java diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IEmailService.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IEmailService.java new file mode 100644 index 0000000..3237959 --- /dev/null +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IEmailService.java @@ -0,0 +1,9 @@ +package com.wipro.cp.doconnect.service; + +import com.wipro.cp.doconnect.dto.EmailDTO; + +public interface IEmailService { + + boolean sendNotificationEmail(EmailDTO emailDTO); + +} From eeca3c788baab66e5b000e6931a0760aa15874a5 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:45:53 +0530 Subject: [PATCH 208/464] Create IAnswerService.java --- .../cp/doconnect/service/IAnswerService.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IAnswerService.java diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IAnswerService.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IAnswerService.java new file mode 100644 index 0000000..1a1a78f --- /dev/null +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IAnswerService.java @@ -0,0 +1,18 @@ +package com.wipro.cp.doconnect.service; + +import java.util.List; + +import com.wipro.cp.doconnect.dto.AnswerRequestDTO; +import com.wipro.cp.doconnect.dto.AnswerResponseDTO; +import com.wipro.cp.doconnect.dto.AnswerUpdateDTO; +import com.wipro.cp.doconnect.dto.StatusDTO; + +public interface IAnswerService { + + public StatusDTO> getAllAnswers(String answerStatus); + public StatusDTO> getAllAnswersForQuestionId(Long questionId, String answerStatus); + public StatusDTO createAnswerForQuestionId(Long questionId, AnswerRequestDTO answerRequestDTO, String postedBy); + public StatusDTO updateAnswerForQuestionId(Long questionId, Long answerId, AnswerUpdateDTO answerUpdateDTO, String approvedBy); + public StatusDTO deleteAnswerForQuestionById(Long questionId, Long answerId); + +} From 33995953d7d22b335841d3c33aefd952541a9e5a Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:45:55 +0530 Subject: [PATCH 209/464] Create EmailServiceImp.java --- .../cp/doconnect/service/EmailServiceImp.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/EmailServiceImp.java diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/EmailServiceImp.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/EmailServiceImp.java new file mode 100644 index 0000000..f77422c --- /dev/null +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/EmailServiceImp.java @@ -0,0 +1,37 @@ +package com.wipro.cp.doconnect.service; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.mail.SimpleMailMessage; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.stereotype.Service; + +import com.wipro.cp.doconnect.dto.EmailDTO; + +@Service +public class EmailServiceImp implements IEmailService { + + @Autowired + private JavaMailSender javaMailSender; + + @Value("${spring.mail.username}") + private String sender; + + @Override + public boolean sendNotificationEmail(EmailDTO emailDTO) { + try { + SimpleMailMessage simpleMailMessage = new SimpleMailMessage(); + simpleMailMessage.setFrom(sender); + simpleMailMessage.setTo(emailDTO.getRecipients()); + simpleMailMessage.setSubject(emailDTO.getSubject()); + simpleMailMessage.setText(emailDTO.getBody()); + javaMailSender.send(simpleMailMessage); + return true; + } + catch (Exception e) { + System.out.println(e.toString()); + return false; + } + } + +} From c5bfac83a5cfbb3a3ad5f833bac3cdb65857eb3d Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:45:58 +0530 Subject: [PATCH 210/464] Create AnswerServiceImp.java --- .../doconnect/service/AnswerServiceImp.java | 126 ++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/AnswerServiceImp.java diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/AnswerServiceImp.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/AnswerServiceImp.java new file mode 100644 index 0000000..9a07b25 --- /dev/null +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/AnswerServiceImp.java @@ -0,0 +1,126 @@ +package com.wipro.cp.doconnect.service; + +import java.util.List; +import java.util.Optional; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import com.wipro.cp.doconnect.dto.AnswerRequestDTO; +import com.wipro.cp.doconnect.dto.AnswerResponseDTO; +import com.wipro.cp.doconnect.dto.AnswerUpdateDTO; +import com.wipro.cp.doconnect.dto.EmailDTO; +import com.wipro.cp.doconnect.dto.StatusDTO; +import com.wipro.cp.doconnect.entity.Answer; +import com.wipro.cp.doconnect.entity.Question; +import com.wipro.cp.doconnect.repository.AnswerRepository; +import com.wipro.cp.doconnect.repository.QuestionRepository; +import com.wipro.cp.doconnect.repository.UserRepository; +import com.wipro.cp.doconnect.util.Utilities; + +@Service +public class AnswerServiceImp implements IAnswerService { + + @Value("${enable-notification-emails:false}") + private boolean enableNotificationEmails; + + @Autowired + private AnswerRepository answerRepository; + + @Autowired + private QuestionRepository questionRepository; + + @Autowired + private UserRepository userRepository; + + @Autowired + private EmailServiceImp emailServiceImp; + + @Autowired + private Utilities utilities; + + @Override + public StatusDTO> getAllAnswers(String answerStatus) { + if (answerStatus.equalsIgnoreCase("all")) { + return new StatusDTO>("", true, utilities.convertAnswerListToAnswerResponseDTOList(answerRepository.findAll())); + } + else if (answerStatus.equalsIgnoreCase("approved")) { + return new StatusDTO>("", true, utilities.convertAnswerListToAnswerResponseDTOList(answerRepository.findByIsApprovedTrue())); + } + else if (answerStatus.equalsIgnoreCase("unapproved")) { + return new StatusDTO>("", true, utilities.convertAnswerListToAnswerResponseDTOList(answerRepository.findByIsApprovedFalse())); + } + else { + return new StatusDTO>("Provided invalid status. Should be one of 'all', 'approved' or 'unapproved'.", false, null); + } + } + + @Override + public StatusDTO> getAllAnswersForQuestionId(Long questionId, String answerStatus) { + if (answerStatus.equalsIgnoreCase("all")) { + return new StatusDTO>("", true, utilities.convertAnswerListToAnswerResponseDTOList(answerRepository.findByQuestionId(questionId))); + } + else if (answerStatus.equalsIgnoreCase("approved")) { + return new StatusDTO>("", true, utilities.convertAnswerListToAnswerResponseDTOList(answerRepository.findByQuestionIdAndIsApprovedTrue(questionId))); + } + else if (answerStatus.equalsIgnoreCase("unapproved")) { + return new StatusDTO>("", true, utilities.convertAnswerListToAnswerResponseDTOList(answerRepository.findByQuestionIdAndIsApprovedFalse(questionId))); + } + else { + return new StatusDTO>("Provided invalid status. Should be one of 'all', 'approved' or 'unapproved'.", false, null); + } + } + + @Override + public StatusDTO createAnswerForQuestionId(Long questionId, AnswerRequestDTO answerRequestDTO, String postedBy) { + Optional optionalQuestion = questionRepository.findById(questionId); + if (optionalQuestion.isEmpty()) { + return new StatusDTO("Question with id " + questionId + " does not exist.", false, null); + } + Answer answer = new Answer(answerRequestDTO.getAnswer(), answerRequestDTO.getImages(), postedBy, optionalQuestion.get()); + Answer savedAnswer = answerRepository.save(answer); + if (enableNotificationEmails) { + String[] recipients = utilities.getUserEmails(userRepository.findByIsAdminTrue()); + String subject = "Action Required: Approval needed for newly added answer"; + String body = "Dear Admin,\n\nA new answer has been added to DoConnect application for question - '" + optionalQuestion.get().getQuestion() + "'. Please visit the application to either approve or delete the newly added question.\n\nDoConnect Bot\n\n\n\n\n\nAuto generated email. Please do not reply."; + emailServiceImp.sendNotificationEmail(new EmailDTO(recipients, subject, body)); + } + return new StatusDTO("", true, utilities.convertAnswerToAnswerResponseDTO(savedAnswer)); + } + + @Override + public StatusDTO updateAnswerForQuestionId(Long questionId, Long answerId, AnswerUpdateDTO answerUpdateDTO, String approvedBy) { + boolean questionExists = questionRepository.existsById(questionId); + if (!questionExists) { + return new StatusDTO("Question with id " + questionId + " does not exist.", false, null); + } + Optional optionalAnswer = answerRepository.findByIdAndQuestionId(answerId, questionId); + if (optionalAnswer.isEmpty()) { + return new StatusDTO("Answer with id " + answerId + " does not exist for question with id " + questionId + ".", false, null); + } + Answer answer = optionalAnswer.get(); + answer.setIsApproved(answerUpdateDTO.getIsApproved()); + answer.setApprovedBy(approvedBy); + return new StatusDTO("", true, utilities.convertAnswerToAnswerResponseDTO(answerRepository.save(answer))); + } + + @Override + public StatusDTO deleteAnswerForQuestionById(Long questionId, Long answerId) { + boolean questionExists = questionRepository.existsById(questionId); + if (!questionExists) { + return new StatusDTO("Question with id " + questionId + " does not exist.", false, null); + } + Optional optionalAnswer = answerRepository.findByIdAndQuestionId(answerId, questionId); + if (optionalAnswer.isEmpty()) { + return new StatusDTO("Answer with id " + answerId + " does not exist for question with id " + questionId + ".", false, null); + } + Answer answer = optionalAnswer.get(); + if (answer.getIsApproved()) { + return new StatusDTO("Cannot delete an approved answer.", false, false); + } + answerRepository.delete(answer); + return new StatusDTO("", true, true); + } + +} From b25a74dc1dc1bb2def95e57308944fb79c1d864e Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:46:00 +0530 Subject: [PATCH 211/464] Create UserRepository.java --- .../doconnect/repository/UserRepository.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/UserRepository.java diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/UserRepository.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/UserRepository.java new file mode 100644 index 0000000..fa6761b --- /dev/null +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/UserRepository.java @@ -0,0 +1,22 @@ +package com.wipro.cp.doconnect.repository; + +import java.util.List; +import java.util.Optional; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import com.wipro.cp.doconnect.entity.User; + +@Repository +public interface UserRepository extends JpaRepository { + + Optional findByUsername(String username); + + boolean existsByUsername(String username); + + boolean existsByEmail(String email); + + List findByIsAdminTrue(); + +} From 5c2f916561e68e219cdcfc03c2b21791e51d70ec Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:46:01 +0530 Subject: [PATCH 212/464] Create QuestionRepository.java --- .../repository/QuestionRepository.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/QuestionRepository.java diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/QuestionRepository.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/QuestionRepository.java new file mode 100644 index 0000000..2d04f52 --- /dev/null +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/QuestionRepository.java @@ -0,0 +1,19 @@ +package com.wipro.cp.doconnect.repository; + +import java.util.List; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import com.wipro.cp.doconnect.entity.Question; + +@Repository +public interface QuestionRepository extends JpaRepository { + + boolean existsById(Long id); + + List findByIsApprovedTrue(); + List findByIsApprovedFalse(); + + List findByQuestionContainingIgnoreCaseAndIsApprovedTrue(String question); +} From 33a5b5d43b28793ccd4693846b01ebd8899cc91c Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:46:03 +0530 Subject: [PATCH 213/464] Create LogoutTokenRepository.java --- .../repository/LogoutTokenRepository.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/LogoutTokenRepository.java diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/LogoutTokenRepository.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/LogoutTokenRepository.java new file mode 100644 index 0000000..d3d46c7 --- /dev/null +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/LogoutTokenRepository.java @@ -0,0 +1,17 @@ +package com.wipro.cp.doconnect.repository; + +import java.util.Optional; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import com.wipro.cp.doconnect.entity.LogoutToken; + +@Repository +public interface LogoutTokenRepository extends JpaRepository { + + Optional findByToken(String token); + + boolean existsByToken(String token); + +} From 7c12afc3b09a1c41113b10851d7ad92d2ad92806 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:46:05 +0530 Subject: [PATCH 214/464] Create AnswerRepository.java --- .../repository/AnswerRepository.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/AnswerRepository.java diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/AnswerRepository.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/AnswerRepository.java new file mode 100644 index 0000000..a2f89c0 --- /dev/null +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/AnswerRepository.java @@ -0,0 +1,23 @@ +package com.wipro.cp.doconnect.repository; + +import java.util.List; +import java.util.Optional; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import com.wipro.cp.doconnect.entity.Answer; + +@Repository +public interface AnswerRepository extends JpaRepository { + + List findByIsApprovedTrue(); + List findByIsApprovedFalse(); + + List findByQuestionId(Long questionId); + Optional findByIdAndQuestionId(Long answerId, Long questionId); + + List findByQuestionIdAndIsApprovedTrue(Long questionId); + List findByQuestionIdAndIsApprovedFalse(Long questionId); + +} From e47c23d10423179bd231684f47f27381b5ebe61d Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:46:08 +0530 Subject: [PATCH 215/464] Create AuthorizationInterceptor.java --- .../interceptor/AuthorizationInterceptor.java | 211 ++++++++++++++++++ 1 file changed, 211 insertions(+) create mode 100644 do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/interceptor/AuthorizationInterceptor.java diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/interceptor/AuthorizationInterceptor.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/interceptor/AuthorizationInterceptor.java new file mode 100644 index 0000000..e1172c8 --- /dev/null +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/interceptor/AuthorizationInterceptor.java @@ -0,0 +1,211 @@ +package com.wipro.cp.doconnect.interceptor; + +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.web.servlet.HandlerInterceptor; + +import com.wipro.cp.doconnect.component.JwtTokenUtilityComponent; +import com.wipro.cp.doconnect.dto.StatusDTO; +import com.wipro.cp.doconnect.dto.UserResponseDTO; +import com.wipro.cp.doconnect.service.UserServiceImp; + +public class AuthorizationInterceptor implements HandlerInterceptor { + + @Autowired + private UserServiceImp userServiceImp; + + @Autowired + private JwtTokenUtilityComponent jwtTokenUtilityComponent; + + private String getParameterValue(Map parameterMap, String key) { + String[] value = parameterMap.getOrDefault(key, null); + if ((value == null) || (value.length != 1) || value[0].length() == 0) { + return null; + } + return value[0]; + } + + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + final String currentMethod = request.getMethod(); + final String currentURI = request.getRequestURI().toString(); + final Map parameterMap = request.getParameterMap(); + if (currentURI.equalsIgnoreCase("/api/v1/questions") && HttpMethod.GET.matches(currentMethod)) { + if (!parameterMap.containsKey("status") && !parameterMap.containsKey("search")) { + return true; + } + } + else if (currentURI.equalsIgnoreCase("/api/v1/register") || currentURI.equalsIgnoreCase("/api/v1/login")) { + if (HttpMethod.POST.matches(currentMethod)) { + return true; + } + response.sendError(HttpStatus.FORBIDDEN.value()); + return false; + } + final String requestTokenHeader = request.getHeader("Authorization"); + String username = null; + String jwtToken = null; + // JWT Token is in the form "Bearer token". Remove Bearer word and get only the token + if (requestTokenHeader != null && requestTokenHeader.startsWith("Bearer ")) { + jwtToken = requestTokenHeader.substring(7); + try { + username = jwtTokenUtilityComponent.getUsernameFromToken(jwtToken); + } catch (Exception e) { + System.out.println("Exception " + e.toString()); + } + } + if (username != null) { + StatusDTO userStatus = userServiceImp.getUserByUsername(username); + if (!userStatus.getIsValid()) { + response.sendError(HttpStatus.FORBIDDEN.value()); + return false; + } + UserResponseDTO userResponseDTO = userStatus.getObject(); + boolean isUserAdmin = userResponseDTO.getIsAdmin(); + if (currentURI.equalsIgnoreCase("/api/v1/signout") && HttpMethod.GET.matches(currentMethod)) { + return true; + } + else if (currentURI.equalsIgnoreCase("/api/v1/answers") && HttpMethod.GET.matches(currentMethod) && isUserAdmin) { + return true; + } + else if ( + currentURI.toLowerCase().startsWith("/api/v1/users") && + (HttpMethod.GET.matches(currentMethod) || HttpMethod.POST.matches(currentMethod) || HttpMethod.PUT.matches(currentMethod) || HttpMethod.DELETE.matches(currentMethod)) + ) { + if (isUserAdmin) { + return true; + } + response.sendError(HttpStatus.FORBIDDEN.value()); + return false; + } + else if ( + currentURI.toLowerCase().startsWith("/api/v1/images") && + (HttpMethod.GET.matches(currentMethod) || HttpMethod.POST.matches(currentMethod)) && !isUserAdmin + ) { + return true; + } + else if (currentURI.toLowerCase().startsWith("/api/v1/questions")) { + String[] uriParts = currentURI.split("/"); + if (uriParts.length == 4) { + if (uriParts[3].equalsIgnoreCase("questions")) { + if (HttpMethod.POST.matches(currentMethod) && !isUserAdmin) { + return true; + } + else if (HttpMethod.GET.matches(currentMethod)) { + String statusValue = getParameterValue(parameterMap, "status"); + String searchValue = getParameterValue(parameterMap, "search"); + if (searchValue == null && statusValue != null) { + if (statusValue.equalsIgnoreCase("approved")) { + return true; + } + else if ((statusValue.equalsIgnoreCase("unapproved") || statusValue.equalsIgnoreCase("all")) && isUserAdmin) { + return true; + } + else { + response.sendError(HttpStatus.FORBIDDEN.value()); + return false; + } + } + else if (searchValue != null && statusValue == null) { + if (!isUserAdmin) { + return true; + } + else { + response.sendError(HttpStatus.FORBIDDEN.value()); + return false; + } + } + else { + if (statusValue.equalsIgnoreCase("approved") && !isUserAdmin) { + return true; + } + else { + response.sendError(HttpStatus.FORBIDDEN.value()); + return false; + } + } + } + else { + response.sendError(HttpStatus.FORBIDDEN.value()); + return false; + } + } + else { + response.sendError(HttpStatus.FORBIDDEN.value()); + return false; + } + } + else if (uriParts.length == 5) { + if ( + uriParts[3].equalsIgnoreCase("questions") && + (HttpMethod.PUT.matches(currentMethod) || HttpMethod.DELETE.matches(currentMethod)) && + isUserAdmin + ) { + return true; + } + else { + response.sendError(HttpStatus.FORBIDDEN.value()); + return false; + } + } + else if (uriParts.length == 6) { + if (uriParts[3].equalsIgnoreCase("questions") && uriParts[5].equalsIgnoreCase("answers")) { + if (HttpMethod.POST.matches(currentMethod) && !isUserAdmin) { + return true; + } + else if (HttpMethod.GET.matches(currentMethod)) { + String statusValue = getParameterValue(parameterMap, "status"); + if (statusValue == null || statusValue.equalsIgnoreCase("approved")) { + return true; + } + else if ((statusValue.equalsIgnoreCase("all") || statusValue.equalsIgnoreCase("unapproved")) && isUserAdmin) { + return true; + } + else { + response.sendError(HttpStatus.FORBIDDEN.value()); + return false; + } + } + else { + response.sendError(HttpStatus.FORBIDDEN.value()); + return false; + } + } + else { + response.sendError(HttpStatus.FORBIDDEN.value()); + return false; + } + } + else if (uriParts.length == 7) { + if ( + uriParts[3].equalsIgnoreCase("questions") && uriParts[5].equalsIgnoreCase("answers") && + (HttpMethod.PUT.matches(currentMethod) || HttpMethod.DELETE.matches(currentMethod)) && + isUserAdmin + ) { + return true; + } + else { + response.sendError(HttpStatus.FORBIDDEN.value()); + return false; + } + } + else { + response.sendError(HttpStatus.FORBIDDEN.value()); + return false; + } + } + else { + response.sendError(HttpStatus.FORBIDDEN.value()); + return false; + } + } + response.sendError(HttpStatus.FORBIDDEN.value()); + return false; + } + +} From 9db1fa402af9824c488d03f6e795610792e93103 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:46:10 +0530 Subject: [PATCH 216/464] Create User.java --- .../com/wipro/cp/doconnect/entity/User.java | 109 ++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/User.java diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/User.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/User.java new file mode 100644 index 0000000..236c6c1 --- /dev/null +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/User.java @@ -0,0 +1,109 @@ +package com.wipro.cp.doconnect.entity; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; +import javax.validation.constraints.Size; + +@Entity +@Table(name="users") +public class User { + + @Id + @GeneratedValue(strategy=GenerationType.IDENTITY) + private Long id; + + @NotNull + @NotEmpty + @Size(max = 512) + @Column(unique = true) + private String username; + + @NotNull + @NotEmpty + @Size(min = 8, max = 128) + private String password; + + @NotNull + @NotEmpty + @Size(max = 512) + private String name; + + @NotNull + @NotEmpty + @Pattern(regexp="[A-Za-z0-9._%-+]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}") + @Size(max = 512) + @Column(unique = true) + private String email; + + @NotNull + private boolean isAdmin; + + 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 String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public boolean getIsAdmin() { + return isAdmin; + } + + public void setIsAdmin(boolean isAdmin) { + this.isAdmin = isAdmin; + } + + public Long getId() { + return id; + } + + public User(@NotNull @NotEmpty @Size(max = 512) String username, + @NotNull @NotEmpty @Size(max = 512) String name, + @NotNull @NotEmpty @Size(min = 8, max = 128) String password, + @NotNull @NotEmpty @Pattern(regexp = "[A-Za-z0-9._%-+]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}") @Size(max = 512) String email, + @NotNull boolean isAdmin) { + super(); + this.username = username; + this.password = password; + this.name = name; + this.email = email; + this.isAdmin = isAdmin; + } + + public User() { + super(); + } + +} From c0e09d4464590d71ff929b92517bd5365e54c81d Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:46:13 +0530 Subject: [PATCH 217/464] Create Question.java --- .../wipro/cp/doconnect/entity/Question.java | 125 ++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Question.java diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Question.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Question.java new file mode 100644 index 0000000..c325979 --- /dev/null +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Question.java @@ -0,0 +1,125 @@ +package com.wipro.cp.doconnect.entity; + +import java.util.Date; +import java.util.List; + +import javax.persistence.Column; +import javax.persistence.Convert; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +import org.hibernate.annotations.CreationTimestamp; + +import com.wipro.cp.doconnect.util.ListToStringConverter; + +@Entity +@Table(name="questions") +public class Question { + + @Id + @GeneratedValue(strategy=GenerationType.IDENTITY) + private long id; + + @NotNull + @NotEmpty + @Size(max = 1024) + private String question; + + @NotNull + @NotEmpty + private String topic; + + @Column + @Convert(converter = ListToStringConverter.class) + private List images; + + @NotNull + @NotEmpty + private String postedBy; + + @Column(nullable = false, updatable = false) + @CreationTimestamp + private Date postedAt; + + private String approvedBy; + + private boolean isApproved; + + public String getQuestion() { + return question; + } + + public void setQuestion(String question) { + this.question = question; + } + + public String getTopic() { + return topic; + } + + public void setTopic(String topic) { + this.topic = topic; + } + + public List getImages() { + return images; + } + + public void setImages(List images) { + this.images = images; + } + + public String getPostedBy() { + return postedBy; + } + + public void setPostedBy(String postedBy) { + this.postedBy = postedBy; + } + + public String getApprovedBy() { + return approvedBy; + } + + public void setApprovedBy(String approvedBy) { + this.approvedBy = approvedBy; + } + + public boolean getIsApproved() { + return isApproved; + } + + public void setIsApproved(boolean isApproved) { + this.isApproved = isApproved; + } + + public long getId() { + return id; + } + + public Date getPostedAt() { + return postedAt; + } + + public Question(@NotNull @NotEmpty String question, @NotNull @NotEmpty String topic, List images, + @NotNull @NotEmpty String postedBy) { + super(); + this.question = question; + this.topic = topic; + this.images = images; + this.postedBy = postedBy; + this.approvedBy = null; + this.isApproved = false; + } + + public Question() { + super(); + } + +} From 9cb32204b0393af65227d513378b0aef28524cde Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:46:16 +0530 Subject: [PATCH 218/464] Create LogoutToken.java --- .../cp/doconnect/entity/LogoutToken.java | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/LogoutToken.java diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/LogoutToken.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/LogoutToken.java new file mode 100644 index 0000000..f8b9ab3 --- /dev/null +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/LogoutToken.java @@ -0,0 +1,46 @@ +package com.wipro.cp.doconnect.entity; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +@Entity +@Table(name = "logout_token") +public class LogoutToken { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @NotNull + @NotEmpty + @Size(max = 512) + private String token; + + public Long getId() { + return id; + } + + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; + } + + public LogoutToken(@NotNull @NotEmpty String token) { + super(); + this.token = token; + } + + public LogoutToken() { + super(); + } + +} From 035e798bee69157cf660045a74b4bca05d24b1f0 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:46:19 +0530 Subject: [PATCH 219/464] Create Answer.java --- .../com/wipro/cp/doconnect/entity/Answer.java | 132 ++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Answer.java diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Answer.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Answer.java new file mode 100644 index 0000000..44c4c41 --- /dev/null +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Answer.java @@ -0,0 +1,132 @@ +package com.wipro.cp.doconnect.entity; + +import java.util.Date; +import java.util.List; + +import javax.persistence.Column; +import javax.persistence.Convert; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +import org.hibernate.annotations.CreationTimestamp; +import org.hibernate.annotations.OnDelete; +import org.hibernate.annotations.OnDeleteAction; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.wipro.cp.doconnect.util.ListToStringConverter; + +@Entity +@Table(name="answers") +public class Answer { + + @Id + @GeneratedValue(strategy=GenerationType.IDENTITY) + private long id; + + @NotNull + @NotEmpty + @Size(max = 1024) + private String answer; + + @Column + @Convert(converter = ListToStringConverter.class) + private List images; + + @NotNull + @NotEmpty + private String postedBy; + + @Column(nullable = false, updatable = false) + @CreationTimestamp + private Date postedAt; + + private String approvedBy; + + private boolean isApproved; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "question_id", nullable = false) + @OnDelete(action = OnDeleteAction.CASCADE) + @JsonIgnore + private Question question; + + public String getAnswer() { + return answer; + } + + public void setAnswer(String answer) { + this.answer = answer; + } + + public List getImages() { + return images; + } + + public void setImages(List images) { + this.images = images; + } + + public boolean getIsApproved() { + return isApproved; + } + + public void setIsApproved(boolean isApproved) { + this.isApproved = isApproved; + } + + public String getPostedBy() { + return postedBy; + } + + public void setPostedBy(String postedBy) { + this.postedBy = postedBy; + } + + public String getApprovedBy() { + return approvedBy; + } + + public void setApprovedBy(String approvedBy) { + this.approvedBy = approvedBy; + } + + public long getId() { + return id; + } + + public Date getPostedAt() { + return postedAt; + } + + public Question getQuestion() { + return question; + } + + public void setQuestion(Question question) { + this.question = question; + } + + public Answer(@NotNull @NotEmpty String answer, List images, @NotNull @NotEmpty String postedBy, Question question) { + super(); + this.answer = answer; + this.images = images; + this.postedBy = postedBy; + this.approvedBy = null; + this.isApproved = false; + this.question = question; + } + + public Answer() { + super(); + } + +} From ee0f93a24b0094882dd45969bc7702379e3c3e40 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:46:21 +0530 Subject: [PATCH 220/464] Create UserUpdateDTO.java --- .../wipro/cp/doconnect/dto/UserUpdateDTO.java | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserUpdateDTO.java diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserUpdateDTO.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserUpdateDTO.java new file mode 100644 index 0000000..93b6b37 --- /dev/null +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserUpdateDTO.java @@ -0,0 +1,31 @@ +package com.wipro.cp.doconnect.dto; + +public class UserUpdateDTO { + + private String name; + private boolean isAdmin; + + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public boolean getIsAdmin() { + return isAdmin; + } + public void setIsAdmin(boolean isAdmin) { + this.isAdmin = isAdmin; + } + + public UserUpdateDTO(String name, boolean isAdmin) { + super(); + this.name = name; + this.isAdmin = isAdmin; + } + + public UserUpdateDTO() { + super(); + } + +} From 01ca1c5743ed717d7bb3d96ab7b61e30b75569fe Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:46:23 +0530 Subject: [PATCH 221/464] Create UserResponseDTO.java --- .../cp/doconnect/dto/UserResponseDTO.java | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserResponseDTO.java diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserResponseDTO.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserResponseDTO.java new file mode 100644 index 0000000..7499c2a --- /dev/null +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserResponseDTO.java @@ -0,0 +1,36 @@ +package com.wipro.cp.doconnect.dto; + +public class UserResponseDTO { + + private Long id; + private String username; + private String name; + private String email; + private boolean isAdmin; + + public Long getId() { + return id; + } + public String getUsername() { + return username; + } + public String getName() { + return name; + } + public String getEmail() { + return email; + } + public boolean getIsAdmin() { + return isAdmin; + } + + public UserResponseDTO(Long id, String username, String name, String email, boolean isAdmin) { + super(); + this.id = id; + this.username = username; + this.name = name; + this.email = email; + this.isAdmin = isAdmin; + } + +} From 2cfa1a740d8b537ce24ad475218bb94f5270baa1 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:46:25 +0530 Subject: [PATCH 222/464] Create UserRegisterDTO.java --- .../cp/doconnect/dto/UserRegisterDTO.java | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserRegisterDTO.java diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserRegisterDTO.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserRegisterDTO.java new file mode 100644 index 0000000..328a164 --- /dev/null +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserRegisterDTO.java @@ -0,0 +1,54 @@ +package com.wipro.cp.doconnect.dto; + +public class UserRegisterDTO { + + private String username; + private String name; + private String email; + private String password; + private boolean isAdmin; + + public String getUsername() { + return username; + } + public void setUsername(String username) { + this.username = username; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public String getEmail() { + return email; + } + public void setEmail(String email) { + this.email = email; + } + public String getPassword() { + return password; + } + public void setPassword(String password) { + this.password = password; + } + public boolean getIsAdmin() { + return isAdmin; + } + public void setIsAdmin(boolean isAdmin) { + this.isAdmin = isAdmin; + } + + public UserRegisterDTO(String username, String name, String email, String password, boolean isAdmin) { + super(); + this.username = username; + this.name = name; + this.email = email; + this.password = password; + this.isAdmin = isAdmin; + } + public UserRegisterDTO() { + super(); + } + +} From 33973d2678ab18c39c9a44b1cc57b453226e93d0 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:46:29 +0530 Subject: [PATCH 223/464] Create UserLoginResponseDTO.java --- .../doconnect/dto/UserLoginResponseDTO.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserLoginResponseDTO.java diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserLoginResponseDTO.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserLoginResponseDTO.java new file mode 100644 index 0000000..b246cd2 --- /dev/null +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserLoginResponseDTO.java @@ -0,0 +1,24 @@ +package com.wipro.cp.doconnect.dto; + +import java.io.Serializable; + +public class UserLoginResponseDTO implements Serializable { + + private static final long serialVersionUID = -8091879091924046844L; + private final String jwttoken; + private final String tokenType; + + public UserLoginResponseDTO(String jwttoken, String tokenType) { + this.jwttoken = jwttoken; + this.tokenType = tokenType; + } + + public String getToken() { + return this.jwttoken; + } + + public String getTokenType() { + return tokenType; + } + +} From e612d43717a22becf8fc262535635464c92b9da7 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:46:31 +0530 Subject: [PATCH 224/464] Create UserLoginRequestDTO.java --- .../cp/doconnect/dto/UserLoginRequestDTO.java | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserLoginRequestDTO.java diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserLoginRequestDTO.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserLoginRequestDTO.java new file mode 100644 index 0000000..aa27e28 --- /dev/null +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/UserLoginRequestDTO.java @@ -0,0 +1,35 @@ +package com.wipro.cp.doconnect.dto; + +import java.io.Serializable; + +public class UserLoginRequestDTO implements Serializable { + + private static final long serialVersionUID = 5926468583005150707L; + + private String username; + private String password; + + public UserLoginRequestDTO() {} + + public UserLoginRequestDTO(String username, String password) { + this.setUsername(username); + this.setPassword(password); + } + + public String getUsername() { + return this.username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return this.password; + } + + public void setPassword(String password) { + this.password = password; + } + +} From 68660890c0891f8648fa35c5630e8e32defa8e4d Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:46:34 +0530 Subject: [PATCH 225/464] Create StatusDTO.java --- .../com/wipro/cp/doconnect/dto/StatusDTO.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/StatusDTO.java diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/StatusDTO.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/StatusDTO.java new file mode 100644 index 0000000..4f1d7de --- /dev/null +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/StatusDTO.java @@ -0,0 +1,26 @@ +package com.wipro.cp.doconnect.dto; + +public class StatusDTO { + + private String statusMessage; + private boolean isValid; + private T object; + + public String getStatusMessage() { + return statusMessage; + } + public boolean getIsValid() { + return isValid; + } + public T getObject() { + return object; + } + + public StatusDTO(String statusMessage, boolean isValid, T object) { + super(); + this.statusMessage = statusMessage; + this.isValid = isValid; + this.object = object; + } + +} From 8dcaf781e9e24217b2b96a6ed8ea56e78aa5499f Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:46:36 +0530 Subject: [PATCH 226/464] Create QuestionUpdateDTO.java --- .../cp/doconnect/dto/QuestionUpdateDTO.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/QuestionUpdateDTO.java diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/QuestionUpdateDTO.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/QuestionUpdateDTO.java new file mode 100644 index 0000000..92e199a --- /dev/null +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/QuestionUpdateDTO.java @@ -0,0 +1,24 @@ +package com.wipro.cp.doconnect.dto; + +public class QuestionUpdateDTO { + + private boolean isApproved; + + public boolean getIsApproved() { + return isApproved; + } + + public void setIsApproved(boolean isApproved) { + this.isApproved = isApproved; + } + + public QuestionUpdateDTO(boolean isApproved) { + super(); + this.isApproved = isApproved; + } + + public QuestionUpdateDTO() { + super(); + } + +} From 32a067922197f201b386f40f210bd9b0596bf00b Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:46:39 +0530 Subject: [PATCH 227/464] Create QuestionResponseDTO.java --- .../cp/doconnect/dto/QuestionResponseDTO.java | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/QuestionResponseDTO.java diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/QuestionResponseDTO.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/QuestionResponseDTO.java new file mode 100644 index 0000000..8eee9c3 --- /dev/null +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/QuestionResponseDTO.java @@ -0,0 +1,59 @@ +package com.wipro.cp.doconnect.dto; + +import java.util.Date; +import java.util.List; + +public class QuestionResponseDTO { + + private long id; + private String question; + private String topic; + private List images; + private String postedBy; + private Date postedAt; + private String approvedBy; + private boolean isApproved; + + public long getId() { + return id; + } + public String getQuestion() { + return question; + } + public String getTopic() { + return topic; + } + public List getImages() { + return images; + } + public String getPostedBy() { + return postedBy; + } + public Date getPostedAt() { + return postedAt; + } + public String getApprovedBy() { + return approvedBy; + } + public boolean getIsApproved() { + return isApproved; + } + + public QuestionResponseDTO(long id, String question, String topic, List images, String postedBy, + Date postedAt, String approvedBy, boolean isApproved) { + super(); + this.id = id; + this.question = question; + this.topic = topic; + this.images = images; + this.postedBy = postedBy; + this.postedAt = postedAt; + this.approvedBy = approvedBy; + this.isApproved = isApproved; + } + + public QuestionResponseDTO() { + super(); + } + +} From c82bfefa831aecbc6cd5033cd09e39e0fcd90205 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:46:41 +0530 Subject: [PATCH 228/464] Create QuestionRequestDTO.java --- .../cp/doconnect/dto/QuestionRequestDTO.java | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/QuestionRequestDTO.java diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/QuestionRequestDTO.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/QuestionRequestDTO.java new file mode 100644 index 0000000..ccb1db1 --- /dev/null +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/QuestionRequestDTO.java @@ -0,0 +1,41 @@ +package com.wipro.cp.doconnect.dto; + +import java.util.List; + +public class QuestionRequestDTO { + + private String question; + private String topic; + private List images; + + public String getQuestion() { + return question; + } + public void setQuestion(String question) { + this.question = question; + } + public String getTopic() { + return topic; + } + public void setTopic(String topic) { + this.topic = topic; + } + public List getImages() { + return images; + } + public void setImages(List images) { + this.images = images; + } + + public QuestionRequestDTO(String question, String topic, List images) { + super(); + this.question = question; + this.topic = topic; + this.images = images; + } + + public QuestionRequestDTO() { + super(); + } + +} From da5016afce9e36c2b778a81efe4013cffe49f3c3 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:46:44 +0530 Subject: [PATCH 229/464] Create EmailDTO.java --- .../com/wipro/cp/doconnect/dto/EmailDTO.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/EmailDTO.java diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/EmailDTO.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/EmailDTO.java new file mode 100644 index 0000000..21ce296 --- /dev/null +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/EmailDTO.java @@ -0,0 +1,30 @@ +package com.wipro.cp.doconnect.dto; + +public class EmailDTO { + + private String[] recipients; + private String subject; + private String body; + + public String[] getRecipients() { + return recipients; + } + public String getSubject() { + return subject; + } + public String getBody() { + return body; + } + + public EmailDTO(String[] recipients, String subject, String body) { + super(); + this.recipients = recipients; + this.subject = subject; + this.body = body; + } + + public EmailDTO() { + super(); + } + +} From 98d633eb535a86f86b6e5e9ece99e999bab68e14 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:46:46 +0530 Subject: [PATCH 230/464] Create AnswerUpdateDTO.java --- .../cp/doconnect/dto/AnswerUpdateDTO.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/AnswerUpdateDTO.java diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/AnswerUpdateDTO.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/AnswerUpdateDTO.java new file mode 100644 index 0000000..4b86c68 --- /dev/null +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/AnswerUpdateDTO.java @@ -0,0 +1,24 @@ +package com.wipro.cp.doconnect.dto; + +public class AnswerUpdateDTO { + + private boolean isApproved; + + public boolean getIsApproved() { + return isApproved; + } + + public void setIsApproved(boolean isApproved) { + this.isApproved = isApproved; + } + + public AnswerUpdateDTO(boolean isApproved) { + super(); + this.isApproved = isApproved; + } + + public AnswerUpdateDTO() { + super(); + } + +} From 05125cb606d70661f0231b333d1c61bca301c339 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:46:48 +0530 Subject: [PATCH 231/464] Create AnswerResponseDTO.java --- .../cp/doconnect/dto/AnswerResponseDTO.java | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/AnswerResponseDTO.java diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/AnswerResponseDTO.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/AnswerResponseDTO.java new file mode 100644 index 0000000..4d30719 --- /dev/null +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/AnswerResponseDTO.java @@ -0,0 +1,66 @@ +package com.wipro.cp.doconnect.dto; + +import java.util.Date; +import java.util.List; + +public class AnswerResponseDTO { + + private long id; + private String answer; + private List images; + private String postedBy; + private Date postedAt; + private String approvedBy; + private boolean isApproved; + private QuestionResponseDTO question; + + public long getId() { + return id; + } + + public String getAnswer() { + return answer; + } + + public List getImages() { + return images; + } + + public String getPostedBy() { + return postedBy; + } + + public Date getPostedAt() { + return postedAt; + } + + public String getApprovedBy() { + return approvedBy; + } + + public boolean getIsApproved() { + return isApproved; + } + + public QuestionResponseDTO getQuestion() { + return question; + } + + public AnswerResponseDTO(long id, String answer, List images, String postedBy, Date postedAt, + String approvedBy, boolean isApproved, QuestionResponseDTO question) { + super(); + this.id = id; + this.answer = answer; + this.images = images; + this.postedBy = postedBy; + this.postedAt = postedAt; + this.approvedBy = approvedBy; + this.isApproved = isApproved; + this.question = question; + } + + public AnswerResponseDTO() { + super(); + } + +} From 69cfd72569510c66f225e48eb945c76aeef37e60 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:46:50 +0530 Subject: [PATCH 232/464] Create AnswerRequestDTO.java --- .../cp/doconnect/dto/AnswerRequestDTO.java | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/AnswerRequestDTO.java diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/AnswerRequestDTO.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/AnswerRequestDTO.java new file mode 100644 index 0000000..4f67671 --- /dev/null +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/AnswerRequestDTO.java @@ -0,0 +1,33 @@ +package com.wipro.cp.doconnect.dto; + +import java.util.List; + +public class AnswerRequestDTO { + + private String answer; + private List images; + + public String getAnswer() { + return answer; + } + public void setAnswer(String answer) { + this.answer = answer; + } + public List getImages() { + return images; + } + public void setImages(List images) { + this.images = images; + } + + public AnswerRequestDTO(String answer, List images) { + super(); + this.answer = answer; + this.images = images; + } + + public AnswerRequestDTO() { + super(); + } + +} From e0f05e2e1fd0a3d7e209edfcb56633edba405638 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:46:52 +0530 Subject: [PATCH 233/464] Create DoConnectApplication.java --- .../wipro/cp/doconnect/DoConnectApplication.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/DoConnectApplication.java diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/DoConnectApplication.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/DoConnectApplication.java new file mode 100644 index 0000000..00f9b20 --- /dev/null +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/DoConnectApplication.java @@ -0,0 +1,13 @@ +package com.wipro.cp.doconnect; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class DoConnectApplication { + + public static void main(String[] args) { + SpringApplication.run(DoConnectApplication.class, args); + } + +} From dbb1406b08d6006fd5c51ba4112e9520753d190b Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:46:54 +0530 Subject: [PATCH 234/464] Create UserController.java --- .../doconnect/controller/UserController.java | 82 +++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/UserController.java diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/UserController.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/UserController.java new file mode 100644 index 0000000..91f1a60 --- /dev/null +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/UserController.java @@ -0,0 +1,82 @@ +package com.wipro.cp.doconnect.controller; + +import java.util.List; + +import javax.validation.Valid; +import javax.validation.constraints.Min; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.wipro.cp.doconnect.dto.StatusDTO; +import com.wipro.cp.doconnect.dto.UserRegisterDTO; +import com.wipro.cp.doconnect.dto.UserResponseDTO; +import com.wipro.cp.doconnect.dto.UserUpdateDTO; +import com.wipro.cp.doconnect.service.UserServiceImp; + +@RestController +@CrossOrigin +@RequestMapping("/api/v1") +public class UserController { + + @Autowired + private UserServiceImp userServiceImp; + + @GetMapping("/users") + public ResponseEntity> getAllUsers() { + return ResponseEntity.ok(userServiceImp.getAllUsers()); + } + + @GetMapping("/users/{id}") + public ResponseEntity getUserById(@PathVariable @Min(1) Long id) { + StatusDTO userStatus = userServiceImp.getUserById(id); + if (!userStatus.getIsValid()) { + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(userStatus.getStatusMessage()); + } + return ResponseEntity.ok(userStatus.getObject()); + } + + @PostMapping("/users") + public ResponseEntity createUser(@Valid @RequestBody UserRegisterDTO userRegisterDTO) { + StatusDTO userStatus = userServiceImp.createUser(userRegisterDTO); + if (!userStatus.getIsValid()) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(userStatus.getStatusMessage()); + } + return ResponseEntity.status(HttpStatus.CREATED).body(userStatus.getObject()); + } + + @PutMapping("/users/{id}") + public ResponseEntity updateUser(@Valid @RequestBody UserUpdateDTO userUpdateDTO, @PathVariable Long id) { + StatusDTO userStatus = userServiceImp.updateUser(userUpdateDTO, id); + if (!userStatus.getIsValid()) { + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(userStatus.getStatusMessage()); + } + return ResponseEntity.ok(userStatus.getObject()); + } + + @DeleteMapping("/users/{id}") + public ResponseEntity deleteUserById(@PathVariable @Min(1) Long id) { + boolean deleted = userServiceImp.deleteUserById(id); + if (deleted) { + return ResponseEntity.ok("User deleted successfully."); + } + return ResponseEntity.status(HttpStatus.NOT_FOUND).body("User with ID " + id + " does not exist."); + } + + @DeleteMapping("/users") + public ResponseEntity deleteAllUser() { + userServiceImp.deleteAllUsers(); + return ResponseEntity.ok("All users deleted successfully."); + } + +} From 8a442af0d34e4d7aedf93c9ba3e8d68342a479b0 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:46:56 +0530 Subject: [PATCH 235/464] Create QuestionController.java --- .../controller/QuestionController.java | 95 +++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/QuestionController.java diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/QuestionController.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/QuestionController.java new file mode 100644 index 0000000..73a34e7 --- /dev/null +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/QuestionController.java @@ -0,0 +1,95 @@ +package com.wipro.cp.doconnect.controller; + +import java.util.List; +import java.util.Optional; + +import javax.validation.Valid; +import javax.validation.constraints.Min; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.wipro.cp.doconnect.dto.QuestionRequestDTO; +import com.wipro.cp.doconnect.dto.QuestionResponseDTO; +import com.wipro.cp.doconnect.dto.QuestionUpdateDTO; +import com.wipro.cp.doconnect.dto.StatusDTO; +import com.wipro.cp.doconnect.service.QuestionServiceImp; +import com.wipro.cp.doconnect.util.Utilities; + +@RestController +@CrossOrigin +@RequestMapping("/api/v1") +public class QuestionController { + + @Autowired + private QuestionServiceImp questionServiceImp; + + @Autowired + private Utilities utilities; + + @GetMapping("/questions") + public ResponseEntity getAllQuestions(@RequestParam(name="status") Optional optionalStatus, @RequestParam(name="search") Optional optionalSearch) { + String status = "approved"; + if (optionalStatus.isPresent()) { + status = optionalStatus.get(); + } + String search = null; + if (optionalSearch.isPresent()) { + search = optionalSearch.get(); + } + StatusDTO> questionStatus = questionServiceImp.getAllQuestions(status, search); + if (!questionStatus.getIsValid()) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(questionStatus.getStatusMessage()); + } + return ResponseEntity.ok(questionStatus.getObject()); + } + + @PostMapping("/questions") + public ResponseEntity createQuestion(@Valid @RequestBody QuestionRequestDTO questionRequestDTO, @RequestHeader(HttpHeaders.AUTHORIZATION) String authorizationHeader) { + String postedBy = utilities.getUsernameFromAuthorizationHeader(authorizationHeader); + StatusDTO questionStatus = questionServiceImp.createQuestion(questionRequestDTO, postedBy); + if (!questionStatus.getIsValid()) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(questionStatus.getStatusMessage()); + } + return ResponseEntity.status(HttpStatus.CREATED).body(questionStatus.getObject()); + } + + @PutMapping("/questions/{questionId}") + public ResponseEntity updateQuestion(@Valid @RequestBody QuestionUpdateDTO questionUpdateDTO, @PathVariable Long questionId, @RequestHeader(HttpHeaders.AUTHORIZATION) String authorizationHeader) { + String approvedBy = utilities.getUsernameFromAuthorizationHeader(authorizationHeader); + StatusDTO questionStatus = questionServiceImp.updateQuestion(questionUpdateDTO, questionId, approvedBy); + if (!questionStatus.getIsValid()) { + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(questionStatus.getStatusMessage()); + } + return ResponseEntity.ok(questionStatus.getObject()); + } + + @DeleteMapping("/questions/{questionId}") + public ResponseEntity deleteQuestionById(@PathVariable @Min(1) Long questionId) { + StatusDTO deletionStatus = questionServiceImp.deleteQuestionById(questionId); + if (!deletionStatus.getIsValid()) { + Boolean status = deletionStatus.getObject(); + if (status == null) { + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(deletionStatus.getStatusMessage()); + } + else { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(deletionStatus.getStatusMessage()); + } + } + return ResponseEntity.ok("Question deleted successfully."); + } + +} From 2c8d4abd481cda0416f49b281c0377525c7a0526 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:46:58 +0530 Subject: [PATCH 236/464] Create ImageController.java --- .../doconnect/controller/ImageController.java | 103 ++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/ImageController.java diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/ImageController.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/ImageController.java new file mode 100644 index 0000000..dcb470b --- /dev/null +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/ImageController.java @@ -0,0 +1,103 @@ +package com.wipro.cp.doconnect.controller; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardOpenOption; +import java.time.Clock; +import java.util.Arrays; +import java.util.Optional; +import java.util.Random; + +import javax.annotation.PostConstruct; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.io.InputStreamResource; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +@RestController +@CrossOrigin +@RequestMapping("/api/v1") +public class ImageController { + + @Value("${image-storage-directory}") + private Path imageStorageDirectory; + + @Value("${valid-image-extensions}") + private String[] validImageExtensions; + + @PostConstruct + public void ensureDirectoryExists() throws IOException { + if (!Files.exists(this.imageStorageDirectory)) { + Files.createDirectories(this.imageStorageDirectory); + } + } + + private static Optional getFileExtension(String fileName) { + final int indexOfLastDot = fileName.lastIndexOf('.'); + if (indexOfLastDot == -1) { + return Optional.empty(); + } else { + return Optional.of(fileName.substring(indexOfLastDot + 1)); + } + } + + private boolean isValidFileExtension(String fileExtension) { + if (fileExtension.isBlank()) { + return false; + } + return Arrays.stream(validImageExtensions).anyMatch(fileExtension::equals); + } + + private static String generateFileName() { + Random rnd = new Random(); + int number = rnd.nextInt(99999); + Clock clock = Clock.systemDefaultZone(); + long milliseconds = clock.millis(); + return String.format("%d%05d", milliseconds, number); + } + + @PostMapping(value = "/images", produces = MediaType.TEXT_PLAIN_VALUE) + public ResponseEntity uploadImage(@RequestPart(name = "image", required = true) MultipartFile imageFile) throws IOException { + final String fileExtension = Optional.ofNullable(imageFile.getOriginalFilename()).flatMap(ImageController::getFileExtension).orElse(""); + if (!isValidFileExtension(fileExtension)) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("File extension is invalid. Should be either 'png' or 'jpeg'."); + } + final String targetFileName = generateFileName() + "." + fileExtension; + final Path targetPath = this.imageStorageDirectory.resolve(targetFileName); + try (InputStream in = imageFile.getInputStream()) { + try (OutputStream out = Files.newOutputStream(targetPath, StandardOpenOption.CREATE)) { + in.transferTo(out); + } + } + return ResponseEntity.ok(targetFileName); + } + + @GetMapping("/images/{fileName}") + public ResponseEntity downloadImage(@PathVariable("fileName") String fileName) throws IOException { + String fileExtension = Optional.ofNullable(fileName).flatMap(ImageController::getFileExtension).orElse(""); + if (!isValidFileExtension(fileExtension)) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("File extension is invalid. Should be either 'png' or 'jpeg'."); + } + MediaType contentType = (fileExtension.equalsIgnoreCase("jpeg")) ? MediaType.IMAGE_JPEG : MediaType.IMAGE_PNG; + final Path targetPath = this.imageStorageDirectory.resolve(fileName); + if (!Files.exists(targetPath)) { + return ResponseEntity.notFound().build(); + } + InputStream inputStream = Files.newInputStream(targetPath); + return ResponseEntity.ok().contentType(contentType).body(new InputStreamResource(inputStream)); + } + +} From 34e77905a5d4ffd17758646fa85c2a157388d4c4 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:47:00 +0530 Subject: [PATCH 237/464] Create AuthenticationController.java --- .../controller/AuthenticationController.java | 89 +++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AuthenticationController.java diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AuthenticationController.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AuthenticationController.java new file mode 100644 index 0000000..5bec079 --- /dev/null +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AuthenticationController.java @@ -0,0 +1,89 @@ +package com.wipro.cp.doconnect.controller; + +import javax.validation.Valid; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.authentication.DisabledException; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.wipro.cp.doconnect.component.JwtTokenUtilityComponent; +import com.wipro.cp.doconnect.dto.StatusDTO; +import com.wipro.cp.doconnect.dto.UserLoginRequestDTO; +import com.wipro.cp.doconnect.dto.UserLoginResponseDTO; +import com.wipro.cp.doconnect.dto.UserRegisterDTO; +import com.wipro.cp.doconnect.dto.UserResponseDTO; +import com.wipro.cp.doconnect.entity.LogoutToken; +import com.wipro.cp.doconnect.service.LogoutTokenServiceImp; +import com.wipro.cp.doconnect.service.UserServiceImp; + +@RestController +@CrossOrigin +@RequestMapping("/api/v1") +public class AuthenticationController { + + @Autowired + private AuthenticationManager authenticationManager; + + @Autowired + private JwtTokenUtilityComponent jwtTokenUtilityComponent; + + @Autowired + private UserServiceImp userServiceImp; + + @Autowired + private LogoutTokenServiceImp logoutTokenServiceImp; + + @GetMapping("/signout") + public ResponseEntity logoutUser(@RequestHeader(HttpHeaders.AUTHORIZATION) String authorizationHeader) { + if (authorizationHeader.startsWith("Bearer ")) { + String jwtToken = authorizationHeader.substring(7); + logoutTokenServiceImp.createToken(new LogoutToken(jwtToken)); + return ResponseEntity.ok("You have been successfully logged out."); + } + else { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Authorization header does not begin with Bearer string."); + } + } + + @PostMapping("/register") + public ResponseEntity registerUser(@Valid @RequestBody UserRegisterDTO userRegisterDTO) { + StatusDTO userStatus = userServiceImp.createUser(userRegisterDTO); + if (!userStatus.getIsValid()) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(userStatus.getStatusMessage()); + } + UserResponseDTO userResponseDTO = userStatus.getObject(); + return ResponseEntity.ok(userResponseDTO.getUsername() + " has been registered successfully" + (userResponseDTO.getIsAdmin() ? " as an admin." : " as a user.") + " Proceed to login to get your authorization token."); + } + + @PostMapping("/login") + public ResponseEntity createAuthenticationToken(@RequestBody UserLoginRequestDTO userLoginRequestDTO) throws Exception { + authenticate(userLoginRequestDTO.getUsername(), userLoginRequestDTO.getPassword()); + final UserDetails userDetails = userServiceImp.loadUserByUsername(userLoginRequestDTO.getUsername()); + final String token = jwtTokenUtilityComponent.generateToken(userDetails); + return ResponseEntity.ok(new UserLoginResponseDTO(token, "Bearer")); + } + + private void authenticate(String username, String password) throws Exception { + try { + authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(username, password)); + } catch (DisabledException e) { + throw new Exception("USER_DISABLED", e); + } catch (BadCredentialsException e) { + throw new Exception("INVALID_CREDENTIALS", e); + } + } + +} From ea096da393ca6df07c1ecdc8f8bab0b6c7a741ed Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:47:03 +0530 Subject: [PATCH 238/464] Create AnswerController.java --- .../controller/AnswerController.java | 103 ++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AnswerController.java diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AnswerController.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AnswerController.java new file mode 100644 index 0000000..fc88b6a --- /dev/null +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AnswerController.java @@ -0,0 +1,103 @@ +package com.wipro.cp.doconnect.controller; + +import java.util.List; +import java.util.Optional; + +import javax.validation.Valid; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.wipro.cp.doconnect.dto.AnswerRequestDTO; +import com.wipro.cp.doconnect.dto.AnswerResponseDTO; +import com.wipro.cp.doconnect.dto.AnswerUpdateDTO; +import com.wipro.cp.doconnect.dto.StatusDTO; +import com.wipro.cp.doconnect.service.AnswerServiceImp; +import com.wipro.cp.doconnect.util.Utilities; + +@RestController +@CrossOrigin +@RequestMapping("/api/v1") +public class AnswerController { + + @Autowired + AnswerServiceImp answerServiceImp; + + @Autowired + private Utilities utilities; + + @GetMapping("/answers") + public ResponseEntity getAllAnswers(@RequestParam(name="status") Optional optionalStatus) { + String answerStatus = "approved"; + if (optionalStatus.isPresent()) { + answerStatus = optionalStatus.get(); + } + StatusDTO> answerResponseDTOStatus = answerServiceImp.getAllAnswers(answerStatus); + if (!answerResponseDTOStatus.getIsValid()) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(answerResponseDTOStatus.getStatusMessage()); + } + return ResponseEntity.ok(answerResponseDTOStatus.getObject()); + } + + @GetMapping("/questions/{questionId}/answers") + public ResponseEntity getAllAnswersForQuestionId(@PathVariable(value="questionId") Long questionId, @RequestParam(name="status") Optional optionalStatus) { + String answerStatus = "approved"; + if (optionalStatus.isPresent()) { + answerStatus = optionalStatus.get(); + } + StatusDTO> answerResponseDTOStatus = answerServiceImp.getAllAnswersForQuestionId(questionId, answerStatus); + if (!answerResponseDTOStatus.getIsValid()) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(answerResponseDTOStatus.getStatusMessage()); + } + return ResponseEntity.ok(answerResponseDTOStatus.getObject()); + } + + @PostMapping("/questions/{questionId}/answers") + public ResponseEntity createAnswerForQuestionId(@PathVariable(value="questionId") Long questionId, @Valid @RequestBody AnswerRequestDTO answerRequestDTO, @RequestHeader(HttpHeaders.AUTHORIZATION) String authorizationHeader) { + String postedBy = utilities.getUsernameFromAuthorizationHeader(authorizationHeader); + StatusDTO answerResponseDTOStatus = answerServiceImp.createAnswerForQuestionId(questionId, answerRequestDTO, postedBy); + if (!answerResponseDTOStatus.getIsValid()) { + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(answerResponseDTOStatus.getStatusMessage()); + } + return ResponseEntity.status(HttpStatus.CREATED).body(answerResponseDTOStatus.getObject()); + } + + @PutMapping("/questions/{questionId}/answers/{answerId}") + public ResponseEntity updateAnswerForQuestionId(@Valid @RequestBody AnswerUpdateDTO answerUpdateDTO, @PathVariable(value="questionId") Long questionId, @PathVariable(value="answerId") Long answerId, @RequestHeader(HttpHeaders.AUTHORIZATION) String authorizationHeader) { + String approvedBy = utilities.getUsernameFromAuthorizationHeader(authorizationHeader); + StatusDTO answerResponseDTOStatus = answerServiceImp.updateAnswerForQuestionId(questionId, answerId, answerUpdateDTO, approvedBy); + if (!answerResponseDTOStatus.getIsValid()) { + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(answerResponseDTOStatus.getStatusMessage()); + } + return ResponseEntity.ok(answerResponseDTOStatus.getObject()); + } + + @DeleteMapping("/questions/{questionId}/answers/{answerId}") + public ResponseEntity deleteAnswerForQuestionById(@PathVariable(value="questionId") Long questionId, @PathVariable(value="answerId") Long answerId) { + StatusDTO deletionStatus = answerServiceImp.deleteAnswerForQuestionById(questionId, answerId); + if (!deletionStatus.getIsValid()) { + Boolean status = deletionStatus.getObject(); + if (status == null) { + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(deletionStatus.getStatusMessage()); + } + else { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(deletionStatus.getStatusMessage()); + } + } + return ResponseEntity.ok("Answer for Question ID " + questionId + " deleted successfully."); + } + +} From 5d27e88850333fe0cca455cd7f0bf9a4549827e3 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:47:05 +0530 Subject: [PATCH 239/464] Create WebSecurityConfig.java --- .../doconnect/config/WebSecurityConfig.java | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/config/WebSecurityConfig.java diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/config/WebSecurityConfig.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/config/WebSecurityConfig.java new file mode 100644 index 0000000..c19c1f0 --- /dev/null +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/config/WebSecurityConfig.java @@ -0,0 +1,53 @@ +package com.wipro.cp.doconnect.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +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.SecurityFilterChain; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; + +import com.wipro.cp.doconnect.component.JwtAuthenticationEntryPointComponent; +import com.wipro.cp.doconnect.component.JwtRequestFilterComponent; + +@EnableWebSecurity +public class WebSecurityConfig { + + @Autowired + private JwtAuthenticationEntryPointComponent jwtAuthenticationEntryPointComponent; + + @Autowired + private JwtRequestFilterComponent jwtRequestFilterComponent; + + @Bean + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } + + @Bean + public AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration) throws Exception { + return authenticationConfiguration.getAuthenticationManager(); + } + + @Bean + public SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception { + // We don't need CSRF for this example + httpSecurity.csrf().disable() + // don't authenticate this particular request + .authorizeRequests().antMatchers("/api/v1/register", "/api/v1/login", "/api/v1/questions").permitAll() + // all other requests need to be authenticated + .anyRequest().authenticated().and() + // make sure we use state less session; session won't be used to store user's state. + .exceptionHandling().authenticationEntryPoint(jwtAuthenticationEntryPointComponent).and().sessionManagement() + .sessionCreationPolicy(SessionCreationPolicy.STATELESS); + // Add a filter to validate the tokens with every request + httpSecurity.addFilterBefore(jwtRequestFilterComponent, UsernamePasswordAuthenticationFilter.class); + return httpSecurity.build(); + } + +} From 98f33b29fbcceb200da49699ada7352d6f7b6ac8 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:47:07 +0530 Subject: [PATCH 240/464] Create LogoutTokenSchedulerConfig.java --- .../config/LogoutTokenSchedulerConfig.java | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/config/LogoutTokenSchedulerConfig.java diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/config/LogoutTokenSchedulerConfig.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/config/LogoutTokenSchedulerConfig.java new file mode 100644 index 0000000..a9895ac --- /dev/null +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/config/LogoutTokenSchedulerConfig.java @@ -0,0 +1,48 @@ +package com.wipro.cp.doconnect.config; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.Scheduled; + +import com.wipro.cp.doconnect.component.JwtTokenUtilityComponent; +import com.wipro.cp.doconnect.entity.LogoutToken; +import com.wipro.cp.doconnect.service.LogoutTokenServiceImp; + +import io.jsonwebtoken.ExpiredJwtException; + +@Configuration +@EnableScheduling +public class LogoutTokenSchedulerConfig { + + @Autowired + private LogoutTokenServiceImp logoutTokenServiceImp; + + @Autowired + private JwtTokenUtilityComponent jwtTokenUtilityComponent; + + @Scheduled(fixedDelay = 15 * 60 * 1000) // 15 Minutes + public void deleteExpiredJwtTokens() { + System.out.println("deleteExpiredJwtTokens scheduled job started at " + System.currentTimeMillis()); + List logoutTokenList = logoutTokenServiceImp.getAllTokens(); + logoutTokenServiceImp.deleteAllTokens(); + List validLogoutTokenList = new ArrayList<>(); + for (LogoutToken logoutToken : logoutTokenList) { + try { + if (jwtTokenUtilityComponent.isTokenExpired(logoutToken.getToken())) { + System.out.println("JWT Token " + logoutToken.getToken() + " removed from logout_token table."); + } else { + validLogoutTokenList.add(logoutToken); + } + } catch (ExpiredJwtException e) { + System.out.println("Exception in deleteExpiredJwtTokens - " + e.toString()); + } + } + logoutTokenServiceImp.createTokens(validLogoutTokenList); + System.out.println("deleteExpiredJwtTokens scheduled job finished at " + System.currentTimeMillis()); + } + +} From ec68395954dbfbd0e023d796f8f18cb2958ff453 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:47:10 +0530 Subject: [PATCH 241/464] Create AuthorizationConfig.java --- .../doconnect/config/AuthorizationConfig.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/config/AuthorizationConfig.java diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/config/AuthorizationConfig.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/config/AuthorizationConfig.java new file mode 100644 index 0000000..0cd29fc --- /dev/null +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/config/AuthorizationConfig.java @@ -0,0 +1,25 @@ +package com.wipro.cp.doconnect.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import com.wipro.cp.doconnect.interceptor.AuthorizationInterceptor; + +@Configuration +@EnableWebMvc +public class AuthorizationConfig implements WebMvcConfigurer { + + @Bean + public AuthorizationInterceptor authorizationInterceptor() { + return new AuthorizationInterceptor(); + } + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(authorizationInterceptor()).addPathPatterns("/**"); + } + +} From 251329436eb23db02b32f324caa440cf28b4117f Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:47:12 +0530 Subject: [PATCH 242/464] Create SimpleCORSFilter.java --- .../doconnect/component/SimpleCORSFilter.java | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/component/SimpleCORSFilter.java diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/component/SimpleCORSFilter.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/component/SimpleCORSFilter.java new file mode 100644 index 0000000..9333c4a --- /dev/null +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/component/SimpleCORSFilter.java @@ -0,0 +1,44 @@ +package com.wipro.cp.doconnect.component; + +import java.io.IOException; +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +@Component +public class SimpleCORSFilter implements Filter { + + private final Logger log = LoggerFactory.getLogger(SimpleCORSFilter.class); + + public SimpleCORSFilter() { + log.info("SimpleCORSFilter init"); + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { + HttpServletRequest httpRequest = (HttpServletRequest) request; + HttpServletResponse httpResponse = (HttpServletResponse) response; + httpResponse.setHeader("Access-Control-Allow-Origin", httpRequest.getHeader("Origin")); + httpResponse.setHeader("Access-Control-Allow-Credentials", "true"); + httpResponse.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE"); + httpResponse.setHeader("Access-Control-Max-Age", "3600"); + httpResponse.setHeader("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With, remember-me"); + chain.doFilter(request, response); + } + + @Override + public void init(FilterConfig filterConfig) {} + + @Override + public void destroy() {} + +} From 9da751fa9e26130d2685c77494bff47eeedb6ab3 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:47:14 +0530 Subject: [PATCH 243/464] Create JwtTokenUtilityComponent.java --- .../component/JwtTokenUtilityComponent.java | 95 +++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/component/JwtTokenUtilityComponent.java diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/component/JwtTokenUtilityComponent.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/component/JwtTokenUtilityComponent.java new file mode 100644 index 0000000..05884df --- /dev/null +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/component/JwtTokenUtilityComponent.java @@ -0,0 +1,95 @@ +package com.wipro.cp.doconnect.component; + +import java.io.Serializable; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.function.Function; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.stereotype.Component; + +import com.wipro.cp.doconnect.dto.StatusDTO; +import com.wipro.cp.doconnect.dto.UserResponseDTO; +import com.wipro.cp.doconnect.service.LogoutTokenServiceImp; +import com.wipro.cp.doconnect.service.UserServiceImp; + +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; + +@Component +public class JwtTokenUtilityComponent implements Serializable { + + private static final long serialVersionUID = -2550185165626007488L; + + @Value("${jwt.token-validity-time}") + private int JWT_TOKEN_VALIDITY; + + @Value("${jwt.secret}") + private String secret; + + @Autowired + private LogoutTokenServiceImp logoutTokenServiceImp; + + @Autowired + private UserServiceImp userServiceImp; + + public String getUsernameFromToken(String token) { + return getClaimFromToken(token, Claims::getSubject); + } + + public Date getExpirationDateFromToken(String token) { + return getClaimFromToken(token, Claims::getExpiration); + } + + public T getClaimFromToken(String token, Function claimsResolver) { + final Claims claims = getAllClaimsFromToken(token); + return claimsResolver.apply(claims); + } + + private Claims getAllClaimsFromToken(String token) { + return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody(); + } + + public Boolean isTokenExpired(String token) { + final Date expiration = getExpirationDateFromToken(token); + return expiration.before(new Date()); + } + + public String generateToken(UserDetails userDetails) { + Map claims = new HashMap<>(); + StatusDTO userStatus = userServiceImp.getUserByUsername(userDetails.getUsername()); + if (userStatus.getIsValid()) { + UserResponseDTO user = userStatus.getObject(); + claims.put("isAdmin", user.getIsAdmin()); + claims.put("email", user.getEmail()); + claims.put("name", user.getName()); + } + return doGenerateToken(claims, userDetails.getUsername()); + } + + //while creating the token - + //1. Define claims of the token, like Issuer, Expiration, Subject, and the ID + //2. Sign the JWT using the HS512 algorithm and secret key. + //3. According to JWS Compact Serialization(https://tools.ietf.org/html/draft-ietf-jose-json-web-signature-41#section-3.1) compaction of the JWT to a URL-safe string + private String doGenerateToken(Map claims, String subject) { + return Jwts.builder().setClaims(claims).setSubject(subject).setIssuedAt(new Date(System.currentTimeMillis())) + .setExpiration(new Date(System.currentTimeMillis() + JWT_TOKEN_VALIDITY * 1000)) + .signWith(SignatureAlgorithm.HS512, secret).compact(); + } + + //validate token + //First check if the token is present in the logout tokens list, if it exists, then token is invalid + //If token is still valid then get user name from token and check if it is same as in user details and the token is not expired + public Boolean validateToken(String token, UserDetails userDetails) { + if (logoutTokenServiceImp.checkIfTokenExists(token)) { + return false; + } + final String username = getUsernameFromToken(token); + return (username.equals(userDetails.getUsername()) && !isTokenExpired(token)); + } + +} From ef6ec2e3eb4eac6b4bfd33995ef660ef3eb92aec Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:47:17 +0530 Subject: [PATCH 244/464] Create JwtRequestFilterComponent.java --- .../component/JwtRequestFilterComponent.java | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/component/JwtRequestFilterComponent.java diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/component/JwtRequestFilterComponent.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/component/JwtRequestFilterComponent.java new file mode 100644 index 0000000..8772231 --- /dev/null +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/component/JwtRequestFilterComponent.java @@ -0,0 +1,64 @@ +package com.wipro.cp.doconnect.component; + +import java.io.IOException; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; + +import com.wipro.cp.doconnect.service.UserServiceImp; + +import io.jsonwebtoken.ExpiredJwtException; + +@Component +public class JwtRequestFilterComponent extends OncePerRequestFilter { + + @Autowired + private UserServiceImp userServiceImp; + + @Autowired + private JwtTokenUtilityComponent jwtTokenUtilityComponent; + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException { + final String requestTokenHeader = request.getHeader("Authorization"); + String username = null; + String jwtToken = null; + // JWT Token is in the form "Bearer token". Remove Bearer word and get only the token + if (requestTokenHeader != null && requestTokenHeader.startsWith("Bearer ")) { + jwtToken = requestTokenHeader.substring(7); + try { + username = jwtTokenUtilityComponent.getUsernameFromToken(jwtToken); + } catch (IllegalArgumentException e) { + logger.error("Unable to get JWT Token from Authorization header. " + e.toString()); + } catch (ExpiredJwtException e) { + logger.error("JWT Token " + jwtToken + " has expired. " + e.toString()); + } + } else { + logger.warn("JWT Token does not begin with Bearer string"); + } + // Once we get the token validate it. + if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) { + UserDetails userDetails = this.userServiceImp.loadUserByUsername(username); + // if token is valid configure Spring Security to manually set authentication + if (jwtTokenUtilityComponent.validateToken(jwtToken, userDetails)) { + UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); + usernamePasswordAuthenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); + // After setting the Authentication in the context, we specify that the current user is authenticated. So it passes the + // Spring Security Configurations successfully. + SecurityContextHolder.getContext().setAuthentication(usernamePasswordAuthenticationToken); + } + } + chain.doFilter(request, response); + } + +} From 7a9b621af311a67bc8b1b43a27796ddd8f6d8927 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:47:20 +0530 Subject: [PATCH 245/464] Create JwtAuthenticationEntryPointComponent.java --- .../JwtAuthenticationEntryPointComponent.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/component/JwtAuthenticationEntryPointComponent.java diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/component/JwtAuthenticationEntryPointComponent.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/component/JwtAuthenticationEntryPointComponent.java new file mode 100644 index 0000000..536db43 --- /dev/null +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/component/JwtAuthenticationEntryPointComponent.java @@ -0,0 +1,23 @@ +package com.wipro.cp.doconnect.component; + +import java.io.IOException; +import java.io.Serializable; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.web.AuthenticationEntryPoint; +import org.springframework.stereotype.Component; + +@Component +public class JwtAuthenticationEntryPointComponent implements AuthenticationEntryPoint, Serializable { + + private static final long serialVersionUID = -7858869558953243875L; + + @Override + public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException { + response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized"); + } + +} From 7bc66eca0f10286c84a937d89b0eb9379719c179 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:47:23 +0530 Subject: [PATCH 246/464] Create pom.xml --- do_connect_backend/DoConnect/pom.xml | 84 ++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 do_connect_backend/DoConnect/pom.xml diff --git a/do_connect_backend/DoConnect/pom.xml b/do_connect_backend/DoConnect/pom.xml new file mode 100644 index 0000000..e7070e3 --- /dev/null +++ b/do_connect_backend/DoConnect/pom.xml @@ -0,0 +1,84 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.7.3 + + + com.wipro.cp + doconnect + 0.0.1-SNAPSHOT + DoConnect + Demo project for Spring Boot + + 17 + + + + org.springframework.boot + spring-boot-starter-actuator + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-web + + + + mysql + mysql-connector-java + runtime + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.boot + spring-boot-starter-security + + + io.jsonwebtoken + jjwt + 0.9.1 + + + org.springframework.boot + spring-boot-starter-validation + + + org.springframework.security + spring-security-test + test + + + org.springframework.boot + spring-boot-starter-mail + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + + From f2e167e9efe3c7053561f615aafbe32b06610b91 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:54:05 +0530 Subject: [PATCH 247/464] Create application.properties --- .../src/main/resources/application.properties | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 do_connect_backend/DoConnect/src/main/resources/application.properties diff --git a/do_connect_backend/DoConnect/src/main/resources/application.properties b/do_connect_backend/DoConnect/src/main/resources/application.properties new file mode 100644 index 0000000..bec391d --- /dev/null +++ b/do_connect_backend/DoConnect/src/main/resources/application.properties @@ -0,0 +1,28 @@ +server.port=9090 + +spring.datasource.url=jdbc:mysql://localhost:3306/do_connect?createDatabaseIfNotExist=true&useSSL=false +spring.datasource.username= +spring.datasource.password= +spring.jpa.hibernate.ddl-auto=update +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect +spring.jpa.open-in-view=false + +spring.main.allow-circular-references=true + +spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true + +spring.mail.host=smtp.gmail.com +spring.mail.port=587 +spring.mail.username= +spring.mail.password= +spring.mail.properties.mail.smtp.auth=true +spring.mail.properties.mail.smtp.starttls.enable=true + +jwt.secret=devashishpathrabe +# 3 hours jwt token validity = 3 * 60 * 60 +jwt.token-validity-time=10800 + +image-storage-directory=/do_connect_images +valid-image-extensions=png,jpeg + +enable-notification-emails=false \ No newline at end of file From 380526b8eabf5756be1d973effcf6794ca522404 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 15:59:37 +0530 Subject: [PATCH 248/464] Update .gitignore --- do_connect_backend/DoConnect/.gitignore | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/do_connect_backend/DoConnect/.gitignore b/do_connect_backend/DoConnect/.gitignore index 549e00a..b467747 100644 --- a/do_connect_backend/DoConnect/.gitignore +++ b/do_connect_backend/DoConnect/.gitignore @@ -26,8 +26,15 @@ target/ /nbdist/ /.nb-gradle/ build/ +bin/ !**/src/main/**/build/ !**/src/test/**/build/ +### Misc #### +mvnw +mvnw.cmd +maven-wrapper.jar +maven-wrapper.properties + ### VS Code ### .vscode/ From 7210e411fefa14cf855b93301533dbb16812eda6 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 16:00:06 +0530 Subject: [PATCH 249/464] Update .gitignore --- .gitignore | 3 --- 1 file changed, 3 deletions(-) diff --git a/.gitignore b/.gitignore index 6251d70..e10e727 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1 @@ /.metadata/ - -*.jar -*.class From 07a796a3e3a052c1de9f345d51e5292ab10138c7 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 16:40:46 +0530 Subject: [PATCH 250/464] Update user.service.ts --- do_connect_frontend/src/app/service/user.service.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/do_connect_frontend/src/app/service/user.service.ts b/do_connect_frontend/src/app/service/user.service.ts index 5114346..1292ecf 100644 --- a/do_connect_frontend/src/app/service/user.service.ts +++ b/do_connect_frontend/src/app/service/user.service.ts @@ -1,12 +1,13 @@ import { HttpClient, HttpHeaders } from '@angular/common/http'; import { ConditionalExpr } from '@angular/compiler'; import { Injectable } from '@angular/core'; +import { BASE_URL } from '../constants/constants'; @Injectable({ providedIn: 'root', }) export class UserService { - baseURL = 'http://localhost:8181/api/v1'; + baseURL = BASE_URL; constructor(private http: HttpClient) {} From f5a0a61197ca082dd60f532eaf581175530dbf8e Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 16:40:51 +0530 Subject: [PATCH 251/464] Update upload-files.service.ts --- do_connect_frontend/src/app/service/upload-files.service.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/do_connect_frontend/src/app/service/upload-files.service.ts b/do_connect_frontend/src/app/service/upload-files.service.ts index b980c13..5620118 100644 --- a/do_connect_frontend/src/app/service/upload-files.service.ts +++ b/do_connect_frontend/src/app/service/upload-files.service.ts @@ -1,12 +1,13 @@ import { HttpClient, HttpEvent, HttpRequest } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { Observable } from 'rxjs'; +import { BASE_URL } from '../constants/constants'; @Injectable({ providedIn: 'root', }) export class UploadFilesService { - private baseURL = 'http://localhost:8181/api/v1'; + private baseURL = BASE_URL; constructor(private http: HttpClient) {} // Returns an observable upload(file: any): Observable { From fbe5bfa0d72d656b7f36d79ea74769a272b7bbfa Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 16:40:54 +0530 Subject: [PATCH 252/464] Update admin.service.ts --- do_connect_frontend/src/app/service/admin.service.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/do_connect_frontend/src/app/service/admin.service.ts b/do_connect_frontend/src/app/service/admin.service.ts index d799034..5a4e357 100644 --- a/do_connect_frontend/src/app/service/admin.service.ts +++ b/do_connect_frontend/src/app/service/admin.service.ts @@ -1,11 +1,12 @@ import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; +import { BASE_URL } from '../constants/constants'; @Injectable({ providedIn: 'root', }) export class AdminService { - baseURL = 'http://localhost:8181/api/v1'; + baseURL = BASE_URL; constructor(private http: HttpClient) {} From 9b748cc546fdb3c5c9c35a889dd05eab995da217 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 16:40:57 +0530 Subject: [PATCH 253/464] Create constants.ts --- do_connect_frontend/src/app/constants/constants.ts | 1 + 1 file changed, 1 insertion(+) create mode 100644 do_connect_frontend/src/app/constants/constants.ts diff --git a/do_connect_frontend/src/app/constants/constants.ts b/do_connect_frontend/src/app/constants/constants.ts new file mode 100644 index 0000000..9e53db5 --- /dev/null +++ b/do_connect_frontend/src/app/constants/constants.ts @@ -0,0 +1 @@ +export const BASE_URL = 'http://localhost:9090/api/v1'; \ No newline at end of file From 95ede2db2f168548ed3814bf1ee6e231178d88d8 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 16:41:01 +0530 Subject: [PATCH 254/464] Update angular.json --- do_connect_frontend/angular.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/do_connect_frontend/angular.json b/do_connect_frontend/angular.json index aab6ce6..3d637fc 100644 --- a/do_connect_frontend/angular.json +++ b/do_connect_frontend/angular.json @@ -91,5 +91,8 @@ } } } + }, + "cli": { + "analytics": false } } From 495cab126cd9de02b0028a1aa758cbb7ce97e41d Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 16:41:10 +0530 Subject: [PATCH 255/464] Update EmailServiceImp.java --- .../com/wipro/cp/doconnect/service/EmailServiceImp.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/EmailServiceImp.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/EmailServiceImp.java index f77422c..c746e03 100644 --- a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/EmailServiceImp.java +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/EmailServiceImp.java @@ -6,11 +6,15 @@ import org.springframework.mail.javamail.JavaMailSender; import org.springframework.stereotype.Service; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.wipro.cp.doconnect.dto.EmailDTO; @Service public class EmailServiceImp implements IEmailService { + private final Logger log = LoggerFactory.getLogger(EmailServiceImp.class); + @Autowired private JavaMailSender javaMailSender; @@ -29,7 +33,7 @@ public boolean sendNotificationEmail(EmailDTO emailDTO) { return true; } catch (Exception e) { - System.out.println(e.toString()); + log.warn(e.toString()); return false; } } From 9643053307dd40e4d9dac144f226ef94ea8b3990 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 16:41:12 +0530 Subject: [PATCH 256/464] Update AuthorizationInterceptor.java --- .../cp/doconnect/interceptor/AuthorizationInterceptor.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/interceptor/AuthorizationInterceptor.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/interceptor/AuthorizationInterceptor.java index e1172c8..29b17bf 100644 --- a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/interceptor/AuthorizationInterceptor.java +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/interceptor/AuthorizationInterceptor.java @@ -15,7 +15,12 @@ import com.wipro.cp.doconnect.dto.UserResponseDTO; import com.wipro.cp.doconnect.service.UserServiceImp; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + public class AuthorizationInterceptor implements HandlerInterceptor { + + private final Logger log = LoggerFactory.getLogger(AuthorizationInterceptor.class); @Autowired private UserServiceImp userServiceImp; @@ -56,7 +61,7 @@ else if (currentURI.equalsIgnoreCase("/api/v1/register") || currentURI.equalsIgn try { username = jwtTokenUtilityComponent.getUsernameFromToken(jwtToken); } catch (Exception e) { - System.out.println("Exception " + e.toString()); + log.warn("Exception " + e.toString()); } } if (username != null) { From 71c3f2d3239161f153d9c36275e91213f0313a72 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 16:41:15 +0530 Subject: [PATCH 257/464] Update UserController.java --- .../java/com/wipro/cp/doconnect/controller/UserController.java | 1 - 1 file changed, 1 deletion(-) diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/UserController.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/UserController.java index 91f1a60..46e5548 100644 --- a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/UserController.java +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/UserController.java @@ -25,7 +25,6 @@ import com.wipro.cp.doconnect.service.UserServiceImp; @RestController -@CrossOrigin @RequestMapping("/api/v1") public class UserController { From d37f9d2c92ef1fe5d3b591bcb5384e90f2a77d2a Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 16:41:17 +0530 Subject: [PATCH 258/464] Update ImageController.java --- .../java/com/wipro/cp/doconnect/controller/ImageController.java | 1 - 1 file changed, 1 deletion(-) diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/ImageController.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/ImageController.java index dcb470b..1564890 100644 --- a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/ImageController.java +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/ImageController.java @@ -28,7 +28,6 @@ import org.springframework.web.multipart.MultipartFile; @RestController -@CrossOrigin @RequestMapping("/api/v1") public class ImageController { From 49dbd3e13d7ab89b4cfad5c75185005557e1b492 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 16:41:19 +0530 Subject: [PATCH 259/464] Update AuthenticationController.java --- .../wipro/cp/doconnect/controller/AuthenticationController.java | 1 - 1 file changed, 1 deletion(-) diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AuthenticationController.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AuthenticationController.java index 5bec079..4d38b51 100644 --- a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AuthenticationController.java +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AuthenticationController.java @@ -30,7 +30,6 @@ import com.wipro.cp.doconnect.service.UserServiceImp; @RestController -@CrossOrigin @RequestMapping("/api/v1") public class AuthenticationController { From c354d94aed691b3c269647b55a29550569a338d8 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 16:41:22 +0530 Subject: [PATCH 260/464] Update AnswerController.java --- .../java/com/wipro/cp/doconnect/controller/AnswerController.java | 1 - 1 file changed, 1 deletion(-) diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AnswerController.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AnswerController.java index fc88b6a..60f4681 100644 --- a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AnswerController.java +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/AnswerController.java @@ -29,7 +29,6 @@ import com.wipro.cp.doconnect.util.Utilities; @RestController -@CrossOrigin @RequestMapping("/api/v1") public class AnswerController { From dfa5d35e524b85a8afceeee74b1cd8310dce5501 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 16:41:24 +0530 Subject: [PATCH 261/464] Update LogoutTokenSchedulerConfig.java --- .../doconnect/config/LogoutTokenSchedulerConfig.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/config/LogoutTokenSchedulerConfig.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/config/LogoutTokenSchedulerConfig.java index a9895ac..334f7a0 100644 --- a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/config/LogoutTokenSchedulerConfig.java +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/config/LogoutTokenSchedulerConfig.java @@ -12,11 +12,15 @@ import com.wipro.cp.doconnect.entity.LogoutToken; import com.wipro.cp.doconnect.service.LogoutTokenServiceImp; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import io.jsonwebtoken.ExpiredJwtException; @Configuration @EnableScheduling public class LogoutTokenSchedulerConfig { + + private final Logger log = LoggerFactory.getLogger(LogoutTokenSchedulerConfig.class); @Autowired private LogoutTokenServiceImp logoutTokenServiceImp; @@ -26,23 +30,23 @@ public class LogoutTokenSchedulerConfig { @Scheduled(fixedDelay = 15 * 60 * 1000) // 15 Minutes public void deleteExpiredJwtTokens() { - System.out.println("deleteExpiredJwtTokens scheduled job started at " + System.currentTimeMillis()); + log.info("deleteExpiredJwtTokens scheduled job started..."); List logoutTokenList = logoutTokenServiceImp.getAllTokens(); logoutTokenServiceImp.deleteAllTokens(); List validLogoutTokenList = new ArrayList<>(); for (LogoutToken logoutToken : logoutTokenList) { try { if (jwtTokenUtilityComponent.isTokenExpired(logoutToken.getToken())) { - System.out.println("JWT Token " + logoutToken.getToken() + " removed from logout_token table."); + log.info("JWT Token " + logoutToken.getToken() + " removed from logout_token table."); } else { validLogoutTokenList.add(logoutToken); } } catch (ExpiredJwtException e) { - System.out.println("Exception in deleteExpiredJwtTokens - " + e.toString()); + log.warn("Exception in deleteExpiredJwtTokens - " + e.toString()); } } logoutTokenServiceImp.createTokens(validLogoutTokenList); - System.out.println("deleteExpiredJwtTokens scheduled job finished at " + System.currentTimeMillis()); + log.info("deleteExpiredJwtTokens scheduled job finished."); } } From 5ac075df51e54708ed378a3a4e305c1e83ef576a Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 16:41:27 +0530 Subject: [PATCH 262/464] Update SimpleCORSFilter.java --- .../doconnect/component/SimpleCORSFilter.java | 22 ++++++++----------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/component/SimpleCORSFilter.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/component/SimpleCORSFilter.java index 9333c4a..314f3a8 100644 --- a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/component/SimpleCORSFilter.java +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/component/SimpleCORSFilter.java @@ -10,29 +10,25 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; @Component public class SimpleCORSFilter implements Filter { - - private final Logger log = LoggerFactory.getLogger(SimpleCORSFilter.class); - - public SimpleCORSFilter() { - log.info("SimpleCORSFilter init"); - } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { - HttpServletRequest httpRequest = (HttpServletRequest) request; + HttpServletRequest httpRequest = (HttpServletRequest) request; HttpServletResponse httpResponse = (HttpServletResponse) response; httpResponse.setHeader("Access-Control-Allow-Origin", httpRequest.getHeader("Origin")); - httpResponse.setHeader("Access-Control-Allow-Credentials", "true"); - httpResponse.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE"); + httpResponse.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE"); httpResponse.setHeader("Access-Control-Max-Age", "3600"); - httpResponse.setHeader("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With, remember-me"); - chain.doFilter(request, response); + httpResponse.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, remember-me"); + httpResponse.setHeader("Access-Control-Expose-Headers", "Location"); + if ("OPTIONS".equalsIgnoreCase(((HttpServletRequest) request).getMethod())) { + httpResponse.setStatus(HttpServletResponse.SC_OK); + } else { + chain.doFilter(request, response); + } } @Override From 2b06fd6ea821ed171b22c90ed6912e4688099d88 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 19:13:42 +0530 Subject: [PATCH 263/464] Create DoConnectChatApplicationTests.java --- .../DoConnectChatApplicationTests.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 do_connect_backend/DoConnectChat/src/test/java/com/wipro/cp/doconnectchat/DoConnectChatApplicationTests.java diff --git a/do_connect_backend/DoConnectChat/src/test/java/com/wipro/cp/doconnectchat/DoConnectChatApplicationTests.java b/do_connect_backend/DoConnectChat/src/test/java/com/wipro/cp/doconnectchat/DoConnectChatApplicationTests.java new file mode 100644 index 0000000..3913ab9 --- /dev/null +++ b/do_connect_backend/DoConnectChat/src/test/java/com/wipro/cp/doconnectchat/DoConnectChatApplicationTests.java @@ -0,0 +1,13 @@ +package com.wipro.cp.doconnectchat; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class DoConnectChatApplicationTests { + + @Test + void contextLoads() { + } + +} From d5f1dbc70191350d643c8451d37de42dc8d1969b Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 19:13:51 +0530 Subject: [PATCH 264/464] Create MessageServiceImp.java --- .../service/MessageServiceImp.java | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/service/MessageServiceImp.java diff --git a/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/service/MessageServiceImp.java b/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/service/MessageServiceImp.java new file mode 100644 index 0000000..8365691 --- /dev/null +++ b/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/service/MessageServiceImp.java @@ -0,0 +1,40 @@ +package com.wipro.cp.doconnectchat.service; + +import java.util.List; +import java.util.stream.Collectors; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.wipro.cp.doconnectchat.dto.MessageRequestDTO; +import com.wipro.cp.doconnectchat.dto.MessageResponseDTO; +import com.wipro.cp.doconnectchat.entity.Message; +import com.wipro.cp.doconnectchat.repository.MessageRepository; + +@Service +public class MessageServiceImp implements IMessageService { + + @Autowired + private MessageRepository messageRepository; + + private MessageResponseDTO convertMessageToMessageResponseDTO(Message message) { + return new MessageResponseDTO(message.getMessage(), message.getPostedAt(), message.getPostedBy()); + } + + @Override + public List getAllMessages() { + return messageRepository.findAllByOrderByPostedAtAsc().stream().map(message -> convertMessageToMessageResponseDTO(message)).collect(Collectors.toList()); + } + + @Override + public boolean createMessage(MessageRequestDTO messageRequestDTO) { + try { + messageRepository.save(new Message(messageRequestDTO.getMessage(), messageRequestDTO.getPostedBy())); + return true; + } + catch (Exception e) { + return false; + } + } + +} From a6e9b41059541efbd61ea499f45d727a0b7c9685 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 19:14:00 +0530 Subject: [PATCH 265/464] Create IMessageService.java --- .../cp/doconnectchat/service/IMessageService.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/service/IMessageService.java diff --git a/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/service/IMessageService.java b/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/service/IMessageService.java new file mode 100644 index 0000000..d117d89 --- /dev/null +++ b/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/service/IMessageService.java @@ -0,0 +1,14 @@ +package com.wipro.cp.doconnectchat.service; + +import java.util.List; + +import com.wipro.cp.doconnectchat.dto.MessageRequestDTO; +import com.wipro.cp.doconnectchat.dto.MessageResponseDTO; + +public interface IMessageService { + + public List getAllMessages(); + + public boolean createMessage(MessageRequestDTO messageRequestDTO); + +} From 628b90562593d84adf4568f281fb92e157192ef0 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 19:14:02 +0530 Subject: [PATCH 266/464] Create MessageRepository.java --- .../repository/MessageRepository.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/repository/MessageRepository.java diff --git a/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/repository/MessageRepository.java b/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/repository/MessageRepository.java new file mode 100644 index 0000000..5b531c7 --- /dev/null +++ b/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/repository/MessageRepository.java @@ -0,0 +1,15 @@ +package com.wipro.cp.doconnectchat.repository; + +import java.util.List; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import com.wipro.cp.doconnectchat.entity.Message; + +@Repository +public interface MessageRepository extends JpaRepository { + + List findAllByOrderByPostedAtAsc(); + +} From c2dd74509c7bbc8da7704763b560102033ec9d0e Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 19:14:10 +0530 Subject: [PATCH 267/464] Create Message.java --- .../cp/doconnectchat/entity/Message.java | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/entity/Message.java diff --git a/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/entity/Message.java b/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/entity/Message.java new file mode 100644 index 0000000..1990adb --- /dev/null +++ b/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/entity/Message.java @@ -0,0 +1,72 @@ +package com.wipro.cp.doconnectchat.entity; + +import java.util.Date; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +import org.hibernate.annotations.CreationTimestamp; + +@Entity +@Table(name="messages") +public class Message { + + @Id + @GeneratedValue(strategy=GenerationType.IDENTITY) + private Long id; + + @NotNull + @NotEmpty + @Size(max = 512) + private String message; + + @Column(nullable = false, updatable = false) + @CreationTimestamp + private Date postedAt; + + @NotNull + @NotEmpty + private String postedBy; + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getPostedBy() { + return postedBy; + } + + public void setPostedBy(String postedBy) { + this.postedBy = postedBy; + } + + public Long getId() { + return id; + } + + public Date getPostedAt() { + return postedAt; + } + + public Message(@NotNull @NotEmpty @Size(max = 512) String message, @NotNull @NotEmpty String postedBy) { + super(); + this.message = message; + this.postedBy = postedBy; + } + + public Message() { + super(); + } + +} From 1477c544c5c0618d68fb4e6774314b876db936ea Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 19:14:13 +0530 Subject: [PATCH 268/464] Create MessageResponseDTO.java --- .../doconnectchat/dto/MessageResponseDTO.java | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/dto/MessageResponseDTO.java diff --git a/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/dto/MessageResponseDTO.java b/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/dto/MessageResponseDTO.java new file mode 100644 index 0000000..c94c477 --- /dev/null +++ b/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/dto/MessageResponseDTO.java @@ -0,0 +1,36 @@ +package com.wipro.cp.doconnectchat.dto; + +import java.util.Date; + +public class MessageResponseDTO { + + private String message; + + private Date postedAt; + + private String postedBy; + + public String getMessage() { + return message; + } + + public Date getPostedAt() { + return postedAt; + } + + public String getPostedBy() { + return postedBy; + } + + public MessageResponseDTO(String message, Date postedAt, String postedBy) { + super(); + this.message = message; + this.postedAt = postedAt; + this.postedBy = postedBy; + } + + public MessageResponseDTO() { + super(); + } + +} From 8c4214590e7112516715b7791b5aefdf79c6a22d Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 19:14:16 +0530 Subject: [PATCH 269/464] Create MessageRequestDTO.java --- .../doconnectchat/dto/MessageRequestDTO.java | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/dto/MessageRequestDTO.java diff --git a/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/dto/MessageRequestDTO.java b/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/dto/MessageRequestDTO.java new file mode 100644 index 0000000..02148a9 --- /dev/null +++ b/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/dto/MessageRequestDTO.java @@ -0,0 +1,35 @@ +package com.wipro.cp.doconnectchat.dto; + +public class MessageRequestDTO { + + private String message; + + private String postedBy; + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getPostedBy() { + return postedBy; + } + + public void setPostedBy(String postedBy) { + this.postedBy = postedBy; + } + + public MessageRequestDTO(String message, String postedBy) { + super(); + this.message = message; + this.postedBy = postedBy; + } + + public MessageRequestDTO() { + super(); + } + +} From 7ca7991e298eb734d01289a4973eb0c895adeaec Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 19:14:19 +0530 Subject: [PATCH 270/464] Create DoConnectChatApplication.java --- .../cp/doconnectchat/DoConnectChatApplication.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/DoConnectChatApplication.java diff --git a/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/DoConnectChatApplication.java b/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/DoConnectChatApplication.java new file mode 100644 index 0000000..d89a36f --- /dev/null +++ b/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/DoConnectChatApplication.java @@ -0,0 +1,13 @@ +package com.wipro.cp.doconnectchat; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class DoConnectChatApplication { + + public static void main(String[] args) { + SpringApplication.run(DoConnectChatApplication.class, args); + } + +} From 5febca7492086fa5d2fd3fc77bc603119338896a Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 19:14:22 +0530 Subject: [PATCH 271/464] Create MessageController.java --- .../controller/MessageController.java | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/controller/MessageController.java diff --git a/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/controller/MessageController.java b/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/controller/MessageController.java new file mode 100644 index 0000000..0bbc3a9 --- /dev/null +++ b/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/controller/MessageController.java @@ -0,0 +1,43 @@ +package com.wipro.cp.doconnectchat.controller; + +import java.util.List; + +import javax.validation.Valid; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.wipro.cp.doconnectchat.dto.MessageRequestDTO; +import com.wipro.cp.doconnectchat.dto.MessageResponseDTO; +import com.wipro.cp.doconnectchat.service.MessageServiceImp; + +@RestController +@RequestMapping("/api/v1") +public class MessageController { + + @Autowired + private MessageServiceImp messageServiceImp; + + @GetMapping("/messages") + public ResponseEntity> getAllMessages() { + return ResponseEntity.ok(messageServiceImp.getAllMessages()); + } + + @PostMapping("/messages") + public ResponseEntity createMessage(@Valid @RequestBody MessageRequestDTO messageRequestDTO) { + boolean status = messageServiceImp.createMessage(messageRequestDTO); + if (status) { + return ResponseEntity.status(HttpStatus.CREATED).body(messageServiceImp.getAllMessages()); + } + else { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Failed to send message."); + } + } + +} From d2c74146287858c66611c2862b46e1979ea00d99 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 19:14:30 +0530 Subject: [PATCH 272/464] Create pom.xml --- do_connect_backend/DoConnectChat/pom.xml | 58 ++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 do_connect_backend/DoConnectChat/pom.xml diff --git a/do_connect_backend/DoConnectChat/pom.xml b/do_connect_backend/DoConnectChat/pom.xml new file mode 100644 index 0000000..3cd3971 --- /dev/null +++ b/do_connect_backend/DoConnectChat/pom.xml @@ -0,0 +1,58 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.7.3 + + + com.wipro.cp + doconnectchat + 0.0.1-SNAPSHOT + DoConnectChat + Chat Microservice for DoConnect Capstone Project + + 17 + + + + org.springframework.boot + spring-boot-starter-actuator + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-web + + + + mysql + mysql-connector-java + runtime + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.boot + spring-boot-starter-validation + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + From a0282a74e1aa34c1b37cdaafdca4594589feb51a Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 19:16:07 +0530 Subject: [PATCH 273/464] Create .gitignore --- do_connect_backend/DoConnectChat/.gitignore | 39 +++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 do_connect_backend/DoConnectChat/.gitignore diff --git a/do_connect_backend/DoConnectChat/.gitignore b/do_connect_backend/DoConnectChat/.gitignore new file mode 100644 index 0000000..5361a7c --- /dev/null +++ b/do_connect_backend/DoConnectChat/.gitignore @@ -0,0 +1,39 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Misc ### +mvnw +mvnw.cmd +maven-wrapper.jar +maven-wrapper.properties From 1d1f7fedacd5db50f1545bb7d17b99c30ed6a57d Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 19:16:50 +0530 Subject: [PATCH 274/464] Create application.properties --- .../src/main/resources/application.properties | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 do_connect_backend/DoConnectChat/src/main/resources/application.properties diff --git a/do_connect_backend/DoConnectChat/src/main/resources/application.properties b/do_connect_backend/DoConnectChat/src/main/resources/application.properties new file mode 100644 index 0000000..229ad54 --- /dev/null +++ b/do_connect_backend/DoConnectChat/src/main/resources/application.properties @@ -0,0 +1,12 @@ +server.port=9191 + +spring.datasource.url=jdbc:mysql://localhost:3306/do_connect?createDatabaseIfNotExist=true&useSSL=false +spring.datasource.username= +spring.datasource.password= +spring.jpa.hibernate.ddl-auto=update +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect +spring.jpa.open-in-view=false + +spring.main.allow-circular-references=true + +spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true From eaacac2d9d7d9b5e74d95b5e2b0be67e70c0f21e Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 20:41:25 +0530 Subject: [PATCH 275/464] Update application.properties --- .../DoConnect/src/main/resources/application.properties | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/do_connect_backend/DoConnect/src/main/resources/application.properties b/do_connect_backend/DoConnect/src/main/resources/application.properties index bec391d..5a80ad4 100644 --- a/do_connect_backend/DoConnect/src/main/resources/application.properties +++ b/do_connect_backend/DoConnect/src/main/resources/application.properties @@ -25,4 +25,6 @@ jwt.token-validity-time=10800 image-storage-directory=/do_connect_images valid-image-extensions=png,jpeg -enable-notification-emails=false \ No newline at end of file +enable-notification-emails=false + +chat-microservice-base-url=http://localhost:9191 From 57b3ba31de7fe6cdef9d2b9fad227db6a882f3c2 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 20:41:45 +0530 Subject: [PATCH 276/464] Update AuthorizationInterceptor.java --- .../cp/doconnect/interceptor/AuthorizationInterceptor.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/interceptor/AuthorizationInterceptor.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/interceptor/AuthorizationInterceptor.java index e1172c8..6eaca4d 100644 --- a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/interceptor/AuthorizationInterceptor.java +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/interceptor/AuthorizationInterceptor.java @@ -73,6 +73,13 @@ else if (currentURI.equalsIgnoreCase("/api/v1/register") || currentURI.equalsIgn else if (currentURI.equalsIgnoreCase("/api/v1/answers") && HttpMethod.GET.matches(currentMethod) && isUserAdmin) { return true; } + else if ( + currentURI.equalsIgnoreCase("/api/v1/messages") && + (HttpMethod.GET.matches(currentMethod) || HttpMethod.POST.matches(currentMethod)) && + !isUserAdmin + ) { + return true; + } else if ( currentURI.toLowerCase().startsWith("/api/v1/users") && (HttpMethod.GET.matches(currentMethod) || HttpMethod.POST.matches(currentMethod) || HttpMethod.PUT.matches(currentMethod) || HttpMethod.DELETE.matches(currentMethod)) From 989050ec28e46d69f1e682949c92823adbc59532 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 20:41:50 +0530 Subject: [PATCH 277/464] Create ChatMessageRequestDTO.java --- .../doconnect/dto/ChatMessageRequestDTO.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/ChatMessageRequestDTO.java diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/ChatMessageRequestDTO.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/ChatMessageRequestDTO.java new file mode 100644 index 0000000..790d88a --- /dev/null +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/ChatMessageRequestDTO.java @@ -0,0 +1,20 @@ +package com.wipro.cp.doconnect.dto; + +public class ChatMessageRequestDTO { + + private String message; + + public String getMessage() { + return message; + } + + public ChatMessageRequestDTO(String message) { + super(); + this.message = message; + } + + public ChatMessageRequestDTO() { + super(); + } + +} From 71675458342ab85f695a0902b0e65e4bda3e5569 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 20:41:55 +0530 Subject: [PATCH 278/464] Create ChatMessageDTO.java --- .../cp/doconnect/dto/ChatMessageDTO.java | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/ChatMessageDTO.java diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/ChatMessageDTO.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/ChatMessageDTO.java new file mode 100644 index 0000000..c6a05c9 --- /dev/null +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/dto/ChatMessageDTO.java @@ -0,0 +1,35 @@ +package com.wipro.cp.doconnect.dto; + +public class ChatMessageDTO { + + private String message; + + private String postedBy; + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getPostedBy() { + return postedBy; + } + + public void setPostedBy(String postedBy) { + this.postedBy = postedBy; + } + + public ChatMessageDTO(String message, String postedBy) { + super(); + this.message = message; + this.postedBy = postedBy; + } + + public ChatMessageDTO() { + super(); + } + +} From cd317114b6d8975e88b8a1acdf64ad6af6cec1c3 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 20:41:59 +0530 Subject: [PATCH 279/464] Update DoConnectApplication.java --- .../java/com/wipro/cp/doconnect/DoConnectApplication.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/DoConnectApplication.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/DoConnectApplication.java index 00f9b20..46bbf29 100644 --- a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/DoConnectApplication.java +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/DoConnectApplication.java @@ -2,6 +2,8 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; +import org.springframework.web.client.RestTemplate; @SpringBootApplication public class DoConnectApplication { @@ -9,5 +11,10 @@ public class DoConnectApplication { public static void main(String[] args) { SpringApplication.run(DoConnectApplication.class, args); } + + @Bean + public RestTemplate getRestTemplate() { + return new RestTemplate(); + } } From 3eee51ed40a3dc91674e4611ca39e32c608516c9 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 20:42:05 +0530 Subject: [PATCH 280/464] Create ChatController.java --- .../doconnect/controller/ChatController.java | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/ChatController.java diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/ChatController.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/ChatController.java new file mode 100644 index 0000000..d395f08 --- /dev/null +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/ChatController.java @@ -0,0 +1,48 @@ +package com.wipro.cp.doconnect.controller; + +import java.util.List; + +import javax.validation.Valid; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpHeaders; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.client.RestTemplate; + +import com.wipro.cp.doconnect.dto.ChatMessageDTO; +import com.wipro.cp.doconnect.dto.ChatMessageRequestDTO; +import com.wipro.cp.doconnect.util.Utilities; + +@RestController +@RequestMapping("/api/v1") +public class ChatController { + + @Value("${chat-microservice-base-url}") + private String chatMicroserviceBaseUrl; + + @Autowired + private RestTemplate restTemplate; + + @Autowired + private Utilities utilities; + + @GetMapping("/messages") + public ResponseEntity getAllChatMessages() { + return restTemplate.getForEntity(chatMicroserviceBaseUrl + "/api/v1/messages", List.class); + } + + @PostMapping("/messages") + public ResponseEntity createQuestion(@Valid @RequestBody ChatMessageRequestDTO chatMessageRequestDTO, @RequestHeader(HttpHeaders.AUTHORIZATION) String authorizationHeader) { + String postedBy = utilities.getUsernameFromAuthorizationHeader(authorizationHeader); + ChatMessageDTO chatMessageDTO = new ChatMessageDTO(chatMessageRequestDTO.getMessage(), postedBy); + return restTemplate.postForEntity(chatMicroserviceBaseUrl + "/api/v1/messages", chatMessageDTO, List.class); + } + +} From 108fb210fc75d2389bcc2cec6591534a1aa87cf8 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 20:42:09 +0530 Subject: [PATCH 281/464] Create DoConnect Capstone Project.postman_collection.json --- ...t Capstone Project.postman_collection.json | 900 ++++++++++++++++++ 1 file changed, 900 insertions(+) create mode 100644 do_connect_backend/DoConnect Capstone Project.postman_collection.json diff --git a/do_connect_backend/DoConnect Capstone Project.postman_collection.json b/do_connect_backend/DoConnect Capstone Project.postman_collection.json new file mode 100644 index 0000000..ab9d117 --- /dev/null +++ b/do_connect_backend/DoConnect Capstone Project.postman_collection.json @@ -0,0 +1,900 @@ +{ + "info": { + "_postman_id": "5c14346b-ea3d-403a-984d-fb02cd7a6ed8", + "name": "DoConnect Capstone Project", + "description": "DoConnect Capstone Project REST API Endpoints details.", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", + "_exporter_id": "22619752" + }, + "item": [ + { + "name": "Register Admin", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\r\n \"username\": \"Devashish\",\r\n \"password\": \"password\",\r\n \"email\": \"devashishpathrabe@gmail.com\",\r\n \"name\": \"Devashish\",\r\n \"isAdmin\": true\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://localhost:9090/api/v1/register", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "9090", + "path": [ + "api", + "v1", + "register" + ] + } + }, + "response": [] + }, + { + "name": "Login Admin", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\r\n \"username\": \"Devashish\",\r\n \"password\": \"password\"\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://localhost:9090/api/v1/login", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "9090", + "path": [ + "api", + "v1", + "login" + ] + } + }, + "response": [] + }, + { + "name": "Logout Admin", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJEZXZhc2hpc2giLCJuYW1lIjoiRGV2YXNoaXNoIiwiaXNBZG1pbiI6dHJ1ZSwiZXhwIjoxNjYxNDY0MzUzLCJpYXQiOjE2NjE0NTM1NTMsImVtYWlsIjoiZGV2YXNoaXNocGF0aHJhYmVAZ21haWwuY29tIn0.ZqAOlFNGFhKbQp-AiRze_UUrE5bsQmR5woXtSshfTfzfnDhD6zPzGupHCT5ZxNCCj9DTijeCIPbzQ7uh-f4D6g", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "http://localhost:9090/api/v1/signout", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "9090", + "path": [ + "api", + "v1", + "signout" + ] + } + }, + "response": [] + }, + { + "name": "Register User", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\r\n \"username\": \"TestUser\",\r\n \"password\": \"password\",\r\n \"email\": \"testuser01@gmail.com\",\r\n \"name\": \"Test User\",\r\n \"isAdmin\": false\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://localhost:9090/api/v1/register", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "9090", + "path": [ + "api", + "v1", + "register" + ] + } + }, + "response": [] + }, + { + "name": "Login User", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\r\n \"username\": \"TestUser\",\r\n \"password\": \"password\"\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://localhost:9090/api/v1/login", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "9090", + "path": [ + "api", + "v1", + "login" + ] + } + }, + "response": [] + }, + { + "name": "Logout User", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJUZXN0VXNlciIsIm5hbWUiOiJUZXN0IFVzZXIiLCJpc0FkbWluIjpmYWxzZSwiZXhwIjoxNjYxNDY0NjI5LCJpYXQiOjE2NjE0NTM4MjksImVtYWlsIjoidGVzdHVzZXIwMUBnbWFpbC5jb20ifQ.jWHYw9YwDqoeMeE_8dqjUiz_6MMFjkHI_BjY0YU0yAxqgO95FpjMzzmXYrUE2ynvzj-6l_F1iQGy1lMruFLp2g", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "http://localhost:9090/api/v1/signout", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "9090", + "path": [ + "api", + "v1", + "signout" + ] + } + }, + "response": [] + }, + { + "name": "All Approved Questions", + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJEZXZhc2hpc2giLCJuYW1lIjoiRGV2YXNoaXNoIiwiaXNBZG1pbiI6dHJ1ZSwiZXhwIjoxNjYxNTAyMjQ0LCJpYXQiOjE2NjE0OTE0NDQsImVtYWlsIjoiZGV2YXNoaXNocGF0aHJhYmVAZ21haWwuY29tIn0.kQ_uHmtG3ru9_4X5mgl3xpw-nmxKsNmWECF-3DcxzmarCd6EpZITVHNwCbGL_rNeV8tMHsKdNv73FHg-mxwBDg", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "body": { + "mode": "raw", + "raw": "", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://localhost:9090/api/v1/questions", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "9090", + "path": [ + "api", + "v1", + "questions" + ] + } + }, + "response": [] + }, + { + "name": "Create Question User", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJUZXN0VXNlciIsIm5hbWUiOiJUZXN0IFVzZXIiLCJpc0FkbWluIjpmYWxzZSwiZXhwIjoxNjYxNTA3Nzc4LCJpYXQiOjE2NjE0OTY5NzgsImVtYWlsIjoidGVzdHVzZXIwMUBnbWFpbC5jb20ifQ.YAjl_dumDZ6I-Ih3zV6O5r3rR1mvBozQ3V0NU4gUJEV9BwYFy-mzs32TxpHvwQRBAy1f9vMJB_HjTi0r8al10A", + "type": "string" + } + ] + }, + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\r\n \"question\": \"What is your name?\",\r\n \"topic\": \"General\",\r\n \"images\": []\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://localhost:9090/api/v1/questions", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "9090", + "path": [ + "api", + "v1", + "questions" + ] + } + }, + "response": [] + }, + { + "name": "Unapproved Questions List Admin", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJEZXZhc2hpc2giLCJuYW1lIjoiRGV2YXNoaXNoIiwiaXNBZG1pbiI6dHJ1ZSwiZXhwIjoxNjYxNTA4NTcyLCJpYXQiOjE2NjE0OTc3NzIsImVtYWlsIjoiZGV2YXNoaXNocGF0aHJhYmVAZ21haWwuY29tIn0.cImUJQjeYHJQ9FeIgbSzYh1CEi6b0HKJsZRow_dF1awjU13fj6lBsQNbbTiX-bzqx4GSQhrJJYOyxwSd6jdalQ", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "http://localhost:9090/api/v1/questions?status=unapproved", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "9090", + "path": [ + "api", + "v1", + "questions" + ], + "query": [ + { + "key": "status", + "value": "unapproved" + } + ] + } + }, + "response": [] + }, + { + "name": "Approve Question Admin", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJEZXZhc2hpc2giLCJuYW1lIjoiRGV2YXNoaXNoIiwiaXNBZG1pbiI6dHJ1ZSwiZXhwIjoxNjYxNTA4NTcyLCJpYXQiOjE2NjE0OTc3NzIsImVtYWlsIjoiZGV2YXNoaXNocGF0aHJhYmVAZ21haWwuY29tIn0.cImUJQjeYHJQ9FeIgbSzYh1CEi6b0HKJsZRow_dF1awjU13fj6lBsQNbbTiX-bzqx4GSQhrJJYOyxwSd6jdalQ", + "type": "string" + } + ] + }, + "method": "PUT", + "header": [], + "body": { + "mode": "raw", + "raw": "{\r\n \"isApproved\": true\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://localhost:9090/api/v1/questions/1", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "9090", + "path": [ + "api", + "v1", + "questions", + "1" + ] + } + }, + "response": [] + }, + { + "name": "Approved Questions List - User and Admin", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJUZXN0VXNlciIsIm5hbWUiOiJUZXN0IFVzZXIiLCJpc0FkbWluIjpmYWxzZSwiZXhwIjoxNjYxNTA3Nzc4LCJpYXQiOjE2NjE0OTY5NzgsImVtYWlsIjoidGVzdHVzZXIwMUBnbWFpbC5jb20ifQ.YAjl_dumDZ6I-Ih3zV6O5r3rR1mvBozQ3V0NU4gUJEV9BwYFy-mzs32TxpHvwQRBAy1f9vMJB_HjTi0r8al10A", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "http://localhost:9090/api/v1/questions?status=approved", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "9090", + "path": [ + "api", + "v1", + "questions" + ], + "query": [ + { + "key": "status", + "value": "approved" + } + ] + } + }, + "response": [] + }, + { + "name": "Approved Questions List by Status Approved and Search - User", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJUZXN0VXNlciIsIm5hbWUiOiJUZXN0IFVzZXIiLCJpc0FkbWluIjpmYWxzZSwiZXhwIjoxNjYxNTA3Nzc4LCJpYXQiOjE2NjE0OTY5NzgsImVtYWlsIjoidGVzdHVzZXIwMUBnbWFpbC5jb20ifQ.YAjl_dumDZ6I-Ih3zV6O5r3rR1mvBozQ3V0NU4gUJEV9BwYFy-mzs32TxpHvwQRBAy1f9vMJB_HjTi0r8al10A", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "http://localhost:9090/api/v1/questions?status=approved&search=your", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "9090", + "path": [ + "api", + "v1", + "questions" + ], + "query": [ + { + "key": "status", + "value": "approved" + }, + { + "key": "search", + "value": "your" + } + ] + } + }, + "response": [] + }, + { + "name": "All Questions List - Admin", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJEZXZhc2hpc2giLCJuYW1lIjoiRGV2YXNoaXNoIiwiaXNBZG1pbiI6dHJ1ZSwiZXhwIjoxNjYxNTA4NTcyLCJpYXQiOjE2NjE0OTc3NzIsImVtYWlsIjoiZGV2YXNoaXNocGF0aHJhYmVAZ21haWwuY29tIn0.cImUJQjeYHJQ9FeIgbSzYh1CEi6b0HKJsZRow_dF1awjU13fj6lBsQNbbTiX-bzqx4GSQhrJJYOyxwSd6jdalQ", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "http://localhost:9090/api/v1/questions?status=all", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "9090", + "path": [ + "api", + "v1", + "questions" + ], + "query": [ + { + "key": "status", + "value": "all" + } + ] + } + }, + "response": [] + }, + { + "name": "Questions List by Search - User", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJUZXN0VXNlciIsIm5hbWUiOiJUZXN0IFVzZXIiLCJpc0FkbWluIjpmYWxzZSwiZXhwIjoxNjYxNTA3Nzc4LCJpYXQiOjE2NjE0OTY5NzgsImVtYWlsIjoidGVzdHVzZXIwMUBnbWFpbC5jb20ifQ.YAjl_dumDZ6I-Ih3zV6O5r3rR1mvBozQ3V0NU4gUJEV9BwYFy-mzs32TxpHvwQRBAy1f9vMJB_HjTi0r8al10A", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "http://localhost:9090/api/v1/questions?search=your", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "9090", + "path": [ + "api", + "v1", + "questions" + ], + "query": [ + { + "key": "search", + "value": "your" + } + ] + } + }, + "response": [] + }, + { + "name": "Create Answer - User", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJUZXN0VXNlciIsIm5hbWUiOiJUZXN0IFVzZXIiLCJpc0FkbWluIjpmYWxzZSwiZXhwIjoxNjYxNTA3Nzc4LCJpYXQiOjE2NjE0OTY5NzgsImVtYWlsIjoidGVzdHVzZXIwMUBnbWFpbC5jb20ifQ.YAjl_dumDZ6I-Ih3zV6O5r3rR1mvBozQ3V0NU4gUJEV9BwYFy-mzs32TxpHvwQRBAy1f9vMJB_HjTi0r8al10A", + "type": "string" + } + ] + }, + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\r\n \"answer\": \"Devashish\",\r\n \"images\": []\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://localhost:9090/api/v1/questions/1/answers", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "9090", + "path": [ + "api", + "v1", + "questions", + "1", + "answers" + ] + } + }, + "response": [] + }, + { + "name": "Unapproved Answers List for Question - Admin", + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJEZXZhc2hpc2giLCJuYW1lIjoiRGV2YXNoaXNoIiwiaXNBZG1pbiI6dHJ1ZSwiZXhwIjoxNjYxNTA4NTcyLCJpYXQiOjE2NjE0OTc3NzIsImVtYWlsIjoiZGV2YXNoaXNocGF0aHJhYmVAZ21haWwuY29tIn0.cImUJQjeYHJQ9FeIgbSzYh1CEi6b0HKJsZRow_dF1awjU13fj6lBsQNbbTiX-bzqx4GSQhrJJYOyxwSd6jdalQ", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "body": { + "mode": "raw", + "raw": "", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://localhost:9090/api/v1/questions/1/answers?status=unapproved", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "9090", + "path": [ + "api", + "v1", + "questions", + "1", + "answers" + ], + "query": [ + { + "key": "status", + "value": "unapproved" + } + ] + } + }, + "response": [] + }, + { + "name": "Approve Answer of Question - Admin", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJEZXZhc2hpc2giLCJuYW1lIjoiRGV2YXNoaXNoIiwiaXNBZG1pbiI6dHJ1ZSwiZXhwIjoxNjYxNTA4NTcyLCJpYXQiOjE2NjE0OTc3NzIsImVtYWlsIjoiZGV2YXNoaXNocGF0aHJhYmVAZ21haWwuY29tIn0.cImUJQjeYHJQ9FeIgbSzYh1CEi6b0HKJsZRow_dF1awjU13fj6lBsQNbbTiX-bzqx4GSQhrJJYOyxwSd6jdalQ", + "type": "string" + } + ] + }, + "method": "PUT", + "header": [], + "body": { + "mode": "raw", + "raw": "{\r\n \"isApproved\": true\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://localhost:9090/api/v1/questions/1/answers/1", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "9090", + "path": [ + "api", + "v1", + "questions", + "1", + "answers", + "1" + ] + } + }, + "response": [] + }, + { + "name": "All Answers List - Admin", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJEZXZhc2hpc2giLCJuYW1lIjoiRGV2YXNoaXNoIiwiaXNBZG1pbiI6dHJ1ZSwiZXhwIjoxNjYxNTA4NTcyLCJpYXQiOjE2NjE0OTc3NzIsImVtYWlsIjoiZGV2YXNoaXNocGF0aHJhYmVAZ21haWwuY29tIn0.cImUJQjeYHJQ9FeIgbSzYh1CEi6b0HKJsZRow_dF1awjU13fj6lBsQNbbTiX-bzqx4GSQhrJJYOyxwSd6jdalQ", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "http://localhost:9090/api/v1/answers", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "9090", + "path": [ + "api", + "v1", + "answers" + ] + } + }, + "response": [] + }, + { + "name": "Approved Answers List of Question - User", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJUZXN0VXNlciIsIm5hbWUiOiJUZXN0IFVzZXIiLCJpc0FkbWluIjpmYWxzZSwiZXhwIjoxNjYxNTA3Nzc4LCJpYXQiOjE2NjE0OTY5NzgsImVtYWlsIjoidGVzdHVzZXIwMUBnbWFpbC5jb20ifQ.YAjl_dumDZ6I-Ih3zV6O5r3rR1mvBozQ3V0NU4gUJEV9BwYFy-mzs32TxpHvwQRBAy1f9vMJB_HjTi0r8al10A", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "http://localhost:9090/api/v1/questions/1/answers?status=approved", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "9090", + "path": [ + "api", + "v1", + "questions", + "1", + "answers" + ], + "query": [ + { + "key": "status", + "value": "approved" + } + ] + } + }, + "response": [] + }, + { + "name": "All Answers List of Question - User", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJUZXN0VXNlciIsIm5hbWUiOiJUZXN0IFVzZXIiLCJpc0FkbWluIjpmYWxzZSwiZXhwIjoxNjYxNTA3Nzc4LCJpYXQiOjE2NjE0OTY5NzgsImVtYWlsIjoidGVzdHVzZXIwMUBnbWFpbC5jb20ifQ.YAjl_dumDZ6I-Ih3zV6O5r3rR1mvBozQ3V0NU4gUJEV9BwYFy-mzs32TxpHvwQRBAy1f9vMJB_HjTi0r8al10A", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "http://localhost:9090/api/v1/questions/1/answers", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "9090", + "path": [ + "api", + "v1", + "questions", + "1", + "answers" + ] + } + }, + "response": [] + }, + { + "name": "Delete Question - Admin", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJEZXZhc2hpc2giLCJuYW1lIjoiRGV2YXNoaXNoIiwiaXNBZG1pbiI6dHJ1ZSwiZXhwIjoxNjYxNTA4NTcyLCJpYXQiOjE2NjE0OTc3NzIsImVtYWlsIjoiZGV2YXNoaXNocGF0aHJhYmVAZ21haWwuY29tIn0.cImUJQjeYHJQ9FeIgbSzYh1CEi6b0HKJsZRow_dF1awjU13fj6lBsQNbbTiX-bzqx4GSQhrJJYOyxwSd6jdalQ", + "type": "string" + } + ] + }, + "method": "DELETE", + "header": [], + "body": { + "mode": "raw", + "raw": "", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://localhost:9090/api/v1/questions/1", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "9090", + "path": [ + "api", + "v1", + "questions", + "1" + ] + } + }, + "response": [] + }, + { + "name": "Delete Answer of Question - Admin", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJEZXZhc2hpc2giLCJuYW1lIjoiRGV2YXNoaXNoIiwiaXNBZG1pbiI6dHJ1ZSwiZXhwIjoxNjYxNTA4NTcyLCJpYXQiOjE2NjE0OTc3NzIsImVtYWlsIjoiZGV2YXNoaXNocGF0aHJhYmVAZ21haWwuY29tIn0.cImUJQjeYHJQ9FeIgbSzYh1CEi6b0HKJsZRow_dF1awjU13fj6lBsQNbbTiX-bzqx4GSQhrJJYOyxwSd6jdalQ", + "type": "string" + } + ] + }, + "method": "DELETE", + "header": [], + "body": { + "mode": "raw", + "raw": "", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://localhost:9090/api/v1/questions/3/answers/2", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "9090", + "path": [ + "api", + "v1", + "questions", + "3", + "answers", + "2" + ] + } + }, + "response": [] + }, + { + "name": "Send Chat Message - User", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJUZXN0VXNlciIsIm5hbWUiOiJUZXN0IFVzZXIiLCJpc0FkbWluIjpmYWxzZSwiZXhwIjoxNjYxNTM2ODE5LCJpYXQiOjE2NjE1MjYwMTksImVtYWlsIjoidGVzdHVzZXIwMUBnbWFpbC5jb20ifQ.xrbVYAA_6Tj2eJYxedBNO19C8RZTMEP9RkpLepDCOUTtkzhui53p-L1Our0LdA0beJ44DuMFRYAofILNOrr8Rw", + "type": "string" + } + ] + }, + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\r\n \"message\": \"Great to hear that.\",\r\n \"postedBy\": \"TestUser01\"\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://localhost:9090/api/v1/messages", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "9090", + "path": [ + "api", + "v1", + "messages" + ] + } + }, + "response": [] + }, + { + "name": "All Chat Messages List - User", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJUZXN0VXNlciIsIm5hbWUiOiJUZXN0IFVzZXIiLCJpc0FkbWluIjpmYWxzZSwiZXhwIjoxNjYxNTM2ODE5LCJpYXQiOjE2NjE1MjYwMTksImVtYWlsIjoidGVzdHVzZXIwMUBnbWFpbC5jb20ifQ.xrbVYAA_6Tj2eJYxedBNO19C8RZTMEP9RkpLepDCOUTtkzhui53p-L1Our0LdA0beJ44DuMFRYAofILNOrr8Rw", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "http://localhost:9090/api/v1/messages", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "9090", + "path": [ + "api", + "v1", + "messages" + ] + } + }, + "response": [] + } + ] +} \ No newline at end of file From 9589891ab5063342c3d40ee42768a562c82f45f1 Mon Sep 17 00:00:00 2001 From: Tapas_Saha <78211628+tapassaha-01@users.noreply.github.com> Date: Fri, 26 Aug 2022 20:51:39 +0530 Subject: [PATCH 282/464] Create README.md --- README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..406d0be --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# CapstoneProject_01 From d93d8290c3ef753ec21613fbe734a77a52295d2a Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 23:36:26 +0530 Subject: [PATCH 283/464] Update QuestionServiceImp.java --- .../wipro/cp/doconnect/service/QuestionServiceImp.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/QuestionServiceImp.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/QuestionServiceImp.java index 804aa49..5de0b04 100644 --- a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/QuestionServiceImp.java +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/QuestionServiceImp.java @@ -61,6 +61,15 @@ else if (status.equalsIgnoreCase("unapproved")) { } } + @Override + public StatusDTO getQuestionById(Long questionId) { + Optional optionalQuestion = questionRepository.findById(questionId); + if (optionalQuestion.isEmpty()) { + return new StatusDTO("Question with ID " + questionId + " does not exist.", false, null); + } + return new StatusDTO("", true, utilities.convertQuestionToQuestionResponseDTO(optionalQuestion.get())); + } + @Override public StatusDTO createQuestion(QuestionRequestDTO questionRequestDTO, String postedBy) { Question question = new Question(questionRequestDTO.getQuestion(), questionRequestDTO.getTopic(), questionRequestDTO.getImages(), postedBy); From 2044ef2ebce08301b91f3f2a89af9bc66f5f6ce7 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 23:36:29 +0530 Subject: [PATCH 284/464] Update IQuestionService.java --- .../java/com/wipro/cp/doconnect/service/IQuestionService.java | 1 + 1 file changed, 1 insertion(+) diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IQuestionService.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IQuestionService.java index 01cc092..2fe23bf 100644 --- a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IQuestionService.java +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IQuestionService.java @@ -10,6 +10,7 @@ public interface IQuestionService { public StatusDTO> getAllQuestions(String status, String search); + public StatusDTO getQuestionById(Long questionId); public StatusDTO createQuestion(QuestionRequestDTO questionRequestDTO, String postedBy); public StatusDTO updateQuestion(QuestionUpdateDTO questionUpdateDTO, Long questionId, String approvedBy); public StatusDTO deleteQuestionById(Long questionId); From b3477ccd0fe0fa592ca02f886ab486497b2307ff Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 23:36:32 +0530 Subject: [PATCH 285/464] Update AuthorizationInterceptor.java --- .../cp/doconnect/interceptor/AuthorizationInterceptor.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/interceptor/AuthorizationInterceptor.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/interceptor/AuthorizationInterceptor.java index b9aa200..c3cf381 100644 --- a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/interceptor/AuthorizationInterceptor.java +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/interceptor/AuthorizationInterceptor.java @@ -160,7 +160,10 @@ else if (uriParts.length == 5) { ) { return true; } - else { + else if (uriParts[3].equalsIgnoreCase("questions") && HttpMethod.GET.matches(currentMethod)) { + return true; + } + else{ response.sendError(HttpStatus.FORBIDDEN.value()); return false; } From fcd546c3abd29c3dd204fe7a7dc93c02df8b5443 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 23:36:35 +0530 Subject: [PATCH 286/464] Update QuestionController.java --- .../cp/doconnect/controller/QuestionController.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/QuestionController.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/QuestionController.java index 73a34e7..47268f4 100644 --- a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/QuestionController.java +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/QuestionController.java @@ -57,6 +57,15 @@ public ResponseEntity getAllQuestions(@RequestParam(name="status") Optional getQuestionById(@PathVariable Long questionId) { + StatusDTO questionStatus = questionServiceImp.getQuestionById(questionId); + if (!questionStatus.getIsValid()) { + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(questionStatus.getStatusMessage()); + } + return ResponseEntity.ok(questionStatus.getObject()); + } + @PostMapping("/questions") public ResponseEntity createQuestion(@Valid @RequestBody QuestionRequestDTO questionRequestDTO, @RequestHeader(HttpHeaders.AUTHORIZATION) String authorizationHeader) { String postedBy = utilities.getUsernameFromAuthorizationHeader(authorizationHeader); From 4a09bdb047b983a7ce925ded83e05a725423bd7f Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 23:36:39 +0530 Subject: [PATCH 287/464] Update SimpleCORSFilter.java --- .../java/com/wipro/cp/doconnect/component/SimpleCORSFilter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/component/SimpleCORSFilter.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/component/SimpleCORSFilter.java index 314f3a8..442e046 100644 --- a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/component/SimpleCORSFilter.java +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/component/SimpleCORSFilter.java @@ -23,7 +23,7 @@ public void doFilter(ServletRequest request, ServletResponse response, FilterCha httpResponse.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE"); httpResponse.setHeader("Access-Control-Max-Age", "3600"); httpResponse.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, remember-me"); - httpResponse.setHeader("Access-Control-Expose-Headers", "Location"); + httpResponse.setHeader("Access-Control-Expose-Headers", "Location, Authorization"); if ("OPTIONS".equalsIgnoreCase(((HttpServletRequest) request).getMethod())) { httpResponse.setStatus(HttpServletResponse.SC_OK); } else { From 223d115fa147735d61f6eb5b08983f0c9cc52997 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Fri, 26 Aug 2022 23:39:01 +0530 Subject: [PATCH 288/464] Update DoConnect Capstone Project.postman_collection.json --- ...t Capstone Project.postman_collection.json | 36 +++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/do_connect_backend/DoConnect Capstone Project.postman_collection.json b/do_connect_backend/DoConnect Capstone Project.postman_collection.json index ab9d117..b21fc87 100644 --- a/do_connect_backend/DoConnect Capstone Project.postman_collection.json +++ b/do_connect_backend/DoConnect Capstone Project.postman_collection.json @@ -232,6 +232,38 @@ }, "response": [] }, + { + "name": "Question by ID - User and Admin", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJUZXN0VXNlciIsIm5hbWUiOiJUZXN0IFVzZXIiLCJpc0FkbWluIjpmYWxzZSwiZXhwIjoxNjYxNTQ3NzcwLCJpYXQiOjE2NjE1MzY5NzAsImVtYWlsIjoidGVzdHVzZXIwMUBnbWFpbC5jb20ifQ.r0g3q6DqjWl7oEDI9m-9YUYsMDfAsInY7zpnSQchrb0WKjAd5eKqr_3wyYEdwyOHwyt8EYwWfu7nwq7QhcFKnA", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "http://localhost:9090/api/v1/questions/4", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "9090", + "path": [ + "api", + "v1", + "questions", + "4" + ] + } + }, + "response": [] + }, { "name": "Create Question User", "request": { @@ -240,7 +272,7 @@ "bearer": [ { "key": "token", - "value": "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJUZXN0VXNlciIsIm5hbWUiOiJUZXN0IFVzZXIiLCJpc0FkbWluIjpmYWxzZSwiZXhwIjoxNjYxNTA3Nzc4LCJpYXQiOjE2NjE0OTY5NzgsImVtYWlsIjoidGVzdHVzZXIwMUBnbWFpbC5jb20ifQ.YAjl_dumDZ6I-Ih3zV6O5r3rR1mvBozQ3V0NU4gUJEV9BwYFy-mzs32TxpHvwQRBAy1f9vMJB_HjTi0r8al10A", + "value": "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJUZXN0VXNlciIsIm5hbWUiOiJUZXN0IFVzZXIiLCJpc0FkbWluIjpmYWxzZSwiZXhwIjoxNjYxNTQ3NzcwLCJpYXQiOjE2NjE1MzY5NzAsImVtYWlsIjoidGVzdHVzZXIwMUBnbWFpbC5jb20ifQ.r0g3q6DqjWl7oEDI9m-9YUYsMDfAsInY7zpnSQchrb0WKjAd5eKqr_3wyYEdwyOHwyt8EYwWfu7nwq7QhcFKnA", "type": "string" } ] @@ -249,7 +281,7 @@ "header": [], "body": { "mode": "raw", - "raw": "{\r\n \"question\": \"What is your name?\",\r\n \"topic\": \"General\",\r\n \"images\": []\r\n}", + "raw": "{\r\n \"question\": \"Which is tallest statue in the world?\",\r\n \"topic\": \"General Knowledge\",\r\n \"images\": []\r\n}", "options": { "raw": { "language": "json" From db799f74bf698be3f0c7059ce0d6d899e20f3311 Mon Sep 17 00:00:00 2001 From: ravi0818 Date: Fri, 26 Aug 2022 23:53:35 +0530 Subject: [PATCH 289/464] services updated --- do_connect_frontend/angular.json | 3 + do_connect_frontend/src/app/app.component.ts | 2 + .../src/app/chat/chat.component.html | 14 ++++- .../src/app/chat/chat.component.ts | 9 +-- .../src/app/constants/constants.ts | 1 + .../app/dashboard/dashboard.component.html | 4 +- .../src/app/dashboard/dashboard.component.ts | 8 +-- .../src/app/login/login.component.ts | 14 +++-- .../src/app/service/admin.service.ts | 57 +++++++++++++++---- .../src/app/service/upload-files.service.ts | 3 +- .../src/app/service/user.service.ts | 20 ++++--- do_connect_frontend/src/app/utils/util.ts | 10 ++++ 12 files changed, 108 insertions(+), 37 deletions(-) create mode 100644 do_connect_frontend/src/app/constants/constants.ts create mode 100644 do_connect_frontend/src/app/utils/util.ts diff --git a/do_connect_frontend/angular.json b/do_connect_frontend/angular.json index aab6ce6..3d637fc 100644 --- a/do_connect_frontend/angular.json +++ b/do_connect_frontend/angular.json @@ -91,5 +91,8 @@ } } } + }, + "cli": { + "analytics": false } } diff --git a/do_connect_frontend/src/app/app.component.ts b/do_connect_frontend/src/app/app.component.ts index 3084d06..d4b3f77 100644 --- a/do_connect_frontend/src/app/app.component.ts +++ b/do_connect_frontend/src/app/app.component.ts @@ -11,5 +11,7 @@ export class AppComponent { searchbox = 'none'; toggleChatBox() { this.chatbox = this.chatbox === 'block' ? 'none' : 'block'; + var elem: any = document.getElementById('msgbox'); + elem.scrollTop = elem.scrollHeight; } } diff --git a/do_connect_frontend/src/app/chat/chat.component.html b/do_connect_frontend/src/app/chat/chat.component.html index a787462..92c9ddb 100644 --- a/do_connect_frontend/src/app/chat/chat.component.html +++ b/do_connect_frontend/src/app/chat/chat.component.html @@ -1,6 +1,18 @@

Chat Here

-
+
+

message 1

+

message 2

+

message 3

+

message 4

+

message 1

+

message 2

+

message 3

+

message 4

+

message 1

+

message 2

+

message 3

+

message 4

message 1

message 2

message 3

diff --git a/do_connect_frontend/src/app/chat/chat.component.ts b/do_connect_frontend/src/app/chat/chat.component.ts index ee4e787..4c063ec 100644 --- a/do_connect_frontend/src/app/chat/chat.component.ts +++ b/do_connect_frontend/src/app/chat/chat.component.ts @@ -3,13 +3,10 @@ import { Component, OnInit } from '@angular/core'; @Component({ selector: 'app-chat', templateUrl: './chat.component.html', - styleUrls: ['./chat.component.css'] + styleUrls: ['./chat.component.css'], }) export class ChatComponent implements OnInit { + constructor() {} - constructor() { } - - ngOnInit(): void { - } - + ngOnInit(): void {} } diff --git a/do_connect_frontend/src/app/constants/constants.ts b/do_connect_frontend/src/app/constants/constants.ts new file mode 100644 index 0000000..073e5ab --- /dev/null +++ b/do_connect_frontend/src/app/constants/constants.ts @@ -0,0 +1 @@ +export const BASE_URL = 'http://localhost:8181/api/v1'; diff --git a/do_connect_frontend/src/app/dashboard/dashboard.component.html b/do_connect_frontend/src/app/dashboard/dashboard.component.html index ab79388..33876c8 100644 --- a/do_connect_frontend/src/app/dashboard/dashboard.component.html +++ b/do_connect_frontend/src/app/dashboard/dashboard.component.html @@ -33,7 +33,7 @@
- + - + + - + - + + - +
Id Answer Posted By Date Status
- A constructor in Java is a special method that is used to - initialize objects. The constructor is called when an object of a - class is created. - XYZ24-08-2022
{{ answer.id }}{{ answer.answer }}{{ answer.postedBy }}{{ answer.date }} - - + +
Name Email PhoneGender Action
Ravi Kant Prasadxyz@gmail.com9786757568Male{{ user.name }}{{ user.email }}{{ user.phone }} - +
@@ -66,7 +66,7 @@ diff --git a/do_connect_frontend/src/app/dashboard/dashboard.component.ts b/do_connect_frontend/src/app/dashboard/dashboard.component.ts index 4007757..a377a57 100644 --- a/do_connect_frontend/src/app/dashboard/dashboard.component.ts +++ b/do_connect_frontend/src/app/dashboard/dashboard.component.ts @@ -49,16 +49,16 @@ export class DashboardComponent implements OnInit { } } - onApproveQuestion(data: any) { - this._adminService.approveQuestion(data).subscribe(); + onApproveQuestion(id: any) { + this._adminService.approveQuestion(id).subscribe(); } onRejectQuestion(id: any) { this._adminService.deleteQuestion(id).subscribe(); } - onApproveAnswer(data: any) { - this._adminService.approveAnswer(data).subscribe(); + onApproveAnswer(id: any) { + this._adminService.approveAnswer(id).subscribe(); } onRejectAnswer(id: any) { diff --git a/do_connect_frontend/src/app/login/login.component.ts b/do_connect_frontend/src/app/login/login.component.ts index 1d426c6..e97d6b6 100644 --- a/do_connect_frontend/src/app/login/login.component.ts +++ b/do_connect_frontend/src/app/login/login.component.ts @@ -21,9 +21,15 @@ export class LoginComponent implements OnInit { } this._userService .login({ username: this.username, password: this.password }) - .subscribe((res) => { - console.log(res); - // alert('Invalid Credentials'); - }); + .subscribe( + (res: any) => { + console.log(res); + localStorage.setItem('token', res.token); + this.roter.navigate(['/']); + }, + (error: any) => { + alert('Invalid Credentials'); + } + ); } } diff --git a/do_connect_frontend/src/app/service/admin.service.ts b/do_connect_frontend/src/app/service/admin.service.ts index d799034..3ae1fdd 100644 --- a/do_connect_frontend/src/app/service/admin.service.ts +++ b/do_connect_frontend/src/app/service/admin.service.ts @@ -1,39 +1,74 @@ import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; +import { BASE_URL } from '../constants/constants'; +import { getHeaders } from '../utils/util'; @Injectable({ providedIn: 'root', }) export class AdminService { - baseURL = 'http://localhost:8181/api/v1'; + baseURL = BASE_URL; constructor(private http: HttpClient) {} getUnapprovedQuestions() { - return this.http.get(this.baseURL + '/questions'); + const headers = getHeaders(); + return this.http.get(this.baseURL + '/questions?status=unapproved', { + headers: headers, + }); } getUnapprovedAnswers() { - return this.http.get(this.baseURL + '/questions'); + const headers = getHeaders(); + console.log(headers); + return this.http.get(this.baseURL + '/answers?status=unapproved', { + headers: headers, + }); } getUsers() { - return this.http.get(this.baseURL + '/users'); + const headers = getHeaders(); + return this.http.get(this.baseURL + '/users', { + headers: headers, + }); } deleteUser(id: any) { - return this.http.delete(this.baseURL + '/users/' + id); + const headers = getHeaders(); + return this.http.delete(this.baseURL + '/users/' + id, { + headers: headers, + }); } - approveQuestion(data: any) { - return this.http.put(this.baseURL + '/questions/' + data.id, data); + approveQuestion(id: any) { + const headers = getHeaders(); + return this.http.put( + this.baseURL + '/questions/' + id, + { + isApproved: true, + }, + { headers: headers } + ); } - approveAnswer(data: any) { - return this.http.put(this.baseURL + '/questions/' + data.id, data); + approveAnswer(id: any) { + const headers = getHeaders(); + return this.http.put( + this.baseURL + '/questions/' + id, + { + isApproved: true, + }, + { headers: headers } + ); } deleteQuestion(id: any) { - return this.http.delete(this.baseURL + '/questions/' + id); + const headers = getHeaders(); + return this.http.delete(this.baseURL + '/questions/' + id, { + headers: headers, + }); } deleteAnswer(id: any) { - return this.http.delete(this.baseURL + '/questions/' + id); + const headers = getHeaders(); + return this.http.delete(this.baseURL + '/questions/' + id, { + headers: headers, + }); } } diff --git a/do_connect_frontend/src/app/service/upload-files.service.ts b/do_connect_frontend/src/app/service/upload-files.service.ts index b980c13..5620118 100644 --- a/do_connect_frontend/src/app/service/upload-files.service.ts +++ b/do_connect_frontend/src/app/service/upload-files.service.ts @@ -1,12 +1,13 @@ import { HttpClient, HttpEvent, HttpRequest } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { Observable } from 'rxjs'; +import { BASE_URL } from '../constants/constants'; @Injectable({ providedIn: 'root', }) export class UploadFilesService { - private baseURL = 'http://localhost:8181/api/v1'; + private baseURL = BASE_URL; constructor(private http: HttpClient) {} // Returns an observable upload(file: any): Observable { diff --git a/do_connect_frontend/src/app/service/user.service.ts b/do_connect_frontend/src/app/service/user.service.ts index 5114346..d2f5c8a 100644 --- a/do_connect_frontend/src/app/service/user.service.ts +++ b/do_connect_frontend/src/app/service/user.service.ts @@ -1,30 +1,30 @@ import { HttpClient, HttpHeaders } from '@angular/common/http'; import { ConditionalExpr } from '@angular/compiler'; import { Injectable } from '@angular/core'; +import { BASE_URL } from '../constants/constants'; +import { getHeaders } from '../utils/util'; @Injectable({ providedIn: 'root', }) export class UserService { - baseURL = 'http://localhost:8181/api/v1'; + baseURL = BASE_URL; constructor(private http: HttpClient) {} register(user: any) { - console.warn(user); + // console.warn(user); return this.http.post(`${this.baseURL}/register`, user); } login(user: any) { - console.warn(user); + // console.warn(user); return this.http.post(`${this.baseURL}/login`, user); } - getUsers() { - return this.http.get(`${this.baseURL}/users`); - } + setUser(user: any) {} getQuestion(id: any) { - return this.http.get(this.baseURL + '/questions'); + return this.http.get(this.baseURL + '/questions/' + id); } getApprovedQuestions() { @@ -33,6 +33,10 @@ export class UserService { postQuestion(question: any) { console.log(question); - return this.http.post(this.baseURL + '/questions', question); + const headers = getHeaders(); + console.log(headers); + return this.http.post(this.baseURL + '/questions', question, { + headers: headers, + }); } } diff --git a/do_connect_frontend/src/app/utils/util.ts b/do_connect_frontend/src/app/utils/util.ts new file mode 100644 index 0000000..9bc3496 --- /dev/null +++ b/do_connect_frontend/src/app/utils/util.ts @@ -0,0 +1,10 @@ +import { HttpHeaders } from '@angular/common/http'; + +export function getHeaders() { + const token = localStorage.getItem('token'); + const headers = new HttpHeaders({ + 'Content-Type': 'application/json', + Authorization: `Bearer ${token}`, + }); + return headers; +} From 072ddbad467a8e1fbb1139b1e69d29437f7dcfb0 Mon Sep 17 00:00:00 2001 From: tapasaha-01 Date: Sat, 27 Aug 2022 00:18:56 +0530 Subject: [PATCH 290/464] worked on searchbar --- do_connect_frontend/src/app/home/home.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/do_connect_frontend/src/app/home/home.component.html b/do_connect_frontend/src/app/home/home.component.html index 6975a0f..819f865 100644 --- a/do_connect_frontend/src/app/home/home.component.html +++ b/do_connect_frontend/src/app/home/home.component.html @@ -6,7 +6,7 @@

All Questions

{{ question.question }}

From 7105f2b074960cec6a90e401f9ced6c3b09d5997 Mon Sep 17 00:00:00 2001 From: tapasaha-01 Date: Sat, 27 Aug 2022 00:21:11 +0530 Subject: [PATCH 291/464] worked on searchbar --- .../src/main/resources/application.properties | 4 +- .../src/main/resources/application.properties | 4 +- .../src/app/login/login.component.ts | 1 + .../src/app/navbar/navbar.component.html | 1 + .../src/app/navbar/navbar.component.ts | 16 +- .../src/app/service/search.service.ts | 9 +- doconnect_chat_service-main/.gitignore | 33 -- .../.mvn/wrapper/maven-wrapper.jar | Bin 58727 -> 0 bytes .../.mvn/wrapper/maven-wrapper.properties | 2 - doconnect_chat_service-main/README.md | 92 ----- doconnect_chat_service-main/mvnw | 316 ------------------ doconnect_chat_service-main/mvnw.cmd | 188 ----------- doconnect_chat_service-main/pom.xml | 81 ----- .../DoConnectChatServiceApplication.java | 13 - .../controller/MessageController.java | 39 --- .../wipro/doconnectchat/dto/MessageDTO.java | 57 ---- .../wipro/doconnectchat/dto/ResponseDTO.java | 27 -- .../wipro/doconnectchat/entity/Message.java | 59 ---- .../repository/IMessageRepo.java | 11 - .../service/IMessageService.java | 16 - .../service/IMessageServiceImpl.java | 43 --- .../src/main/resources/application.properties | 13 - .../DoConnectChatServiceApplicationTests.java | 13 - 23 files changed, 27 insertions(+), 1011 deletions(-) delete mode 100644 doconnect_chat_service-main/.gitignore delete mode 100644 doconnect_chat_service-main/.mvn/wrapper/maven-wrapper.jar delete mode 100644 doconnect_chat_service-main/.mvn/wrapper/maven-wrapper.properties delete mode 100644 doconnect_chat_service-main/README.md delete mode 100644 doconnect_chat_service-main/mvnw delete mode 100644 doconnect_chat_service-main/mvnw.cmd delete mode 100644 doconnect_chat_service-main/pom.xml delete mode 100644 doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/DoConnectChatServiceApplication.java delete mode 100644 doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/controller/MessageController.java delete mode 100644 doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/dto/MessageDTO.java delete mode 100644 doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/dto/ResponseDTO.java delete mode 100644 doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/entity/Message.java delete mode 100644 doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/repository/IMessageRepo.java delete mode 100644 doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/service/IMessageService.java delete mode 100644 doconnect_chat_service-main/src/main/java/com/wipro/doconnectchat/service/IMessageServiceImpl.java delete mode 100644 doconnect_chat_service-main/src/main/resources/application.properties delete mode 100644 doconnect_chat_service-main/src/test/java/com/wipro/doconnectchat/DoConnectChatServiceApplicationTests.java diff --git a/do_connect_backend/DoConnect/src/main/resources/application.properties b/do_connect_backend/DoConnect/src/main/resources/application.properties index 5a80ad4..851090b 100644 --- a/do_connect_backend/DoConnect/src/main/resources/application.properties +++ b/do_connect_backend/DoConnect/src/main/resources/application.properties @@ -1,8 +1,8 @@ server.port=9090 spring.datasource.url=jdbc:mysql://localhost:3306/do_connect?createDatabaseIfNotExist=true&useSSL=false -spring.datasource.username= -spring.datasource.password= +spring.datasource.username=root +spring.datasource.password=Sonu#2000 spring.jpa.hibernate.ddl-auto=update spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect spring.jpa.open-in-view=false diff --git a/do_connect_backend/DoConnectChat/src/main/resources/application.properties b/do_connect_backend/DoConnectChat/src/main/resources/application.properties index 229ad54..9040e50 100644 --- a/do_connect_backend/DoConnectChat/src/main/resources/application.properties +++ b/do_connect_backend/DoConnectChat/src/main/resources/application.properties @@ -1,8 +1,8 @@ server.port=9191 spring.datasource.url=jdbc:mysql://localhost:3306/do_connect?createDatabaseIfNotExist=true&useSSL=false -spring.datasource.username= -spring.datasource.password= +spring.datasource.username=root +spring.datasource.password=Sonu#2000 spring.jpa.hibernate.ddl-auto=update spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect spring.jpa.open-in-view=false diff --git a/do_connect_frontend/src/app/login/login.component.ts b/do_connect_frontend/src/app/login/login.component.ts index 1d426c6..0c0fd1e 100644 --- a/do_connect_frontend/src/app/login/login.component.ts +++ b/do_connect_frontend/src/app/login/login.component.ts @@ -23,6 +23,7 @@ export class LoginComponent implements OnInit { .login({ username: this.username, password: this.password }) .subscribe((res) => { console.log(res); + this.roter.navigate(['/dashboard']) // alert('Invalid Credentials'); }); } diff --git a/do_connect_frontend/src/app/navbar/navbar.component.html b/do_connect_frontend/src/app/navbar/navbar.component.html index 359e688..5e7d9c7 100644 --- a/do_connect_frontend/src/app/navbar/navbar.component.html +++ b/do_connect_frontend/src/app/navbar/navbar.component.html @@ -19,6 +19,7 @@
{{ question.id }} {{ question.question }}{{ null }}{{ question.topic }} {{ question.postedBy }}{{ question.date }}{{ question.postedAt }}
IdQuestion Answer Posted By Date Status
{{ answer.id }}{{ answer.answer }}{{ answer.question.question }}{{ answer.answer }} {{ answer.postedBy }}{{ answer.date }}{{ answer.postedAt }} @@ -84,16 +86,18 @@
+ - + + - +
Id Name EmailPhoneRole Action
{{ user.id }} {{ user.name }} {{ user.email }}{{ user.phone }}{{ user.isAdmin === true ? "Admin" : "User" }} + +
-
+

{{ question.question }}

+
+ +
+
+ +
diff --git a/do_connect_frontend/src/app/home/home.component.ts b/do_connect_frontend/src/app/home/home.component.ts index 2b1b692..0186d57 100644 --- a/do_connect_frontend/src/app/home/home.component.ts +++ b/do_connect_frontend/src/app/home/home.component.ts @@ -10,16 +10,36 @@ import { UserService } from '../service/user.service'; }) export class HomeComponent implements OnInit { data: any; - constructor(private _userService: UserService, private roter: Router) {} + search: any; + chatbox = 'none'; + isAdmin: any; + chatButton = 'Open Chat'; + constructor(private _userService: UserService, private router: Router) {} ngOnInit(): void { - this._userService.getApprovedQuestions().subscribe((res) => { - this.data = res; - console.log(res); + this.isAdmin = localStorage.getItem('isAdmin'); + console.log(this.isAdmin === 'true'); + this._userService.getApprovedQuestions().subscribe({ + next: (res) => (this.data = res), + error: (err) => this.router.navigate(['/error/' + err.status]), }); } + toggleChatBox() { + this.chatbox = this.chatbox === 'block' ? 'none' : 'block'; + this.chatButton = this.chatbox === 'block' ? 'Close Chat' : 'Open Chat'; + var elem: any = document.getElementById('msgbox'); + elem.scrollTop = elem.scrollHeight; + } + openQuestion(id: any) { - this.roter.navigate([`/question/${id}`]); + this.router.navigate([`/question/${id}`]); + } + + onSearch() { + this._userService.searchQuestion(this.search).subscribe({ + next: (res) => (this.data = res), + error: (err) => this.router.navigate(['/error/' + err.status]), + }); } } diff --git a/do_connect_frontend/src/app/login/login.component.ts b/do_connect_frontend/src/app/login/login.component.ts index e97d6b6..e070290 100644 --- a/do_connect_frontend/src/app/login/login.component.ts +++ b/do_connect_frontend/src/app/login/login.component.ts @@ -1,5 +1,6 @@ import { Component, OnInit } from '@angular/core'; import { Router } from '@angular/router'; +import jwtDecode from 'jwt-decode'; import { UserService } from '../service/user.service'; @Component({ @@ -11,7 +12,7 @@ export class LoginComponent implements OnInit { username = ''; password = ''; warning = ''; - constructor(private roter: Router, private _userService: UserService) {} + constructor(private router: Router, private _userService: UserService) {} ngOnInit(): void {} onLogin() { @@ -21,15 +22,31 @@ export class LoginComponent implements OnInit { } this._userService .login({ username: this.username, password: this.password }) - .subscribe( - (res: any) => { - console.log(res); + .subscribe({ + next: (res: any) => { + console.log(jwtDecode(res.token)); + const jwtData: any = jwtDecode(res.token); + localStorage.setItem('isAdmin', jwtData.isAdmin); + localStorage.setItem('isLoggedIn', 'true'); localStorage.setItem('token', res.token); - this.roter.navigate(['/']); + if (jwtData.isAdmin) { + this._userService.setUser({ + isLoggedIn: true, + isAdmin: true, + }); + this.router.navigate(['/dashboard']); + } else { + this._userService.setUser({ + isLoggedIn: true, + isAdmin: false, + }); + this.router.navigate(['/']); + } }, - (error: any) => { + error: (err) => { alert('Invalid Credentials'); - } - ); + // this.router.navigate(['/error/' + err.status]); + }, + }); } } diff --git a/do_connect_frontend/src/app/navbar/navbar.component.css b/do_connect_frontend/src/app/navbar/navbar.component.css index 4865be1..2a25294 100644 --- a/do_connect_frontend/src/app/navbar/navbar.component.css +++ b/do_connect_frontend/src/app/navbar/navbar.component.css @@ -2,17 +2,10 @@ background-color: rgba(61, 61, 61, 0.592); } */ -input, -input:focus { +button, +button:focus { color: white; outline: none !important; box-shadow: none; - background-color: rgba(237, 234, 234, 0.358); border: none; - border-radius: 5 5; - border-bottom: 2px solid white; -} -button { - color: antiquewhite; - border: 1px solid-white; } diff --git a/do_connect_frontend/src/app/navbar/navbar.component.html b/do_connect_frontend/src/app/navbar/navbar.component.html index 359e688..a9ab9b2 100644 --- a/do_connect_frontend/src/app/navbar/navbar.component.html +++ b/do_connect_frontend/src/app/navbar/navbar.component.html @@ -16,34 +16,23 @@ id="navbarNavAltMarkup" >
diff --git a/do_connect_frontend/src/app/navbar/navbar.component.ts b/do_connect_frontend/src/app/navbar/navbar.component.ts index c35732d..1eefbbf 100644 --- a/do_connect_frontend/src/app/navbar/navbar.component.ts +++ b/do_connect_frontend/src/app/navbar/navbar.component.ts @@ -1,4 +1,5 @@ import { Component, OnInit } from '@angular/core'; +import { Router } from '@angular/router'; import { UserService } from '../service/user.service'; @Component({ @@ -7,9 +8,37 @@ import { UserService } from '../service/user.service'; styleUrls: ['./navbar.component.css'], }) export class NavbarComponent implements OnInit { - constructor(private _userService: UserService) {} + user = { + isLoggedIn: false, + isAdmin: false, + }; - ngOnInit(): void {} + constructor(private _userService: UserService, private router: Router) {} - onSearch() {} + ngOnInit(): void { + this._userService.currentUser.subscribe((user) => { + this.user = user; + console.log(user); + }); + } + onLogout() { + this._userService.setUser({ + isLoggedIn: false, + isAdmin: false, + }); + this._userService.logout().subscribe({ + next: (res) => { + localStorage.clear(); + alert('Logged Out Successfully!'); + this.router.navigate(['/']); + }, + error: (err) => { + if (err.status === 200) { + localStorage.clear(); + alert('Logged Out Successfully!'); + this.router.navigate(['/']); + } else this.router.navigate(['/error/' + err.status]); + }, + }); + } } diff --git a/do_connect_frontend/src/app/page-not-found/page-not-found.component.html b/do_connect_frontend/src/app/page-not-found/page-not-found.component.html index f68c8da..023105f 100644 --- a/do_connect_frontend/src/app/page-not-found/page-not-found.component.html +++ b/do_connect_frontend/src/app/page-not-found/page-not-found.component.html @@ -1,3 +1,3 @@ -
-

page-not-found works!

+
+

Page Not Found!

diff --git a/do_connect_frontend/src/app/post-question/post-question.component.html b/do_connect_frontend/src/app/post-question/post-question.component.html index fc78803..aac0c09 100644 --- a/do_connect_frontend/src/app/post-question/post-question.component.html +++ b/do_connect_frontend/src/app/post-question/post-question.component.html @@ -25,7 +25,9 @@
- + + image +
diff --git a/do_connect_frontend/src/app/post-question/post-question.component.ts b/do_connect_frontend/src/app/post-question/post-question.component.ts index 33bdd09..f455fc2 100644 --- a/do_connect_frontend/src/app/post-question/post-question.component.ts +++ b/do_connect_frontend/src/app/post-question/post-question.component.ts @@ -1,6 +1,6 @@ import { Component, OnInit } from '@angular/core'; import { DomSanitizer, SafeUrl } from '@angular/platform-browser'; -import { Observable } from 'rxjs'; +import { Router } from '@angular/router'; import { UploadFilesService } from '../service/upload-files.service'; import { UserService } from '../service/user.service'; @@ -18,37 +18,44 @@ export class PostQuestionComponent implements OnInit { constructor( private _uploadService: UploadFilesService, - private sanitizer: DomSanitizer, - private _userService: UserService + private _userService: UserService, + private router: Router ) {} ngOnInit(): void {} onChange(event: any) { this.file = event.target.files[0]; } - sanitizeImageUrl(imageUrl: string): SafeUrl { - return this.sanitizer.bypassSecurityTrustUrl(imageUrl); + getImageUrl(image: any) { + const imageUrl = 'http://localhost:4000/' + image; + return imageUrl; } onUploadImage() { - console.log(this.file); - this._uploadService.upload(this.file).subscribe( - (res: any) => { - console.warn(res); + this._uploadService.upload(this.file).subscribe({ + next: (res) => console.warn(res), + error: (err) => { + if (err.status === 200) this.uploadedImages.push(err.error.text); + else this.router.navigate(['/error/' + err.status]); }, - (error) => { - console.warn(error); - this.uploadedImages.push(error.error.text); - } - ); + }); } onSubmit() { if (this.question === '') { this.warning = 'All fields are required!'; + return; } this._userService - .postQuestion({ question: this.question, topic: this.topic }) - .subscribe((res) => { - console.warn(res); + .postQuestion({ + question: this.question, + topic: this.topic, + images: this.uploadedImages, + }) + .subscribe({ + next: (res) => { + alert('Successfully Submitted'); + this.router.navigate(['/']); + }, + error: (err) => this.router.navigate(['/error/' + err.status]), }); } } diff --git a/do_connect_frontend/src/app/question/question.component.html b/do_connect_frontend/src/app/question/question.component.html index e316fa0..c98a75f 100644 --- a/do_connect_frontend/src/app/question/question.component.html +++ b/do_connect_frontend/src/app/question/question.component.html @@ -6,6 +6,13 @@

Question

{{ data.question }}

+
+
+ + image + +
+

Write your answer

@@ -17,6 +24,25 @@

Write your answer

id="answer" rows="5" > +
+
+ + image + +
+
+
+ + + +
@@ -24,9 +50,16 @@

Write your answer

Answers

-
+
{{ answer.answer }}
+
+
+ + image + +
+

Posted By: {{ answer.postedBy }}

diff --git a/do_connect_frontend/src/app/question/question.component.ts b/do_connect_frontend/src/app/question/question.component.ts index 84a86a0..9c5eab3 100644 --- a/do_connect_frontend/src/app/question/question.component.ts +++ b/do_connect_frontend/src/app/question/question.component.ts @@ -1,5 +1,6 @@ import { Component, OnInit } from '@angular/core'; import { ActivatedRoute, Route, Router } from '@angular/router'; +import { UploadFilesService } from '../service/upload-files.service'; import { UserService } from '../service/user.service'; @Component({ @@ -10,22 +11,72 @@ import { UserService } from '../service/user.service'; export class QuestionComponent implements OnInit { data: any; answer = ''; + answersList: any; + questionId: any; + warning = ''; + uploadedImages: string[] = []; + file: File = new File(['init'], 'init.txt'); constructor( private _userService: UserService, - private activatedRoute: ActivatedRoute + private activatedRoute: ActivatedRoute, + private router: Router, + private _uploadService: UploadFilesService ) {} ngOnInit(): void { + this.getData(); + } + + getData() { let urlParams = this.activatedRoute.snapshot.params; - let questionId = urlParams['id']; - console.log(questionId); - this.data = this._userService.getQuestion(questionId).subscribe((res) => { - this.data = res; - console.log(this.data); + this.questionId = urlParams['id']; + console.log(this.questionId); + this.data = this._userService.getQuestion(this.questionId).subscribe({ + next: (res) => (this.data = res), + error: (err) => this.router.navigate(['/error/' + err.status]), + }); + + this._userService.getAnswers(this.questionId).subscribe({ + next: (res) => (this.answersList = res), + error: (err) => this.router.navigate(['/error/' + err.status]), + }); + } + onChange(event: any) { + this.file = event.target.files[0]; + } + getImageUrl(image: any) { + const imageUrl = 'http://localhost:4000/' + image; + return imageUrl; + } + onUploadImage() { + this._uploadService.upload(this.file).subscribe({ + next: (res) => console.warn(res), + error: (err) => { + if (err.status === 200) this.uploadedImages.push(err.error.text); + else this.router.navigate(['/error/' + err.status]); + }, }); } onSubmit() { - this._userService.postQuestion(this.answer); + if (this.answer === '') { + this.warning = 'All fields are required!'; + return; + } + this._userService + .postAnswer(this.questionId, { + answer: this.answer, + images: this.uploadedImages, + }) + .subscribe({ + next: (res) => { + alert('Successfully Submitted'); + this.router.navigate(['/']); + }, + error: (err) => { + console.log(err); + this.router.navigate(['/error/' + err.status]); + }, + }); } } diff --git a/do_connect_frontend/src/app/register/register.component.ts b/do_connect_frontend/src/app/register/register.component.ts index 47f8451..a3c6cf8 100644 --- a/do_connect_frontend/src/app/register/register.component.ts +++ b/do_connect_frontend/src/app/register/register.component.ts @@ -25,6 +25,13 @@ export class RegisterComponent implements OnInit { return; } let isAdmin = this.role === 'User' ? false : true; + console.log({ + name: this.name, + email: this.email, + password: this.password, + username: this.username, + isAdmin: isAdmin, + }); this._userService .register({ name: this.name, @@ -33,9 +40,12 @@ export class RegisterComponent implements OnInit { username: this.username, isAdmin: isAdmin, }) - .subscribe((res: any) => { - console.log(res); - this.router.navigate(['/login']); + .subscribe({ + next: (res) => this.router.navigate(['/login']), + error: (err) => { + if (err.status === 200) this.router.navigate(['/login']); + else this.router.navigate(['/error/' + err.status]); + }, }); } } diff --git a/do_connect_frontend/src/app/search/search.component.css b/do_connect_frontend/src/app/search/search.component.css deleted file mode 100644 index 60f3b2f..0000000 --- a/do_connect_frontend/src/app/search/search.component.css +++ /dev/null @@ -1,10 +0,0 @@ -.search { - height: 70vh; - width: 90vw; - background-color: aliceblue; - padding: 1rem 2rem; - position: absolute; - top: 10%; - left: 5%; - border-radius: 5px; -} diff --git a/do_connect_frontend/src/app/search/search.component.html b/do_connect_frontend/src/app/search/search.component.html deleted file mode 100644 index 6792ab6..0000000 --- a/do_connect_frontend/src/app/search/search.component.html +++ /dev/null @@ -1,18 +0,0 @@ - diff --git a/do_connect_frontend/src/app/search/search.component.ts b/do_connect_frontend/src/app/search/search.component.ts deleted file mode 100644 index 4224e9b..0000000 --- a/do_connect_frontend/src/app/search/search.component.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { Router } from '@angular/router'; -import { UserService } from '../service/user.service'; - -@Component({ - selector: 'app-search', - templateUrl: './search.component.html', - styleUrls: ['./search.component.css'], -}) -export class SearchComponent implements OnInit { - data: any; - constructor(private _userService: UserService, private roter: Router) {} - - ngOnInit(): void { - this._userService.getApprovedQuestions().subscribe((res) => { - this.data = res; - console.log(res); - }); - } - - openQuestion(id: any) { - this.roter.navigate([`/question/${id}`]); - } - - onClose() { - this.roter.navigate(['/']); - } -} diff --git a/do_connect_frontend/src/app/service/admin.service.ts b/do_connect_frontend/src/app/service/admin.service.ts index 3ae1fdd..14e194f 100644 --- a/do_connect_frontend/src/app/service/admin.service.ts +++ b/do_connect_frontend/src/app/service/admin.service.ts @@ -49,10 +49,14 @@ export class AdminService { { headers: headers } ); } - approveAnswer(id: any) { + approveAnswer(answer: any) { const headers = getHeaders(); return this.http.put( - this.baseURL + '/questions/' + id, + this.baseURL + + '/questions/' + + answer.question.id + + '/answers/' + + answer.id, { isApproved: true, }, @@ -65,10 +69,17 @@ export class AdminService { headers: headers, }); } - deleteAnswer(id: any) { + deleteAnswer(answer: any) { const headers = getHeaders(); - return this.http.delete(this.baseURL + '/questions/' + id, { - headers: headers, - }); + return this.http.delete( + this.baseURL + + '/questions/' + + answer.question.id + + '/answers/' + + answer.id, + { + headers: headers, + } + ); } } diff --git a/do_connect_frontend/src/app/service/chat.service.ts b/do_connect_frontend/src/app/service/chat.service.ts index 0d00005..bda0a1c 100644 --- a/do_connect_frontend/src/app/service/chat.service.ts +++ b/do_connect_frontend/src/app/service/chat.service.ts @@ -1,9 +1,20 @@ +import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; +import { BASE_URL } from '../constants/constants'; +import { getHeaders } from '../utils/util'; @Injectable({ - providedIn: 'root' + providedIn: 'root', }) export class ChatService { - - constructor() { } + constructor(private http: HttpClient) {} + baseUrl = BASE_URL; + createChat(data: any) { + const headers = getHeaders(); + return this.http.post(this.baseUrl + '/messages', data, { headers }); + } + getChatList() { + const headers = getHeaders(); + return this.http.get(this.baseUrl + '/messages', { headers }); + } } diff --git a/do_connect_frontend/src/app/service/upload-files.service.ts b/do_connect_frontend/src/app/service/upload-files.service.ts index 5620118..1fdb565 100644 --- a/do_connect_frontend/src/app/service/upload-files.service.ts +++ b/do_connect_frontend/src/app/service/upload-files.service.ts @@ -1,7 +1,13 @@ -import { HttpClient, HttpEvent, HttpRequest } from '@angular/common/http'; +import { + HttpClient, + HttpEvent, + HttpHeaders, + HttpRequest, +} from '@angular/common/http'; import { Injectable } from '@angular/core'; import { Observable } from 'rxjs'; import { BASE_URL } from '../constants/constants'; +import { getHeaders } from '../utils/util'; @Injectable({ providedIn: 'root', @@ -19,9 +25,17 @@ export class UploadFilesService { // Make http post request over api // with formData as req - return this.http.post(`${this.baseURL}/images`, formData); + const token = localStorage.getItem('token'); + const headers = new HttpHeaders({ + Authorization: `Bearer ${token}`, + }); + return this.http.post(`${this.baseURL}/images`, formData, { headers }); } getFiles(): Observable { - return this.http.get(`${this.baseURL}/images`); + const token = localStorage.getItem('token'); + const headers = new HttpHeaders({ + Authorization: `Bearer ${token}`, + }); + return this.http.get(`${this.baseURL}/images`, { headers }); } } diff --git a/do_connect_frontend/src/app/service/user.service.ts b/do_connect_frontend/src/app/service/user.service.ts index d2f5c8a..f0d6cfd 100644 --- a/do_connect_frontend/src/app/service/user.service.ts +++ b/do_connect_frontend/src/app/service/user.service.ts @@ -1,6 +1,7 @@ import { HttpClient, HttpHeaders } from '@angular/common/http'; import { ConditionalExpr } from '@angular/compiler'; import { Injectable } from '@angular/core'; +import { BehaviorSubject } from 'rxjs'; import { BASE_URL } from '../constants/constants'; import { getHeaders } from '../utils/util'; @@ -9,8 +10,20 @@ import { getHeaders } from '../utils/util'; }) export class UserService { baseURL = BASE_URL; + user = { + isLoggedIn: false, + isAdmin: false, + }; - constructor(private http: HttpClient) {} + constructor(private http: HttpClient) { + this.user.isLoggedIn = + localStorage.getItem('isLoggedIn') === 'true' ? true : false; + this.user.isAdmin = + localStorage.getItem('isAdmin') === 'true' ? true : false; + } + + private intialUser = new BehaviorSubject(this.user); + currentUser = this.intialUser.asObservable(); register(user: any) { // console.warn(user); @@ -21,10 +34,13 @@ export class UserService { return this.http.post(`${this.baseURL}/login`, user); } - setUser(user: any) {} + setUser(user: any) { + this.intialUser.next(user); + } getQuestion(id: any) { - return this.http.get(this.baseURL + '/questions/' + id); + const headers = getHeaders(); + return this.http.get(this.baseURL + '/questions/' + id, { headers }); } getApprovedQuestions() { @@ -36,7 +52,42 @@ export class UserService { const headers = getHeaders(); console.log(headers); return this.http.post(this.baseURL + '/questions', question, { + headers, + }); + } + + postAnswer(quesId: any, answer: any) { + console.log(quesId, answer); + const headers = getHeaders(); + console.log(headers); + return this.http.post( + this.baseURL + '/questions/' + quesId + '/answers', + answer, + { + headers, + } + ); + } + + searchQuestion(query: any) { + const headers = getHeaders(); + console.log(headers); + return this.http.get(this.baseURL + '/questions?search=' + query, { headers: headers, }); } + + getAnswers(quesId: any) { + const headers = getHeaders(); + return this.http.get(this.baseURL + '/questions/' + quesId + '/answers', { + headers, + }); + } + + logout() { + const headers = getHeaders(); + return this.http.get(this.baseURL + '/signout', { + headers, + }); + } } From ef06e554ff3518c5902a2ec30a833b3aef650de4 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Sun, 28 Aug 2022 17:23:07 +0530 Subject: [PATCH 301/464] Update index.html --- do_connect_frontend/src/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/do_connect_frontend/src/index.html b/do_connect_frontend/src/index.html index 2e7d4ea..b0ad250 100644 --- a/do_connect_frontend/src/index.html +++ b/do_connect_frontend/src/index.html @@ -2,7 +2,7 @@ - AngularProject + DoConnect From 390a311dacc0715621e8986829dee4a2fbe1077f Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Sun, 28 Aug 2022 17:23:09 +0530 Subject: [PATCH 302/464] Update util.ts --- do_connect_frontend/src/app/utils/util.ts | 35 +++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/do_connect_frontend/src/app/utils/util.ts b/do_connect_frontend/src/app/utils/util.ts index 9bc3496..33831f6 100644 --- a/do_connect_frontend/src/app/utils/util.ts +++ b/do_connect_frontend/src/app/utils/util.ts @@ -1,10 +1,41 @@ import { HttpHeaders } from '@angular/common/http'; +import jwtDecode from 'jwt-decode'; +import { JWTCustomPayload } from '../constants/constants'; -export function getHeaders() { +export const getHeaders = () => { const token = localStorage.getItem('token'); const headers = new HttpHeaders({ 'Content-Type': 'application/json', Authorization: `Bearer ${token}`, }); return headers; -} +}; + +export const isUserLoggedIn = () => { + const token = localStorage.getItem('token'); + return (token !== null && token !== '' && token.split('.').length === 3); +}; + +export const isUserAdmin = () => { + if (isUserLoggedIn()) { + const token = localStorage.getItem('token'); + if (token) { + const jwtData: JWTCustomPayload = jwtDecode(token); + return jwtData.isAdmin; + } + return false; + } + return false; +}; + +export const getCurrentUsername = () => { + if (isUserLoggedIn()) { + const token = localStorage.getItem('token'); + if (token) { + const jwtData: JWTCustomPayload = jwtDecode(token); + return jwtData.sub; + } + return undefined; + } + return undefined; +}; From 2a35b23b0376ef91122564cbbab06e5c82c7c92d Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Sun, 28 Aug 2022 17:23:11 +0530 Subject: [PATCH 303/464] Update user.service.ts --- do_connect_frontend/src/app/service/user.service.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/do_connect_frontend/src/app/service/user.service.ts b/do_connect_frontend/src/app/service/user.service.ts index f0d6cfd..a5b588e 100644 --- a/do_connect_frontend/src/app/service/user.service.ts +++ b/do_connect_frontend/src/app/service/user.service.ts @@ -3,7 +3,7 @@ import { ConditionalExpr } from '@angular/compiler'; import { Injectable } from '@angular/core'; import { BehaviorSubject } from 'rxjs'; import { BASE_URL } from '../constants/constants'; -import { getHeaders } from '../utils/util'; +import { getHeaders, isUserAdmin, isUserLoggedIn } from '../utils/util'; @Injectable({ providedIn: 'root', @@ -16,10 +16,8 @@ export class UserService { }; constructor(private http: HttpClient) { - this.user.isLoggedIn = - localStorage.getItem('isLoggedIn') === 'true' ? true : false; - this.user.isAdmin = - localStorage.getItem('isAdmin') === 'true' ? true : false; + this.user.isLoggedIn = isUserLoggedIn(); + this.user.isAdmin = isUserAdmin(); } private intialUser = new BehaviorSubject(this.user); From 3f1473f7fcb1f7914de99a217897290fbe6c0f03 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Sun, 28 Aug 2022 17:23:20 +0530 Subject: [PATCH 304/464] Update chat.service.ts --- do_connect_frontend/src/app/service/chat.service.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/do_connect_frontend/src/app/service/chat.service.ts b/do_connect_frontend/src/app/service/chat.service.ts index bda0a1c..9110f5f 100644 --- a/do_connect_frontend/src/app/service/chat.service.ts +++ b/do_connect_frontend/src/app/service/chat.service.ts @@ -6,14 +6,19 @@ import { getHeaders } from '../utils/util'; @Injectable({ providedIn: 'root', }) + export class ChatService { - constructor(private http: HttpClient) {} + baseUrl = BASE_URL; + + constructor(private http: HttpClient) {} + createChat(data: any) { const headers = getHeaders(); return this.http.post(this.baseUrl + '/messages', data, { headers }); } - getChatList() { + + getChatMessagesList() { const headers = getHeaders(); return this.http.get(this.baseUrl + '/messages', { headers }); } From 74a095af5fefa71d10a6ad06ff64c544c4d2a080 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Sun, 28 Aug 2022 17:23:21 +0530 Subject: [PATCH 305/464] Update login.component.ts --- do_connect_frontend/src/app/login/login.component.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/do_connect_frontend/src/app/login/login.component.ts b/do_connect_frontend/src/app/login/login.component.ts index 2013403..f173d25 100644 --- a/do_connect_frontend/src/app/login/login.component.ts +++ b/do_connect_frontend/src/app/login/login.component.ts @@ -1,6 +1,7 @@ import { Component, OnInit } from '@angular/core'; import { Router } from '@angular/router'; import jwtDecode from 'jwt-decode'; +import { JWTCustomPayload } from '../constants/constants'; import { UserService } from '../service/user.service'; @Component({ @@ -24,10 +25,7 @@ export class LoginComponent implements OnInit { .login({ username: this.username, password: this.password }) .subscribe({ next: (res: any) => { - console.log(jwtDecode(res.token)); - const jwtData: any = jwtDecode(res.token); - localStorage.setItem('isAdmin', jwtData.isAdmin); - localStorage.setItem('isLoggedIn', 'true'); + const jwtData: JWTCustomPayload = jwtDecode(res.token); localStorage.setItem('token', res.token); if (jwtData.isAdmin) { this._userService.setUser({ From 4def582c6c53e497135f2e2cdc8c59a2697b943b Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Sun, 28 Aug 2022 17:23:24 +0530 Subject: [PATCH 306/464] Update home.component.ts --- do_connect_frontend/src/app/home/home.component.ts | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/do_connect_frontend/src/app/home/home.component.ts b/do_connect_frontend/src/app/home/home.component.ts index 0186d57..3f2d7dc 100644 --- a/do_connect_frontend/src/app/home/home.component.ts +++ b/do_connect_frontend/src/app/home/home.component.ts @@ -2,23 +2,26 @@ import { HttpClient } from '@angular/common/http'; import { Component, OnInit } from '@angular/core'; import { Router } from '@angular/router'; import { UserService } from '../service/user.service'; +import { isUserAdmin } from '../utils/util'; + +const OPEN_CHAT_BUTTON_LABEL = 'Chat'; @Component({ selector: 'app-home', templateUrl: './home.component.html', styleUrls: ['./home.component.css'], }) + export class HomeComponent implements OnInit { data: any; search: any; chatbox = 'none'; - isAdmin: any; - chatButton = 'Open Chat'; + isAdmin: boolean = isUserAdmin(); + chatButton: string = OPEN_CHAT_BUTTON_LABEL; + constructor(private _userService: UserService, private router: Router) {} ngOnInit(): void { - this.isAdmin = localStorage.getItem('isAdmin'); - console.log(this.isAdmin === 'true'); this._userService.getApprovedQuestions().subscribe({ next: (res) => (this.data = res), error: (err) => this.router.navigate(['/error/' + err.status]), @@ -27,7 +30,6 @@ export class HomeComponent implements OnInit { toggleChatBox() { this.chatbox = this.chatbox === 'block' ? 'none' : 'block'; - this.chatButton = this.chatbox === 'block' ? 'Close Chat' : 'Open Chat'; var elem: any = document.getElementById('msgbox'); elem.scrollTop = elem.scrollHeight; } From 2b500f9c4e08efa1bb9dca04fbd9e6939cb84ea9 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Sun, 28 Aug 2022 17:23:26 +0530 Subject: [PATCH 307/464] Update home.component.html --- .../src/app/home/home.component.html | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/do_connect_frontend/src/app/home/home.component.html b/do_connect_frontend/src/app/home/home.component.html index 779c513..ba206b3 100644 --- a/do_connect_frontend/src/app/home/home.component.html +++ b/do_connect_frontend/src/app/home/home.component.html @@ -13,24 +13,22 @@

All Questions

Search
-
+

{{ question.question }}

-
+
-
- -
+
From 69781ad108b9aad47bf0d015c24316d9f5e8d62a Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Sun, 28 Aug 2022 17:23:29 +0530 Subject: [PATCH 308/464] Update home.component.css --- do_connect_frontend/src/app/home/home.component.css | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/do_connect_frontend/src/app/home/home.component.css b/do_connect_frontend/src/app/home/home.component.css index 8b13789..8f43434 100644 --- a/do_connect_frontend/src/app/home/home.component.css +++ b/do_connect_frontend/src/app/home/home.component.css @@ -1 +1,6 @@ - +.chat-button { + position: absolute; + bottom: 5rem; + z-index: 5; + right: 2rem; +} From baf53a47424ee862d79ae59ece31c341fc3a07e8 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Sun, 28 Aug 2022 17:23:31 +0530 Subject: [PATCH 309/464] Update footer.component.html --- .../src/app/footer/footer.component.html | 33 ++----------------- 1 file changed, 3 insertions(+), 30 deletions(-) diff --git a/do_connect_frontend/src/app/footer/footer.component.html b/do_connect_frontend/src/app/footer/footer.component.html index bb473e9..5a8de74 100644 --- a/do_connect_frontend/src/app/footer/footer.component.html +++ b/do_connect_frontend/src/app/footer/footer.component.html @@ -1,34 +1,7 @@
- -
- -
- -
-

- Click here to -> - - -

-
- +
+
+ © 2022 WIPRO_VELOCITY_ FSD_ SD_ APR C IV Group 9. All rights reserved.
- - - -
- © 2022 Copyrights from Group 9 : - MyGreatLearning.com -
-
-
From 13b93370bee695ff77eb795deaeae63b7f9f3ce3 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Sun, 28 Aug 2022 17:23:33 +0530 Subject: [PATCH 310/464] Update constants.ts --- do_connect_frontend/src/app/constants/constants.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/do_connect_frontend/src/app/constants/constants.ts b/do_connect_frontend/src/app/constants/constants.ts index 9e53db5..4dc33b4 100644 --- a/do_connect_frontend/src/app/constants/constants.ts +++ b/do_connect_frontend/src/app/constants/constants.ts @@ -1 +1,9 @@ -export const BASE_URL = 'http://localhost:9090/api/v1'; \ No newline at end of file +import { JwtPayload } from "jwt-decode"; + +export const BASE_URL = 'http://localhost:9090/api/v1'; + +export interface JWTCustomPayload extends JwtPayload { + isAdmin: boolean; + email: string; + name: string; +} From a73c3f5b2860af2898c2627b25de065890ad571a Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Sun, 28 Aug 2022 17:23:35 +0530 Subject: [PATCH 311/464] Update chat.component.ts --- .../src/app/chat/chat.component.ts | 70 +++++++++++++------ 1 file changed, 49 insertions(+), 21 deletions(-) diff --git a/do_connect_frontend/src/app/chat/chat.component.ts b/do_connect_frontend/src/app/chat/chat.component.ts index 131f168..2859829 100644 --- a/do_connect_frontend/src/app/chat/chat.component.ts +++ b/do_connect_frontend/src/app/chat/chat.component.ts @@ -1,37 +1,65 @@ -import { Component, OnInit } from '@angular/core'; -import { Router } from '@angular/router'; +import { Component, OnDestroy, OnInit } from '@angular/core'; import { ChatService } from '../service/chat.service'; +import { getCurrentUsername, isUserAdmin } from '../utils/util'; + +const CHAT_REFRESH_FRQUENCY_IN_SECONDS = 5; + +interface ChatMessage { + message: string; + postedBy: string; + postedAt: Date; +} @Component({ selector: 'app-chat', templateUrl: './chat.component.html', styleUrls: ['./chat.component.css'], }) -export class ChatComponent implements OnInit { - constructor(private _chatservice: ChatService, private router: Router) {} - message: any; - data: any; - chatList: any; + +export class ChatComponent implements OnInit, OnDestroy { + + message: string; + chatMessageList: ChatMessage[]; + isUserAdmin: boolean; + interval: number | null = null; + currentUsername?: string = getCurrentUsername(); + + constructor(private _chatservice: ChatService) { + this.message = ''; + this.chatMessageList = []; + this.isUserAdmin = isUserAdmin(); + } + ngOnInit(): void { - if (localStorage.getItem('isAdmin') === 'false') this.getChats(); + if (!this.isUserAdmin) { + this.fetchChatMessages(); + this.interval = window.setInterval(() => { + this.fetchChatMessages(); + }, CHAT_REFRESH_FRQUENCY_IN_SECONDS * 1000); + } + } + + ngOnDestroy(): void { + if (!this.isUserAdmin && this.interval) { + clearInterval(this.interval); + this.interval = null; + } } - getChats() { - const seconds = 5; - setInterval(() => { - if (localStorage.getItem('isAdmin') === null) return; - this._chatservice.getChatList().subscribe({ - next: (res) => (this.chatList = res), - error: (err) => console.warn(err), - }); - }, seconds * 1000); + + fetchChatMessages() { + this._chatservice.getChatMessagesList().subscribe({ + next: (results) => (this.chatMessageList = results as ChatMessage[]), + error: (error) => console.error('Error while fetching chat messages list. Details: ', error), + }); } - onSend() { + + onSendMessage() { this._chatservice.createChat({ message: this.message }).subscribe({ - next: (res) => { - this.data = res; + next: (results) => { this.message = ''; + this.chatMessageList = results as ChatMessage[]; }, - error: (err) => this.router.navigate(['/error/' + err.status]), + error: (error) => console.error('Error while sending chat message. Details: ', error), }); } } From 3c40865697d77804967d858f2c84e069b4f5d6e1 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Sun, 28 Aug 2022 17:23:43 +0530 Subject: [PATCH 312/464] Update chat.component.html --- .../src/app/chat/chat.component.html | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/do_connect_frontend/src/app/chat/chat.component.html b/do_connect_frontend/src/app/chat/chat.component.html index b1e5562..8b2d32d 100644 --- a/do_connect_frontend/src/app/chat/chat.component.html +++ b/do_connect_frontend/src/app/chat/chat.component.html @@ -1,14 +1,14 @@
-

Chat Here

-
-

- {{ message.postedBy }}
- {{ message.message }} - {{ message.postAt }} -

+
+
+
+ {{ message.postedBy }} + {{ message.postedAt | date: 'medium' }} +
+ {{ message.message }} +
-
+
Chat Here name="" id="" /> - +
From 08ce297caa1c503852b485e5b3cd79b0b4d4d949 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Sun, 28 Aug 2022 17:23:46 +0530 Subject: [PATCH 313/464] Update chat.component.css --- .../src/app/chat/chat.component.css | 55 +++++++++++++++---- 1 file changed, 43 insertions(+), 12 deletions(-) diff --git a/do_connect_frontend/src/app/chat/chat.component.css b/do_connect_frontend/src/app/chat/chat.component.css index 1ad3b0d..83cc139 100644 --- a/do_connect_frontend/src/app/chat/chat.component.css +++ b/do_connect_frontend/src/app/chat/chat.component.css @@ -1,20 +1,51 @@ .chatbox { color: black; - height: 70vh; - width: 20rem; + height: max(50vh, 450px); + width: max(30vw, 300px); background-color: aliceblue; - padding: 1rem 2rem; - position: fixed; - bottom: 12%; - right: 6%; - border-radius: 5px; + padding: 0.5rem; + position: absolute; + bottom: 8rem; + right: 2rem; + border-radius: 0.5rem; + z-index: 5; } + .inputbox { - position: absolute; bottom: 0; - width: 80%; + padding-top: 0.25rem; +} + +.message-box { + height: calc(100% - 40px); + border: 1px; + overflow: auto; + position: relative; +} + +.message { + background-image: linear-gradient(to right top, #004dc0, #0e2a6c); + color: rgb(190, 205, 255); + margin-bottom: 0.5rem; + border-radius: 0.5rem; + padding: 0.5rem; + display: flex; + flex-direction: column; +} + +.message-right { + text-align: right; + color: white; +} + +.message-left { + text-align: left; + color: white; } -.msgbox { - height: 80%; - padding: 1rem; + +.message-header { + display: flex; + flex-direction: row; + justify-content: space-between; + font-size: smaller; } From 39ce2e5755de1e9b6de355acd631a2b61a7d61d4 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Sun, 28 Aug 2022 17:23:48 +0530 Subject: [PATCH 314/464] Update app.component.ts --- do_connect_frontend/src/app/app.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/do_connect_frontend/src/app/app.component.ts b/do_connect_frontend/src/app/app.component.ts index b16ed07..5d86972 100644 --- a/do_connect_frontend/src/app/app.component.ts +++ b/do_connect_frontend/src/app/app.component.ts @@ -6,5 +6,5 @@ import { Component } from '@angular/core'; styleUrls: ['./app.component.css'], }) export class AppComponent { - title = 'angular-project'; + title = 'do-connect'; } From defe2ce02b8e87cdf6eaa62fa2cba2164acdab1f Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Sun, 28 Aug 2022 17:23:51 +0530 Subject: [PATCH 315/464] Update app.component.html --- do_connect_frontend/src/app/app.component.html | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/do_connect_frontend/src/app/app.component.html b/do_connect_frontend/src/app/app.component.html index d06465f..79daec0 100644 --- a/do_connect_frontend/src/app/app.component.html +++ b/do_connect_frontend/src/app/app.component.html @@ -1,18 +1,6 @@ -
+
-
+
From 7e5962816b05d51258d7ed0cdb51b166bf894742 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Sun, 28 Aug 2022 17:23:53 +0530 Subject: [PATCH 316/464] Update app.component.css --- do_connect_frontend/src/app/app.component.css | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/do_connect_frontend/src/app/app.component.css b/do_connect_frontend/src/app/app.component.css index 8b13789..de6ecb4 100644 --- a/do_connect_frontend/src/app/app.component.css +++ b/do_connect_frontend/src/app/app.component.css @@ -1 +1,15 @@ +.main-container { + background-image: linear-gradient( + to right top, + #051937, + #0e2a6c, + #3d359f, + #7a35cd, + #c314f2 + ); + height: 100vh; +} +.routes-container { + height: calc(100vh - 112px); +} From c7f263bae5abb81d8b77e65c934642c0e911e143 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Sun, 28 Aug 2022 17:23:56 +0530 Subject: [PATCH 317/464] Update package.json --- do_connect_frontend/package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/do_connect_frontend/package.json b/do_connect_frontend/package.json index 0af615a..0053486 100644 --- a/do_connect_frontend/package.json +++ b/do_connect_frontend/package.json @@ -31,6 +31,7 @@ "@angular/cli": "~14.0.4", "@angular/compiler-cli": "^14.0.0", "@types/jasmine": "~4.0.0", + "@types/jwt-decode": "^3.1.0", "jasmine-core": "~4.1.0", "karma": "~6.3.0", "karma-chrome-launcher": "~3.1.0", From 11a076b3082e38449237619cae2fbef60405ff42 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Sun, 28 Aug 2022 17:23:58 +0530 Subject: [PATCH 318/464] Update package-lock.json --- do_connect_frontend/package-lock.json | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/do_connect_frontend/package-lock.json b/do_connect_frontend/package-lock.json index 2f0e9ad..de6495e 100644 --- a/do_connect_frontend/package-lock.json +++ b/do_connect_frontend/package-lock.json @@ -29,6 +29,7 @@ "@angular/cli": "~14.0.4", "@angular/compiler-cli": "^14.0.0", "@types/jasmine": "~4.0.0", + "@types/jwt-decode": "^3.1.0", "jasmine-core": "~4.1.0", "karma": "~6.3.0", "karma-chrome-launcher": "~3.1.0", @@ -2932,6 +2933,16 @@ "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, + "node_modules/@types/jwt-decode": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/jwt-decode/-/jwt-decode-3.1.0.tgz", + "integrity": "sha512-tthwik7TKkou3mVnBnvVuHnHElbjtdbM63pdBCbZTirCt3WAdM73Y79mOri7+ljsS99ZVwUFZHLMxJuJnv/z1w==", + "deprecated": "This is a stub types definition. jwt-decode provides its own type definitions, so you do not need this installed.", + "dev": true, + "dependencies": { + "jwt-decode": "*" + } + }, "node_modules/@types/mime": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", @@ -14211,6 +14222,15 @@ "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, + "@types/jwt-decode": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/jwt-decode/-/jwt-decode-3.1.0.tgz", + "integrity": "sha512-tthwik7TKkou3mVnBnvVuHnHElbjtdbM63pdBCbZTirCt3WAdM73Y79mOri7+ljsS99ZVwUFZHLMxJuJnv/z1w==", + "dev": true, + "requires": { + "jwt-decode": "*" + } + }, "@types/mime": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", From ad0e43a00f0e4e0cadf006177ce7570642e82b9d Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Sun, 28 Aug 2022 19:21:25 +0530 Subject: [PATCH 319/464] Update user.service.ts --- .../src/app/service/user.service.ts | 75 +++++-------------- 1 file changed, 20 insertions(+), 55 deletions(-) diff --git a/do_connect_frontend/src/app/service/user.service.ts b/do_connect_frontend/src/app/service/user.service.ts index a5b588e..65ff771 100644 --- a/do_connect_frontend/src/app/service/user.service.ts +++ b/do_connect_frontend/src/app/service/user.service.ts @@ -1,91 +1,56 @@ import { HttpClient, HttpHeaders } from '@angular/common/http'; import { ConditionalExpr } from '@angular/compiler'; import { Injectable } from '@angular/core'; -import { BehaviorSubject } from 'rxjs'; -import { BASE_URL } from '../constants/constants'; -import { getHeaders, isUserAdmin, isUserLoggedIn } from '../utils/util'; +import { AnswerPostType, BASE_URL, QuestionPostType, UserLoginType, UserRegisterType } from '../constants/constants'; +import { getHeaders } from '../utils/util'; @Injectable({ providedIn: 'root', }) -export class UserService { - baseURL = BASE_URL; - user = { - isLoggedIn: false, - isAdmin: false, - }; - constructor(private http: HttpClient) { - this.user.isLoggedIn = isUserLoggedIn(); - this.user.isAdmin = isUserAdmin(); - } +export class UserService { - private intialUser = new BehaviorSubject(this.user); - currentUser = this.intialUser.asObservable(); + constructor(private http: HttpClient) {} - register(user: any) { - // console.warn(user); - return this.http.post(`${this.baseURL}/register`, user); - } - login(user: any) { - // console.warn(user); - return this.http.post(`${this.baseURL}/login`, user); + register(user: UserRegisterType) { + return this.http.post(`${BASE_URL}/register`, user); } - setUser(user: any) { - this.intialUser.next(user); + login(user: UserLoginType) { + return this.http.post(`${BASE_URL}/login`, user); } - getQuestion(id: any) { + getQuestion(id: number) { const headers = getHeaders(); - return this.http.get(this.baseURL + '/questions/' + id, { headers }); + return this.http.get(BASE_URL + '/questions/' + id, { headers }); } getApprovedQuestions() { - return this.http.get(this.baseURL + '/questions'); + return this.http.get(BASE_URL + '/questions'); } - postQuestion(question: any) { - console.log(question); + postQuestion(question: QuestionPostType) { const headers = getHeaders(); - console.log(headers); - return this.http.post(this.baseURL + '/questions', question, { - headers, - }); + return this.http.post(BASE_URL + '/questions', question, { headers }); } - postAnswer(quesId: any, answer: any) { - console.log(quesId, answer); + postAnswer(questionId: number, answer: AnswerPostType) { const headers = getHeaders(); - console.log(headers); - return this.http.post( - this.baseURL + '/questions/' + quesId + '/answers', - answer, - { - headers, - } - ); + return this.http.post(BASE_URL + '/questions/' + questionId + '/answers', answer, { headers }); } - searchQuestion(query: any) { + searchQuestion(query: string) { const headers = getHeaders(); - console.log(headers); - return this.http.get(this.baseURL + '/questions?search=' + query, { - headers: headers, - }); + return this.http.get(BASE_URL + '/questions?search=' + query, { headers }); } - getAnswers(quesId: any) { + getAnswers(quesId: number) { const headers = getHeaders(); - return this.http.get(this.baseURL + '/questions/' + quesId + '/answers', { - headers, - }); + return this.http.get(BASE_URL + '/questions/' + quesId + '/answers', { headers }); } logout() { const headers = getHeaders(); - return this.http.get(this.baseURL + '/signout', { - headers, - }); + return this.http.get(BASE_URL + '/signout', { headers }); } } From 44faed1834e41f5e08151235892f82a812e8a252 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Sun, 28 Aug 2022 19:21:27 +0530 Subject: [PATCH 320/464] Update register.component.ts --- .../src/app/register/register.component.ts | 67 +++++++++++-------- 1 file changed, 38 insertions(+), 29 deletions(-) diff --git a/do_connect_frontend/src/app/register/register.component.ts b/do_connect_frontend/src/app/register/register.component.ts index a3c6cf8..66e0fcb 100644 --- a/do_connect_frontend/src/app/register/register.component.ts +++ b/do_connect_frontend/src/app/register/register.component.ts @@ -1,50 +1,59 @@ import { Component, OnInit } from '@angular/core'; import { Router } from '@angular/router'; import { UserService } from '../service/user.service'; +import { FormGroup, FormControl, Validators } from "@angular/forms"; +import { HttpErrorResponse } from '@angular/common/http'; @Component({ selector: 'app-register', templateUrl: './register.component.html', styleUrls: ['./register.component.css'], }) + export class RegisterComponent implements OnInit { - username = ''; - name = ''; - email = ''; - password = ''; - role = 'User'; - warning = ''; + public registerForm !: FormGroup; + constructor(private _userService: UserService, private router: Router) {} - ngOnInit(): void {} + ngOnInit(): void { + this.registerForm = new FormGroup({ + username: new FormControl('', [Validators.required]), + name: new FormControl('', [Validators.required]), + email: new FormControl('', [ + Validators.required, + Validators.pattern("[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,4}$"), + ]), + password: new FormControl('', [Validators.required, Validators.minLength(8)]), + role: new FormControl('user', [Validators.required]), + }); + } - onRegister() { - console.log(this.role); - if (this.name === '' || this.email === '' || this.password === '') { - this.warning = 'All field required'; - return; - } - let isAdmin = this.role === 'User' ? false : true; - console.log({ - name: this.name, - email: this.email, - password: this.password, - username: this.username, - isAdmin: isAdmin, - }); + register() { + let isAdmin = this.registerForm.value.role === 'user' ? false : true; this._userService .register({ - name: this.name, - email: this.email, - password: this.password, - username: this.username, + name: this.registerForm.value.name, + email: this.registerForm.value.email, + password: this.registerForm.value.password, + username: this.registerForm.value.username, isAdmin: isAdmin, }) .subscribe({ - next: (res) => this.router.navigate(['/login']), - error: (err) => { - if (err.status === 200) this.router.navigate(['/login']); - else this.router.navigate(['/error/' + err.status]); + next: (result) => { + alert(result); + this.router.navigate(['/login']); + }, + error: (error: HttpErrorResponse) => { + if (error.status === 200) { + alert(error.error); + this.router.navigate(['/login']); + } + if (error.status === 400) { + alert(error.error); + } + else { + this.router.navigate(['/error/' + error.status]); + } }, }); } From de3ab3da7f1c6f6077f9d702720d4870d598a3b2 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Sun, 28 Aug 2022 19:21:29 +0530 Subject: [PATCH 321/464] Update register.component.html --- .../src/app/register/register.component.html | 125 +++++++++--------- 1 file changed, 60 insertions(+), 65 deletions(-) diff --git a/do_connect_frontend/src/app/register/register.component.html b/do_connect_frontend/src/app/register/register.component.html index 307df55..14750ab 100644 --- a/do_connect_frontend/src/app/register/register.component.html +++ b/do_connect_frontend/src/app/register/register.component.html @@ -1,67 +1,62 @@ -
-
-
-

Sign up

-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
- -
- -

{{ warning }}

-
-
-

- Already registered? - Sign in now -

+
+
+
+
+

Register

+
+ + +
+ Username is required. +
+
+
+ + +
+ Name is required. +
+
+
+ + +
+ Email is required. +
+
+ Invalid email. +
+
+
+ + +
+ Password is required. +
+
+ Password must be at least 8 characters long. +
+
+
+ + +
+
+ +
+
+ Already registered? Click to Login +
+
-
-
+ From f098a331e9785a7ef1423439ca1845864d682638 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Sun, 28 Aug 2022 19:21:31 +0530 Subject: [PATCH 322/464] Update navbar.component.ts --- .../src/app/navbar/navbar.component.ts | 23 ++++++------------- 1 file changed, 7 insertions(+), 16 deletions(-) diff --git a/do_connect_frontend/src/app/navbar/navbar.component.ts b/do_connect_frontend/src/app/navbar/navbar.component.ts index 1eefbbf..7b64a57 100644 --- a/do_connect_frontend/src/app/navbar/navbar.component.ts +++ b/do_connect_frontend/src/app/navbar/navbar.component.ts @@ -1,6 +1,7 @@ import { Component, OnInit } from '@angular/core'; import { Router } from '@angular/router'; import { UserService } from '../service/user.service'; +import { isUserAdmin, isUserLoggedIn } from '../utils/util'; @Component({ selector: 'app-navbar', @@ -8,28 +9,18 @@ import { UserService } from '../service/user.service'; styleUrls: ['./navbar.component.css'], }) export class NavbarComponent implements OnInit { - user = { - isLoggedIn: false, - isAdmin: false, - }; + + isAdmin = isUserAdmin(); + isLoggedIn = isUserLoggedIn(); constructor(private _userService: UserService, private router: Router) {} - ngOnInit(): void { - this._userService.currentUser.subscribe((user) => { - this.user = user; - console.log(user); - }); - } + ngOnInit(): void {} + onLogout() { - this._userService.setUser({ - isLoggedIn: false, - isAdmin: false, - }); this._userService.logout().subscribe({ - next: (res) => { + next: (result) => { localStorage.clear(); - alert('Logged Out Successfully!'); this.router.navigate(['/']); }, error: (err) => { From 515e163455fe1aba1db88dac6b1832ee1dc55101 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Sun, 28 Aug 2022 19:21:33 +0530 Subject: [PATCH 323/464] Update navbar.component.html --- .../src/app/navbar/navbar.component.html | 28 ++++++++----------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/do_connect_frontend/src/app/navbar/navbar.component.html b/do_connect_frontend/src/app/navbar/navbar.component.html index a9ab9b2..6340162 100644 --- a/do_connect_frontend/src/app/navbar/navbar.component.html +++ b/do_connect_frontend/src/app/navbar/navbar.component.html @@ -1,5 +1,5 @@ -
-
+
-
From 5b84956d5bef6fb795748194d392cba991e76359 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Sun, 28 Aug 2022 19:21:44 +0530 Subject: [PATCH 328/464] Update footer.component.html --- do_connect_frontend/src/app/footer/footer.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/do_connect_frontend/src/app/footer/footer.component.html b/do_connect_frontend/src/app/footer/footer.component.html index 5a8de74..1622177 100644 --- a/do_connect_frontend/src/app/footer/footer.component.html +++ b/do_connect_frontend/src/app/footer/footer.component.html @@ -1,6 +1,6 @@
-
+
© 2022 WIPRO_VELOCITY_ FSD_ SD_ APR C IV Group 9. All rights reserved.
From 9a3a36d70cd518c33d6fae3cf0543522f74e0e28 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Sun, 28 Aug 2022 19:21:46 +0530 Subject: [PATCH 329/464] Update constants.ts --- .../src/app/constants/constants.ts | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/do_connect_frontend/src/app/constants/constants.ts b/do_connect_frontend/src/app/constants/constants.ts index 4dc33b4..e16f2d7 100644 --- a/do_connect_frontend/src/app/constants/constants.ts +++ b/do_connect_frontend/src/app/constants/constants.ts @@ -7,3 +7,27 @@ export interface JWTCustomPayload extends JwtPayload { email: string; name: string; } + +export interface UserRegisterType { + username: string; + name: string; + email: string; + password: string; + isAdmin: boolean; +} + +export interface UserLoginType { + username: string; + password: string; +} + +export interface QuestionPostType { + question: string; + topic: string; + images: string[]; +} + +export interface AnswerPostType { + answer: string; + images: string[]; +} From 471624c6fe48898b4e86c7c9a4458d9d55808c83 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Sun, 28 Aug 2022 19:21:48 +0530 Subject: [PATCH 330/464] Update app.module.ts --- do_connect_frontend/src/app/app.module.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/do_connect_frontend/src/app/app.module.ts b/do_connect_frontend/src/app/app.module.ts index f861bea..5ec24ed 100644 --- a/do_connect_frontend/src/app/app.module.ts +++ b/do_connect_frontend/src/app/app.module.ts @@ -1,6 +1,6 @@ import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; -import { FormsModule } from '@angular/forms'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { HttpClientModule } from '@angular/common/http'; import { AngularEditorModule } from '@kolkov/angular-editor'; @@ -39,6 +39,7 @@ import { ErrorComponent } from './error/error.component'; FormsModule, HttpClientModule, AngularEditorModule, + ReactiveFormsModule, ], providers: [], bootstrap: [AppComponent], From 70641e0535fafaf525b8c1b49d60eece3205076f Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Sun, 28 Aug 2022 19:21:51 +0530 Subject: [PATCH 331/464] Update app.component.css --- do_connect_frontend/src/app/app.component.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/do_connect_frontend/src/app/app.component.css b/do_connect_frontend/src/app/app.component.css index de6ecb4..4dfa7d3 100644 --- a/do_connect_frontend/src/app/app.component.css +++ b/do_connect_frontend/src/app/app.component.css @@ -11,5 +11,6 @@ } .routes-container { - height: calc(100vh - 112px); + height: calc(100vh - 98px); + overflow: auto; } From 3afb901a712a6ff75b0f182869f69e515debe67d Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Sun, 28 Aug 2022 19:45:59 +0530 Subject: [PATCH 332/464] Update user.service.ts --- do_connect_frontend/src/app/service/user.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/do_connect_frontend/src/app/service/user.service.ts b/do_connect_frontend/src/app/service/user.service.ts index 65ff771..16ac70c 100644 --- a/do_connect_frontend/src/app/service/user.service.ts +++ b/do_connect_frontend/src/app/service/user.service.ts @@ -13,7 +13,7 @@ export class UserService { constructor(private http: HttpClient) {} register(user: UserRegisterType) { - return this.http.post(`${BASE_URL}/register`, user); + return this.http.post(`${BASE_URL}/register`, user, { responseType: 'text' }); } login(user: UserLoginType) { From 5297d5f7568a6fbf6ff7b99acc8394f28898d368 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Sun, 28 Aug 2022 19:46:01 +0530 Subject: [PATCH 333/464] Update register.component.ts --- do_connect_frontend/src/app/register/register.component.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/do_connect_frontend/src/app/register/register.component.ts b/do_connect_frontend/src/app/register/register.component.ts index 66e0fcb..9100623 100644 --- a/do_connect_frontend/src/app/register/register.component.ts +++ b/do_connect_frontend/src/app/register/register.component.ts @@ -44,10 +44,6 @@ export class RegisterComponent implements OnInit { this.router.navigate(['/login']); }, error: (error: HttpErrorResponse) => { - if (error.status === 200) { - alert(error.error); - this.router.navigate(['/login']); - } if (error.status === 400) { alert(error.error); } From 9e35c4c584e1f9b607ae992e06cf4594279ac303 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Sun, 28 Aug 2022 19:46:06 +0530 Subject: [PATCH 334/464] Update register.component.html --- do_connect_frontend/src/app/register/register.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/do_connect_frontend/src/app/register/register.component.html b/do_connect_frontend/src/app/register/register.component.html index 14750ab..e64a489 100644 --- a/do_connect_frontend/src/app/register/register.component.html +++ b/do_connect_frontend/src/app/register/register.component.html @@ -13,7 +13,7 @@
- +
Name is required. From 3e1c637d29b1997d43dd09f129e64a4d7ae4bed9 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Sun, 28 Aug 2022 19:46:18 +0530 Subject: [PATCH 335/464] Update register.component.css --- .../src/app/register/register.component.css | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/do_connect_frontend/src/app/register/register.component.css b/do_connect_frontend/src/app/register/register.component.css index 777d39b..27553dd 100644 --- a/do_connect_frontend/src/app/register/register.component.css +++ b/do_connect_frontend/src/app/register/register.component.css @@ -1,17 +1,17 @@ .form-group input { color: white; - background-color: transparent; - /* background-color: rgba(191, 191, 191, 0.193); */ + background-color: transparent !important; border: none; - border-radius: 0; - border-bottom: 2px solid white; + border-radius: 0.25rem; + border: 1px solid white; } + .form-group input:focus { color: white; outline: none !important; box-shadow: none; - background-color: rgba(191, 191, 191, 0.193); + background-color: rgba(191, 191, 191, 0.193) !important; border: none; - border-radius: 0; - border-bottom: 2px solid white; + border-radius: 0.25rem; + border: 1px solid white; } From 19a8e558524a236f0edbc396884b9118864414a6 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Sun, 28 Aug 2022 20:44:20 +0530 Subject: [PATCH 336/464] Update user.service.ts --- do_connect_frontend/src/app/service/user.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/do_connect_frontend/src/app/service/user.service.ts b/do_connect_frontend/src/app/service/user.service.ts index 16ac70c..75452db 100644 --- a/do_connect_frontend/src/app/service/user.service.ts +++ b/do_connect_frontend/src/app/service/user.service.ts @@ -51,6 +51,6 @@ export class UserService { logout() { const headers = getHeaders(); - return this.http.get(BASE_URL + '/signout', { headers }); + return this.http.get(BASE_URL + '/signout', { headers, responseType: 'text' }); } } From 034e31ca092dc0d9b6f781342896bc4fd1b54af4 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Sun, 28 Aug 2022 20:44:22 +0530 Subject: [PATCH 337/464] Update navbar.component.ts --- .../src/app/navbar/navbar.component.ts | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/do_connect_frontend/src/app/navbar/navbar.component.ts b/do_connect_frontend/src/app/navbar/navbar.component.ts index 7b64a57..d13979f 100644 --- a/do_connect_frontend/src/app/navbar/navbar.component.ts +++ b/do_connect_frontend/src/app/navbar/navbar.component.ts @@ -1,3 +1,4 @@ +import { HttpErrorResponse } from '@angular/common/http'; import { Component, OnInit } from '@angular/core'; import { Router } from '@angular/router'; import { UserService } from '../service/user.service'; @@ -15,20 +16,29 @@ export class NavbarComponent implements OnInit { constructor(private _userService: UserService, private router: Router) {} - ngOnInit(): void {} + ngOnInit(): void { + this.router.events.subscribe(event => { + if (event.constructor.name === "NavigationEnd") { + this.isAdmin = isUserAdmin(); + this.isLoggedIn = isUserLoggedIn(); + } + }); + } onLogout() { this._userService.logout().subscribe({ next: (result) => { + alert(result); localStorage.clear(); - this.router.navigate(['/']); + this.router.navigate(['/login']); }, - error: (err) => { - if (err.status === 200) { - localStorage.clear(); - alert('Logged Out Successfully!'); - this.router.navigate(['/']); - } else this.router.navigate(['/error/' + err.status]); + error: (error: HttpErrorResponse) => { + if (error.status === 400) { + alert(error.error); + } + else { + this.router.navigate(['/error/' + error.status]); + } }, }); } From a7cb917f1ec0333b56901aad59ecf4c52fd8da43 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Sun, 28 Aug 2022 20:44:27 +0530 Subject: [PATCH 338/464] Update login.component.ts --- .../src/app/login/login.component.ts | 35 ++++++++++--------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/do_connect_frontend/src/app/login/login.component.ts b/do_connect_frontend/src/app/login/login.component.ts index babb4b2..aa01951 100644 --- a/do_connect_frontend/src/app/login/login.component.ts +++ b/do_connect_frontend/src/app/login/login.component.ts @@ -1,4 +1,6 @@ +import { HttpErrorResponse } from '@angular/common/http'; import { Component, OnInit } from '@angular/core'; +import { FormControl, FormGroup, Validators } from '@angular/forms'; import { Router } from '@angular/router'; import jwtDecode from 'jwt-decode'; import { JWTCustomPayload } from '../constants/constants'; @@ -10,33 +12,34 @@ import { UserService } from '../service/user.service'; styleUrls: ['./login.component.css'], }) export class LoginComponent implements OnInit { - username = ''; - password = ''; - warning = ''; + + public loginForm !: FormGroup; + constructor(private router: Router, private _userService: UserService) {} - ngOnInit(): void {} + ngOnInit(): void { + this.loginForm = new FormGroup({ + username: new FormControl('', [Validators.required]), + password: new FormControl('', [Validators.required, Validators.minLength(8)]) + }); + } - onLogin() { - if (this.username === '' || this.password === '') { - this.warning = 'All field required'; - return; - } + login() { this._userService - .login({ username: this.username, password: this.password }) + .login({ username: this.loginForm.value.username, password: this.loginForm.value.password }) .subscribe({ - next: (res: any) => { - const jwtData: JWTCustomPayload = jwtDecode(res.token); - localStorage.setItem('token', res.token); + next: (result: any) => { + const token: string = result.token; + const jwtData: JWTCustomPayload = jwtDecode(token); + localStorage.setItem('token', token); if (jwtData.isAdmin) { this.router.navigate(['/dashboard']); } else { this.router.navigate(['/']); } }, - error: (err) => { - alert('Invalid Credentials'); - // this.router.navigate(['/error/' + err.status]); + error: (error: HttpErrorResponse) => { + alert('Invalid Credentials. Please try again.'); }, }); } From d8c7549f3df6e85f929d3a4cd517f299f531e240 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Sun, 28 Aug 2022 20:44:29 +0530 Subject: [PATCH 339/464] Update login.component.html --- .../src/app/login/login.component.html | 83 ++++++++----------- 1 file changed, 33 insertions(+), 50 deletions(-) diff --git a/do_connect_frontend/src/app/login/login.component.html b/do_connect_frontend/src/app/login/login.component.html index 671d2b8..70cbbde 100644 --- a/do_connect_frontend/src/app/login/login.component.html +++ b/do_connect_frontend/src/app/login/login.component.html @@ -1,52 +1,35 @@ -
-
-
-

Sign in

- -
- - -
-
- - -
-
- - - - - - Forgot password? -
- -
- -

{{ warning }}

-
-
-

- Not registered yet? - Create an account -

+
+
+
+
+

Login

+
+ + +
+ Username is required. +
+
+
+ + +
+ Password is required. +
+
+ Password must be at least 8 characters long. +
+
+
+ +
+
+ New user? Click to register +
+
-
-
+ From 9fc2d685ec3bc07e709133695a24306e825e4a2e Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Sun, 28 Aug 2022 20:44:34 +0530 Subject: [PATCH 340/464] Update login.component.css --- .../src/app/login/login.component.css | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/do_connect_frontend/src/app/login/login.component.css b/do_connect_frontend/src/app/login/login.component.css index bb532b1..27553dd 100644 --- a/do_connect_frontend/src/app/login/login.component.css +++ b/do_connect_frontend/src/app/login/login.component.css @@ -1,16 +1,17 @@ .form-group input { color: white; - background-color: transparent; + background-color: transparent !important; border: none; - border-radius: 0; - border-bottom: 2px solid white; + border-radius: 0.25rem; + border: 1px solid white; } + .form-group input:focus { color: white; outline: none !important; box-shadow: none; - background-color: rgba(191, 191, 191, 0.193); + background-color: rgba(191, 191, 191, 0.193) !important; border: none; - border-radius: 0; - border-bottom: 2px solid white; + border-radius: 0.25rem; + border: 1px solid white; } From caeee9c90b6d2b31e6bb7aaa25730d37fc6f0bf5 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Sun, 28 Aug 2022 20:44:36 +0530 Subject: [PATCH 341/464] Update chat.component.html --- do_connect_frontend/src/app/chat/chat.component.html | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/do_connect_frontend/src/app/chat/chat.component.html b/do_connect_frontend/src/app/chat/chat.component.html index 8b2d32d..2227459 100644 --- a/do_connect_frontend/src/app/chat/chat.component.html +++ b/do_connect_frontend/src/app/chat/chat.component.html @@ -1,5 +1,5 @@
-
+
{{ message.postedBy }} @@ -9,13 +9,7 @@
- +
From 1b0257db49b47b05b4e6738744fc543b7594e09c Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Sun, 28 Aug 2022 23:51:57 +0530 Subject: [PATCH 342/464] Create upload-image.service.ts --- .../src/app/service/upload-image.service.ts | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 do_connect_frontend/src/app/service/upload-image.service.ts diff --git a/do_connect_frontend/src/app/service/upload-image.service.ts b/do_connect_frontend/src/app/service/upload-image.service.ts new file mode 100644 index 0000000..e235a4f --- /dev/null +++ b/do_connect_frontend/src/app/service/upload-image.service.ts @@ -0,0 +1,30 @@ +import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { Observable } from 'rxjs'; +import { BASE_URL } from '../constants/constants'; + +@Injectable({ + providedIn: 'root', +}) + +export class UploadImageService { + + constructor(private http: HttpClient) {} + + uploadImage(file: any): Observable { + const formData = new FormData(); + formData.append('image', file, file.name); // Store form name as "file" with file data + const headers = new HttpHeaders({ + Authorization: `Bearer ${localStorage.getItem('token')}`, + }); + return this.http.post(`${BASE_URL}/images`, formData, { headers }); // Make http post request over api with formData as req + } + + getImage(imageName: string): Observable { + const headers = new HttpHeaders({ + Authorization: `Bearer ${localStorage.getItem('token')}`, + }); + return this.http.get(`${BASE_URL}/images/${imageName}`, { headers }); + } + +} From 730518dda65b393479e802e09615e99634fdccb6 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Sun, 28 Aug 2022 23:52:01 +0530 Subject: [PATCH 343/464] Create upload-image.service.spec.ts --- .../src/app/service/upload-image.service.spec.ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 do_connect_frontend/src/app/service/upload-image.service.spec.ts diff --git a/do_connect_frontend/src/app/service/upload-image.service.spec.ts b/do_connect_frontend/src/app/service/upload-image.service.spec.ts new file mode 100644 index 0000000..29cedf6 --- /dev/null +++ b/do_connect_frontend/src/app/service/upload-image.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { UploadImageService } from './upload-image.service'; + +describe('UploadImageService', () => { + let service: UploadImageService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(UploadImageService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); From 0b3a326b183fe62e5cf9f22bb4b2918e89678781 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Sun, 28 Aug 2022 23:52:04 +0530 Subject: [PATCH 344/464] Delete upload-files.service.ts --- .../src/app/service/upload-files.service.ts | 41 ------------------- 1 file changed, 41 deletions(-) delete mode 100644 do_connect_frontend/src/app/service/upload-files.service.ts diff --git a/do_connect_frontend/src/app/service/upload-files.service.ts b/do_connect_frontend/src/app/service/upload-files.service.ts deleted file mode 100644 index 1fdb565..0000000 --- a/do_connect_frontend/src/app/service/upload-files.service.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { - HttpClient, - HttpEvent, - HttpHeaders, - HttpRequest, -} from '@angular/common/http'; -import { Injectable } from '@angular/core'; -import { Observable } from 'rxjs'; -import { BASE_URL } from '../constants/constants'; -import { getHeaders } from '../utils/util'; - -@Injectable({ - providedIn: 'root', -}) -export class UploadFilesService { - private baseURL = BASE_URL; - constructor(private http: HttpClient) {} - // Returns an observable - upload(file: any): Observable { - // Create form data - const formData = new FormData(); - - // Store form name as "file" with file data - formData.append('image', file, file.name); - - // Make http post request over api - // with formData as req - const token = localStorage.getItem('token'); - const headers = new HttpHeaders({ - Authorization: `Bearer ${token}`, - }); - return this.http.post(`${this.baseURL}/images`, formData, { headers }); - } - getFiles(): Observable { - const token = localStorage.getItem('token'); - const headers = new HttpHeaders({ - Authorization: `Bearer ${token}`, - }); - return this.http.get(`${this.baseURL}/images`, { headers }); - } -} From 62fca9c8e9cf72623276a43608e9e073a9e6ed2a Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Sun, 28 Aug 2022 23:52:08 +0530 Subject: [PATCH 345/464] Delete upload-files.service.spec.ts --- .../src/app/service/upload-files.service.spec.ts | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 do_connect_frontend/src/app/service/upload-files.service.spec.ts diff --git a/do_connect_frontend/src/app/service/upload-files.service.spec.ts b/do_connect_frontend/src/app/service/upload-files.service.spec.ts deleted file mode 100644 index b68459a..0000000 --- a/do_connect_frontend/src/app/service/upload-files.service.spec.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { TestBed } from '@angular/core/testing'; - -import { UploadFilesService } from './upload-files.service'; - -describe('UploadFilesService', () => { - let service: UploadFilesService; - - beforeEach(() => { - TestBed.configureTestingModule({}); - service = TestBed.inject(UploadFilesService); - }); - - it('should be created', () => { - expect(service).toBeTruthy(); - }); -}); From 8cbd36aeeea7fac4222f31edbf9d51060f3f489d Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Sun, 28 Aug 2022 23:52:12 +0530 Subject: [PATCH 346/464] Update question.component.ts --- .../src/app/question/question.component.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/do_connect_frontend/src/app/question/question.component.ts b/do_connect_frontend/src/app/question/question.component.ts index 9c5eab3..61ee8da 100644 --- a/do_connect_frontend/src/app/question/question.component.ts +++ b/do_connect_frontend/src/app/question/question.component.ts @@ -1,6 +1,6 @@ import { Component, OnInit } from '@angular/core'; import { ActivatedRoute, Route, Router } from '@angular/router'; -import { UploadFilesService } from '../service/upload-files.service'; +import { UploadImageService } from '../service/upload-image.service'; import { UserService } from '../service/user.service'; @Component({ @@ -16,11 +16,12 @@ export class QuestionComponent implements OnInit { warning = ''; uploadedImages: string[] = []; file: File = new File(['init'], 'init.txt'); + constructor( private _userService: UserService, private activatedRoute: ActivatedRoute, private router: Router, - private _uploadService: UploadFilesService + private _uploadService: UploadImageService ) {} ngOnInit(): void { @@ -41,6 +42,7 @@ export class QuestionComponent implements OnInit { error: (err) => this.router.navigate(['/error/' + err.status]), }); } + onChange(event: any) { this.file = event.target.files[0]; } @@ -49,7 +51,7 @@ export class QuestionComponent implements OnInit { return imageUrl; } onUploadImage() { - this._uploadService.upload(this.file).subscribe({ + this._uploadService.uploadImage(this.file).subscribe({ next: (res) => console.warn(res), error: (err) => { if (err.status === 200) this.uploadedImages.push(err.error.text); From 5a1503bf4c383908b52f91851d41ce0856c0d2a7 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Sun, 28 Aug 2022 23:52:17 +0530 Subject: [PATCH 347/464] Update post-question.component.ts --- .../post-question/post-question.component.ts | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/do_connect_frontend/src/app/post-question/post-question.component.ts b/do_connect_frontend/src/app/post-question/post-question.component.ts index f455fc2..7275ec7 100644 --- a/do_connect_frontend/src/app/post-question/post-question.component.ts +++ b/do_connect_frontend/src/app/post-question/post-question.component.ts @@ -1,7 +1,6 @@ import { Component, OnInit } from '@angular/core'; -import { DomSanitizer, SafeUrl } from '@angular/platform-browser'; import { Router } from '@angular/router'; -import { UploadFilesService } from '../service/upload-files.service'; +import { UploadImageService } from '../service/upload-image.service'; import { UserService } from '../service/user.service'; @Component({ @@ -9,29 +8,33 @@ import { UserService } from '../service/user.service'; templateUrl: './post-question.component.html', styleUrls: ['./post-question.component.css'], }) + export class PostQuestionComponent implements OnInit { question = ''; topic = 'java'; warning = ''; uploadedImages: string[] = []; - file: File = new File(['init'], 'init.txt'); + imageFile: File = new File(['init'], 'init.png'); constructor( - private _uploadService: UploadFilesService, + private _uploadService: UploadImageService, private _userService: UserService, private router: Router ) {} ngOnInit(): void {} + onChange(event: any) { - this.file = event.target.files[0]; + this.imageFile = event.target.files[0]; } - getImageUrl(image: any) { - const imageUrl = 'http://localhost:4000/' + image; + + getImageUrl(imageName: string) { + const imageUrl = 'http://localhost:4000/' + imageName; return imageUrl; } + onUploadImage() { - this._uploadService.upload(this.file).subscribe({ + this._uploadService.uploadImage(this.imageFile).subscribe({ next: (res) => console.warn(res), error: (err) => { if (err.status === 200) this.uploadedImages.push(err.error.text); @@ -39,6 +42,7 @@ export class PostQuestionComponent implements OnInit { }, }); } + onSubmit() { if (this.question === '') { this.warning = 'All fields are required!'; @@ -58,4 +62,5 @@ export class PostQuestionComponent implements OnInit { error: (err) => this.router.navigate(['/error/' + err.status]), }); } + } From 5057cb6db6701b012d17e4374256ac8c83461feb Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Sun, 28 Aug 2022 23:52:20 +0530 Subject: [PATCH 348/464] Update post-question.component.html --- .../src/app/post-question/post-question.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/do_connect_frontend/src/app/post-question/post-question.component.html b/do_connect_frontend/src/app/post-question/post-question.component.html index aac0c09..ce527c7 100644 --- a/do_connect_frontend/src/app/post-question/post-question.component.html +++ b/do_connect_frontend/src/app/post-question/post-question.component.html @@ -31,7 +31,7 @@
- + Date: Sun, 28 Aug 2022 23:52:22 +0530 Subject: [PATCH 349/464] Update constants.ts --- .../src/app/constants/constants.ts | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/do_connect_frontend/src/app/constants/constants.ts b/do_connect_frontend/src/app/constants/constants.ts index e16f2d7..8819a2e 100644 --- a/do_connect_frontend/src/app/constants/constants.ts +++ b/do_connect_frontend/src/app/constants/constants.ts @@ -31,3 +31,39 @@ export interface AnswerPostType { answer: string; images: string[]; } + +export const QUESTIONS_TOPICS = [ + 'Actors', + 'Algebra', + 'Applications', + 'Arts', + 'Books', + 'Climate Change', + 'Comedy / Humour', + 'Commerce', + 'Computer Science', + 'Current Affairs', + 'Electronics', + 'Engineering', + 'Food', + 'Games', + 'General', + 'General Knowledge', + 'History', + 'Hobbies', + 'Humanity', + 'Information Technology', + 'Internet', + 'Mathematics', + 'Movies', + 'Music', + 'Pets', + 'Philosophy', + 'Programming', + 'Random', + 'Restaurants', + 'Science', + 'Television', + 'Travel', + 'Weather', +]; From 8cb0e557ef16a0ba14a9f2ea9237583123d7364c Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 00:13:29 +0530 Subject: [PATCH 350/464] Update app.module.ts --- do_connect_frontend/src/app/app.module.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/do_connect_frontend/src/app/app.module.ts b/do_connect_frontend/src/app/app.module.ts index 5ec24ed..cabbfd7 100644 --- a/do_connect_frontend/src/app/app.module.ts +++ b/do_connect_frontend/src/app/app.module.ts @@ -17,6 +17,7 @@ import { PostQuestionComponent } from './post-question/post-question.component'; import { ChatComponent } from './chat/chat.component'; import { QuestionComponent } from './question/question.component'; import { ErrorComponent } from './error/error.component'; +import { authInterceptorProviders } from './utils/auth.interceptor'; @NgModule({ declarations: [ @@ -41,7 +42,7 @@ import { ErrorComponent } from './error/error.component'; AngularEditorModule, ReactiveFormsModule, ], - providers: [], + providers: [authInterceptorProviders], bootstrap: [AppComponent], }) export class AppModule {} From 29ccfec99389b0181ce9a18a5b14a924915c2c0d Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 00:13:31 +0530 Subject: [PATCH 351/464] Update navbar.component.ts --- do_connect_frontend/src/app/navbar/navbar.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/do_connect_frontend/src/app/navbar/navbar.component.ts b/do_connect_frontend/src/app/navbar/navbar.component.ts index d13979f..9bf9d49 100644 --- a/do_connect_frontend/src/app/navbar/navbar.component.ts +++ b/do_connect_frontend/src/app/navbar/navbar.component.ts @@ -28,8 +28,8 @@ export class NavbarComponent implements OnInit { onLogout() { this._userService.logout().subscribe({ next: (result) => { - alert(result); localStorage.clear(); + alert(result); this.router.navigate(['/login']); }, error: (error: HttpErrorResponse) => { From f90b3be2639118c0e6648c5481b06ac61bdc009c Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 00:13:34 +0530 Subject: [PATCH 352/464] Update admin.service.ts --- .../src/app/service/admin.service.ts | 68 ++++--------------- 1 file changed, 14 insertions(+), 54 deletions(-) diff --git a/do_connect_frontend/src/app/service/admin.service.ts b/do_connect_frontend/src/app/service/admin.service.ts index 14e194f..6aa8205 100644 --- a/do_connect_frontend/src/app/service/admin.service.ts +++ b/do_connect_frontend/src/app/service/admin.service.ts @@ -1,85 +1,45 @@ import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { BASE_URL } from '../constants/constants'; -import { getHeaders } from '../utils/util'; @Injectable({ providedIn: 'root', }) + export class AdminService { - baseURL = BASE_URL; constructor(private http: HttpClient) {} getUnapprovedQuestions() { - const headers = getHeaders(); - return this.http.get(this.baseURL + '/questions?status=unapproved', { - headers: headers, - }); + return this.http.get(BASE_URL + '/questions?status=unapproved'); } + getUnapprovedAnswers() { - const headers = getHeaders(); - console.log(headers); - return this.http.get(this.baseURL + '/answers?status=unapproved', { - headers: headers, - }); + return this.http.get(BASE_URL + '/answers?status=unapproved'); } getUsers() { - const headers = getHeaders(); - return this.http.get(this.baseURL + '/users', { - headers: headers, - }); + return this.http.get(BASE_URL + '/users'); } deleteUser(id: any) { - const headers = getHeaders(); - return this.http.delete(this.baseURL + '/users/' + id, { - headers: headers, - }); + return this.http.delete(BASE_URL + '/users/' + id); } approveQuestion(id: any) { - const headers = getHeaders(); - return this.http.put( - this.baseURL + '/questions/' + id, - { - isApproved: true, - }, - { headers: headers } - ); + return this.http.put(BASE_URL + '/questions/' + id, { isApproved: true }); } + approveAnswer(answer: any) { - const headers = getHeaders(); - return this.http.put( - this.baseURL + - '/questions/' + - answer.question.id + - '/answers/' + - answer.id, - { - isApproved: true, - }, - { headers: headers } - ); + return this.http.put(BASE_URL + '/questions/' + answer.question.id + '/answers/' + answer.id, { isApproved: true }); } + deleteQuestion(id: any) { - const headers = getHeaders(); - return this.http.delete(this.baseURL + '/questions/' + id, { - headers: headers, - }); + return this.http.delete(BASE_URL + '/questions/' + id); } + deleteAnswer(answer: any) { - const headers = getHeaders(); - return this.http.delete( - this.baseURL + - '/questions/' + - answer.question.id + - '/answers/' + - answer.id, - { - headers: headers, - } - ); + return this.http.delete(BASE_URL + '/questions/' + answer.question.id + '/answers/' + answer.id); } + } From c1408f0ec872662bccbb1013cb704f0ba456afd7 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 00:13:36 +0530 Subject: [PATCH 353/464] Update chat.service.ts --- do_connect_frontend/src/app/service/chat.service.ts | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/do_connect_frontend/src/app/service/chat.service.ts b/do_connect_frontend/src/app/service/chat.service.ts index 9110f5f..0f881b1 100644 --- a/do_connect_frontend/src/app/service/chat.service.ts +++ b/do_connect_frontend/src/app/service/chat.service.ts @@ -1,7 +1,6 @@ import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { BASE_URL } from '../constants/constants'; -import { getHeaders } from '../utils/util'; @Injectable({ providedIn: 'root', @@ -14,12 +13,10 @@ export class ChatService { constructor(private http: HttpClient) {} createChat(data: any) { - const headers = getHeaders(); - return this.http.post(this.baseUrl + '/messages', data, { headers }); + return this.http.post(this.baseUrl + '/messages', data); } getChatMessagesList() { - const headers = getHeaders(); - return this.http.get(this.baseUrl + '/messages', { headers }); + return this.http.get(this.baseUrl + '/messages'); } } From 453e725428e6dbd788979e00a037d8fdf3aca699 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 00:13:38 +0530 Subject: [PATCH 354/464] Update search.service.ts --- do_connect_frontend/src/app/service/search.service.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/do_connect_frontend/src/app/service/search.service.ts b/do_connect_frontend/src/app/service/search.service.ts index 81de4a1..f13f817 100644 --- a/do_connect_frontend/src/app/service/search.service.ts +++ b/do_connect_frontend/src/app/service/search.service.ts @@ -1,18 +1,17 @@ import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { BASE_URL } from '../constants/constants'; -import { getHeaders } from '../utils/util'; @Injectable({ providedIn: 'root', }) + export class SearchService { searchActive = 'none'; - baseurl = BASE_URL + constructor(private http:HttpClient) {} onOpen(data:any) { - const headers = getHeaders(); - return this.http.get(this.baseurl+`/questions?search=${data}`, {headers}); + return this.http.get(`${BASE_URL}/questions?search=${data}`); } } From a0c30cd340be50e382dc83c8c0ab8251c1973d85 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 00:13:40 +0530 Subject: [PATCH 355/464] Update user.service.ts --- .../src/app/service/user.service.ts | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/do_connect_frontend/src/app/service/user.service.ts b/do_connect_frontend/src/app/service/user.service.ts index 75452db..2c5e1d7 100644 --- a/do_connect_frontend/src/app/service/user.service.ts +++ b/do_connect_frontend/src/app/service/user.service.ts @@ -2,7 +2,6 @@ import { HttpClient, HttpHeaders } from '@angular/common/http'; import { ConditionalExpr } from '@angular/compiler'; import { Injectable } from '@angular/core'; import { AnswerPostType, BASE_URL, QuestionPostType, UserLoginType, UserRegisterType } from '../constants/constants'; -import { getHeaders } from '../utils/util'; @Injectable({ providedIn: 'root', @@ -21,8 +20,7 @@ export class UserService { } getQuestion(id: number) { - const headers = getHeaders(); - return this.http.get(BASE_URL + '/questions/' + id, { headers }); + return this.http.get(BASE_URL + '/questions/' + id); } getApprovedQuestions() { @@ -30,27 +28,22 @@ export class UserService { } postQuestion(question: QuestionPostType) { - const headers = getHeaders(); - return this.http.post(BASE_URL + '/questions', question, { headers }); + return this.http.post(BASE_URL + '/questions', question); } postAnswer(questionId: number, answer: AnswerPostType) { - const headers = getHeaders(); - return this.http.post(BASE_URL + '/questions/' + questionId + '/answers', answer, { headers }); + return this.http.post(BASE_URL + '/questions/' + questionId + '/answers', answer); } searchQuestion(query: string) { - const headers = getHeaders(); - return this.http.get(BASE_URL + '/questions?search=' + query, { headers }); + return this.http.get(BASE_URL + '/questions?search=' + query); } getAnswers(quesId: number) { - const headers = getHeaders(); - return this.http.get(BASE_URL + '/questions/' + quesId + '/answers', { headers }); + return this.http.get(BASE_URL + '/questions/' + quesId + '/answers'); } logout() { - const headers = getHeaders(); - return this.http.get(BASE_URL + '/signout', { headers, responseType: 'text' }); + return this.http.get(BASE_URL + '/signout', { responseType: 'text' }); } } From b9051786871163b5918ea3dee636093bc26732b2 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 00:13:43 +0530 Subject: [PATCH 356/464] Create auth.interceptor.ts --- .../src/app/utils/auth.interceptor.ts | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 do_connect_frontend/src/app/utils/auth.interceptor.ts diff --git a/do_connect_frontend/src/app/utils/auth.interceptor.ts b/do_connect_frontend/src/app/utils/auth.interceptor.ts new file mode 100644 index 0000000..8e2ad55 --- /dev/null +++ b/do_connect_frontend/src/app/utils/auth.interceptor.ts @@ -0,0 +1,24 @@ +import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest, HTTP_INTERCEPTORS } from "@angular/common/http"; +import { Injectable } from "@angular/core"; +import { Observable } from "rxjs"; + +@Injectable() +export class AuthInterceptor implements HttpInterceptor { + + contructor() {} + + intercept(req: HttpRequest, next: HttpHandler): Observable> { + let authReq = req; + const token = localStorage.getItem('token'); + if (token) { + + authReq = req.clone({ headers: req.headers.set('Authorization', 'Bearer ' + token).set('Content-Type', 'application/json') }); + } + return next.handle(authReq); + } + +} + +export const authInterceptorProviders = [ + { provide: HTTP_INTERCEPTORS, useClass: AuthInterceptor, multi: true } +]; From 5302cbb83cf3aece8fc22e0229543887c555c477 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 00:13:45 +0530 Subject: [PATCH 357/464] Update util.ts --- do_connect_frontend/src/app/utils/util.ts | 9 --------- 1 file changed, 9 deletions(-) diff --git a/do_connect_frontend/src/app/utils/util.ts b/do_connect_frontend/src/app/utils/util.ts index 33831f6..ed97325 100644 --- a/do_connect_frontend/src/app/utils/util.ts +++ b/do_connect_frontend/src/app/utils/util.ts @@ -2,15 +2,6 @@ import { HttpHeaders } from '@angular/common/http'; import jwtDecode from 'jwt-decode'; import { JWTCustomPayload } from '../constants/constants'; -export const getHeaders = () => { - const token = localStorage.getItem('token'); - const headers = new HttpHeaders({ - 'Content-Type': 'application/json', - Authorization: `Bearer ${token}`, - }); - return headers; -}; - export const isUserLoggedIn = () => { const token = localStorage.getItem('token'); return (token !== null && token !== '' && token.split('.').length === 3); From 8f8c6370752c99358d3d00fb5a629e012a84b268 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 00:51:15 +0530 Subject: [PATCH 358/464] Update app.module.ts --- do_connect_frontend/src/app/app.module.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/do_connect_frontend/src/app/app.module.ts b/do_connect_frontend/src/app/app.module.ts index cabbfd7..96bf001 100644 --- a/do_connect_frontend/src/app/app.module.ts +++ b/do_connect_frontend/src/app/app.module.ts @@ -18,6 +18,7 @@ import { ChatComponent } from './chat/chat.component'; import { QuestionComponent } from './question/question.component'; import { ErrorComponent } from './error/error.component'; import { authInterceptorProviders } from './utils/auth.interceptor'; +import { SecurePipe } from './utils/secure.pipe'; @NgModule({ declarations: [ @@ -33,6 +34,7 @@ import { authInterceptorProviders } from './utils/auth.interceptor'; ChatComponent, QuestionComponent, ErrorComponent, + SecurePipe, ], imports: [ BrowserModule, From 2a1a5011acd50608cfa1578944087b4ff0cea92e Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 00:51:18 +0530 Subject: [PATCH 359/464] Update post-question.component.html --- .../src/app/post-question/post-question.component.html | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/do_connect_frontend/src/app/post-question/post-question.component.html b/do_connect_frontend/src/app/post-question/post-question.component.html index ce527c7..8687268 100644 --- a/do_connect_frontend/src/app/post-question/post-question.component.html +++ b/do_connect_frontend/src/app/post-question/post-question.component.html @@ -24,10 +24,8 @@
-
- - image - +
+ image
From d0cd59d8b60088914e18ed2a4a2d28591b3c0a7b Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 00:51:20 +0530 Subject: [PATCH 360/464] Update post-question.component.ts --- .../src/app/post-question/post-question.component.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/do_connect_frontend/src/app/post-question/post-question.component.ts b/do_connect_frontend/src/app/post-question/post-question.component.ts index 7275ec7..4ce27e3 100644 --- a/do_connect_frontend/src/app/post-question/post-question.component.ts +++ b/do_connect_frontend/src/app/post-question/post-question.component.ts @@ -1,5 +1,6 @@ import { Component, OnInit } from '@angular/core'; import { Router } from '@angular/router'; +import { BASE_URL } from '../constants/constants'; import { UploadImageService } from '../service/upload-image.service'; import { UserService } from '../service/user.service'; @@ -29,8 +30,7 @@ export class PostQuestionComponent implements OnInit { } getImageUrl(imageName: string) { - const imageUrl = 'http://localhost:4000/' + imageName; - return imageUrl; + return `${BASE_URL}/images/${imageName}`; } onUploadImage() { From 7d421688ee231ce5caf18b1d9313fa99078c43bf Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 00:51:22 +0530 Subject: [PATCH 361/464] Update upload-image.service.ts --- .../src/app/service/upload-image.service.ts | 20 ++++++------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/do_connect_frontend/src/app/service/upload-image.service.ts b/do_connect_frontend/src/app/service/upload-image.service.ts index e235a4f..a2cb0ab 100644 --- a/do_connect_frontend/src/app/service/upload-image.service.ts +++ b/do_connect_frontend/src/app/service/upload-image.service.ts @@ -1,6 +1,8 @@ import { HttpClient, HttpHeaders } from '@angular/common/http'; import { Injectable } from '@angular/core'; +import { DomSanitizer } from '@angular/platform-browser'; import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; import { BASE_URL } from '../constants/constants'; @Injectable({ @@ -9,22 +11,12 @@ import { BASE_URL } from '../constants/constants'; export class UploadImageService { - constructor(private http: HttpClient) {} + constructor(private http: HttpClient, private sanitizer: DomSanitizer) {} - uploadImage(file: any): Observable { + uploadImage(file: File): Observable { const formData = new FormData(); - formData.append('image', file, file.name); // Store form name as "file" with file data - const headers = new HttpHeaders({ - Authorization: `Bearer ${localStorage.getItem('token')}`, - }); - return this.http.post(`${BASE_URL}/images`, formData, { headers }); // Make http post request over api with formData as req - } - - getImage(imageName: string): Observable { - const headers = new HttpHeaders({ - Authorization: `Bearer ${localStorage.getItem('token')}`, - }); - return this.http.get(`${BASE_URL}/images/${imageName}`, { headers }); + formData.append('image', file); // Store form name as "file" with file data + return this.http.post(`${BASE_URL}/images`, formData); // Make http post request over api with formData as req } } From 0a75ac3dcc8313f11e517cbf59f41f7d2db59b2f Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 00:51:26 +0530 Subject: [PATCH 362/464] Update auth.interceptor.ts --- do_connect_frontend/src/app/utils/auth.interceptor.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/do_connect_frontend/src/app/utils/auth.interceptor.ts b/do_connect_frontend/src/app/utils/auth.interceptor.ts index 8e2ad55..3c8e1a9 100644 --- a/do_connect_frontend/src/app/utils/auth.interceptor.ts +++ b/do_connect_frontend/src/app/utils/auth.interceptor.ts @@ -11,8 +11,7 @@ export class AuthInterceptor implements HttpInterceptor { let authReq = req; const token = localStorage.getItem('token'); if (token) { - - authReq = req.clone({ headers: req.headers.set('Authorization', 'Bearer ' + token).set('Content-Type', 'application/json') }); + authReq = req.clone({ headers: req.headers.set('Authorization', 'Bearer ' + token) }); } return next.handle(authReq); } From b2ab5a119166d8f4e71d9a171db573159b1dcf6f Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 00:51:29 +0530 Subject: [PATCH 363/464] Create secure.pipe.ts --- .../src/app/utils/secure.pipe.ts | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 do_connect_frontend/src/app/utils/secure.pipe.ts diff --git a/do_connect_frontend/src/app/utils/secure.pipe.ts b/do_connect_frontend/src/app/utils/secure.pipe.ts new file mode 100644 index 0000000..b574b58 --- /dev/null +++ b/do_connect_frontend/src/app/utils/secure.pipe.ts @@ -0,0 +1,21 @@ +import { Pipe, PipeTransform } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { DomSanitizer, SafeUrl } from '@angular/platform-browser'; +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; + +@Pipe({ + name: 'secure' +}) + +export class SecurePipe implements PipeTransform { + + constructor(private http: HttpClient, private sanitizer: DomSanitizer) { } + + transform(url: string): Observable { + return this.http + .get(url, { responseType: 'blob' }) + .pipe(map((value: Blob | MediaSource) => this.sanitizer.bypassSecurityTrustUrl(URL.createObjectURL(value)))); + } + +} \ No newline at end of file From 4bcb12fc3be7c2f8f28516c85d5c57ade0db3c9e Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 01:31:56 +0530 Subject: [PATCH 364/464] Update post-question.component.ts --- .../post-question/post-question.component.ts | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/do_connect_frontend/src/app/post-question/post-question.component.ts b/do_connect_frontend/src/app/post-question/post-question.component.ts index 4ce27e3..4430395 100644 --- a/do_connect_frontend/src/app/post-question/post-question.component.ts +++ b/do_connect_frontend/src/app/post-question/post-question.component.ts @@ -1,6 +1,6 @@ import { Component, OnInit } from '@angular/core'; import { Router } from '@angular/router'; -import { BASE_URL } from '../constants/constants'; +import { BASE_URL, QUESTIONS_TOPICS } from '../constants/constants'; import { UploadImageService } from '../service/upload-image.service'; import { UserService } from '../service/user.service'; @@ -12,10 +12,10 @@ import { UserService } from '../service/user.service'; export class PostQuestionComponent implements OnInit { question = ''; - topic = 'java'; + topic = ''; + topicOptions: string[] = QUESTIONS_TOPICS; warning = ''; uploadedImages: string[] = []; - imageFile: File = new File(['init'], 'init.png'); constructor( private _uploadService: UploadImageService, @@ -26,23 +26,22 @@ export class PostQuestionComponent implements OnInit { ngOnInit(): void {} onChange(event: any) { - this.imageFile = event.target.files[0]; + const imageFile = event.target.files[0]; + if (imageFile) { + this._uploadService.uploadImage(imageFile).subscribe({ + next: (res) => console.warn(res), + error: (err) => { + if (err.status === 200) this.uploadedImages.push(err.error.text); + else this.router.navigate(['/error/' + err.status]); + }, + }); + } } getImageUrl(imageName: string) { return `${BASE_URL}/images/${imageName}`; } - onUploadImage() { - this._uploadService.uploadImage(this.imageFile).subscribe({ - next: (res) => console.warn(res), - error: (err) => { - if (err.status === 200) this.uploadedImages.push(err.error.text); - else this.router.navigate(['/error/' + err.status]); - }, - }); - } - onSubmit() { if (this.question === '') { this.warning = 'All fields are required!'; From 777ec2f77395cbaa6f4bb579180de3d02a7a170a Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 01:31:59 +0530 Subject: [PATCH 365/464] Update post-question.component.html --- .../post-question.component.html | 54 ++++++------------- 1 file changed, 17 insertions(+), 37 deletions(-) diff --git a/do_connect_frontend/src/app/post-question/post-question.component.html b/do_connect_frontend/src/app/post-question/post-question.component.html index 8687268..4b49272 100644 --- a/do_connect_frontend/src/app/post-question/post-question.component.html +++ b/do_connect_frontend/src/app/post-question/post-question.component.html @@ -1,50 +1,30 @@
-
-
-

Post Your Question

- -
- - -
-
- +
+
+

Ask Question

+
+
-
-
+
+ + +
+
+
+ +
+
+
image
-
- - - -
-

{{ warning }}

-
+
From aeee523a25d2c64acf19df56b553afa755fd7356 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 01:32:01 +0530 Subject: [PATCH 366/464] Update navbar.component.html --- do_connect_frontend/src/app/navbar/navbar.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/do_connect_frontend/src/app/navbar/navbar.component.html b/do_connect_frontend/src/app/navbar/navbar.component.html index 6340162..8a15197 100644 --- a/do_connect_frontend/src/app/navbar/navbar.component.html +++ b/do_connect_frontend/src/app/navbar/navbar.component.html @@ -17,7 +17,7 @@ Dashboard
-
+
- - + - - - - - - + + + +
Id Question Topic Posted By DateStatusActions
{{ question.id }}{{ question.question }}{{ question.topic }}{{ question.postedBy }}{{ question.postedAt }} + {{ question.question }}{{ question.topic }}{{ question.postedBy }}{{ question.postedAt | date: 'medium' }}
-
+
- - + - - - - - - + + + +
Id Question Answer Posted By DateStatusActions
{{ answer.id }}{{ answer.question.question }}{{ answer.answer }}{{ answer.postedBy }}{{ answer.postedAt }} + {{ answer.question.question }}{{ answer.answer }}{{ answer.postedBy }}{{ answer.postedAt }}
-
+
- @@ -94,13 +89,12 @@ - - - - - + + + From cb5076865eea966cf0f4beb98bd4a6af37a1b64e Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 11:15:34 +0530 Subject: [PATCH 372/464] Update dashboard.component.css --- do_connect_frontend/src/app/dashboard/dashboard.component.css | 3 +++ 1 file changed, 3 insertions(+) diff --git a/do_connect_frontend/src/app/dashboard/dashboard.component.css b/do_connect_frontend/src/app/dashboard/dashboard.component.css index 603142b..7afaabb 100644 --- a/do_connect_frontend/src/app/dashboard/dashboard.component.css +++ b/do_connect_frontend/src/app/dashboard/dashboard.component.css @@ -2,14 +2,17 @@ img { max-width: 50%; max-height: 100%; } + .product { border-radius: 5px; } + #remove-button { all: unset; cursor: pointer; font-size: 20px; } + #remove-button:hover { font-size: 25px; } From fd86dee5279df8a6ca54bd9c0db3a44da844e6e6 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 11:15:49 +0530 Subject: [PATCH 373/464] Update post-question.component.html --- .../post-question.component.html | 64 +++++++++++-------- 1 file changed, 37 insertions(+), 27 deletions(-) diff --git a/do_connect_frontend/src/app/post-question/post-question.component.html b/do_connect_frontend/src/app/post-question/post-question.component.html index 4b49272..7f4c33e 100644 --- a/do_connect_frontend/src/app/post-question/post-question.component.html +++ b/do_connect_frontend/src/app/post-question/post-question.component.html @@ -1,30 +1,40 @@ -
-
-
-

Ask Question

-
- - -
-
- - -
-
-
- -
-
-
- image +
+
+
+
+

Ask Question

+
+ + +
+ Topic is required. +
+
+
+ + +
+
+ Question is required. +
+
+ + + Only '.png' and '.jpeg' are supported +
+
+
+ image +
+
+
+
-
- -

{{ warning }}

-
+
-
-
+ \ No newline at end of file From 43457b3ba5cfb2a17073fb12438627b6d5eee7cb Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 11:16:38 +0530 Subject: [PATCH 374/464] Update dashboard.component.html --- do_connect_frontend/src/app/dashboard/dashboard.component.html | 2 ++ 1 file changed, 2 insertions(+) diff --git a/do_connect_frontend/src/app/dashboard/dashboard.component.html b/do_connect_frontend/src/app/dashboard/dashboard.component.html index 42c4264..8d20d0d 100644 --- a/do_connect_frontend/src/app/dashboard/dashboard.component.html +++ b/do_connect_frontend/src/app/dashboard/dashboard.component.html @@ -82,6 +82,7 @@
Id Name Email Role
{{ user.id }}{{ user.name }}{{ user.email }}{{ user.isAdmin === true ? "Admin" : "User" }} + {{ user.name }}{{ user.email }}{{ user.isAdmin === true ? "Admin" : "User" }}
+ @@ -89,6 +90,7 @@ + From 1d58401379a615fb62c50fac22f6cd7b902e261b Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 12:28:56 +0530 Subject: [PATCH 375/464] Update QuestionController.java --- .../wipro/cp/doconnect/controller/QuestionController.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/QuestionController.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/QuestionController.java index 47268f4..063a063 100644 --- a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/QuestionController.java +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/controller/QuestionController.java @@ -41,7 +41,7 @@ public class QuestionController { private Utilities utilities; @GetMapping("/questions") - public ResponseEntity getAllQuestions(@RequestParam(name="status") Optional optionalStatus, @RequestParam(name="search") Optional optionalSearch) { + public ResponseEntity getAllQuestions(@RequestParam(name="status") Optional optionalStatus, @RequestParam(name="search") Optional optionalSearch, @RequestParam(name="topic") Optional optionalTopic) { String status = "approved"; if (optionalStatus.isPresent()) { status = optionalStatus.get(); @@ -50,7 +50,11 @@ public ResponseEntity getAllQuestions(@RequestParam(name="status") Optional> questionStatus = questionServiceImp.getAllQuestions(status, search); + String topic = null; + if (optionalTopic.isPresent()) { + topic = optionalTopic.get(); + } + StatusDTO> questionStatus = questionServiceImp.getAllQuestions(status, search, topic); if (!questionStatus.getIsValid()) { return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(questionStatus.getStatusMessage()); } From c09a7a918f8f8bcef2796282d8c7311194272c44 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 12:28:59 +0530 Subject: [PATCH 376/464] Update AuthorizationInterceptor.java --- .../cp/doconnect/interceptor/AuthorizationInterceptor.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/interceptor/AuthorizationInterceptor.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/interceptor/AuthorizationInterceptor.java index c3cf381..0b5d713 100644 --- a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/interceptor/AuthorizationInterceptor.java +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/interceptor/AuthorizationInterceptor.java @@ -41,7 +41,7 @@ public boolean preHandle(HttpServletRequest request, HttpServletResponse respons final String currentURI = request.getRequestURI().toString(); final Map parameterMap = request.getParameterMap(); if (currentURI.equalsIgnoreCase("/api/v1/questions") && HttpMethod.GET.matches(currentMethod)) { - if (!parameterMap.containsKey("status") && !parameterMap.containsKey("search")) { + if (!parameterMap.containsKey("status") && !parameterMap.containsKey("search") && !parameterMap.containsKey("topic")) { return true; } } @@ -111,7 +111,8 @@ else if (currentURI.toLowerCase().startsWith("/api/v1/questions")) { else if (HttpMethod.GET.matches(currentMethod)) { String statusValue = getParameterValue(parameterMap, "status"); String searchValue = getParameterValue(parameterMap, "search"); - if (searchValue == null && statusValue != null) { + String topicValue = getParameterValue(parameterMap, "topic"); + if (topicValue == null && searchValue == null && statusValue != null) { if (statusValue.equalsIgnoreCase("approved")) { return true; } @@ -123,7 +124,7 @@ else if ((statusValue.equalsIgnoreCase("unapproved") || statusValue.equalsIgnore return false; } } - else if (searchValue != null && statusValue == null) { + else if ((topicValue != null || searchValue != null) && statusValue == null) { if (!isUserAdmin) { return true; } From abe9250db6e5fd2bb87352eb09347251a81619a3 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 12:29:02 +0530 Subject: [PATCH 377/464] Update QuestionRepository.java --- .../com/wipro/cp/doconnect/repository/QuestionRepository.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/QuestionRepository.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/QuestionRepository.java index 2d04f52..df8968a 100644 --- a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/QuestionRepository.java +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/repository/QuestionRepository.java @@ -16,4 +16,6 @@ public interface QuestionRepository extends JpaRepository { List findByIsApprovedFalse(); List findByQuestionContainingIgnoreCaseAndIsApprovedTrue(String question); + List findByTopicContainingIgnoreCaseAndIsApprovedTrue(String topic); + List findByTopicContainingIgnoreCaseAndQuestionContainingIgnoreCaseAndIsApprovedTrue(String topic, String question); } From fae471dceffeb42acf02ac0768fa2e2656748882 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 12:29:05 +0530 Subject: [PATCH 378/464] Update IQuestionService.java --- .../java/com/wipro/cp/doconnect/service/IQuestionService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IQuestionService.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IQuestionService.java index 2fe23bf..45e14bd 100644 --- a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IQuestionService.java +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IQuestionService.java @@ -9,7 +9,7 @@ public interface IQuestionService { - public StatusDTO> getAllQuestions(String status, String search); + public StatusDTO> getAllQuestions(String status, String search, String topic); public StatusDTO getQuestionById(Long questionId); public StatusDTO createQuestion(QuestionRequestDTO questionRequestDTO, String postedBy); public StatusDTO updateQuestion(QuestionUpdateDTO questionUpdateDTO, Long questionId, String approvedBy); From d6375917664e0d5a4c4458deac03313e3527e708 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 12:29:08 +0530 Subject: [PATCH 379/464] Update QuestionServiceImp.java --- .../doconnect/service/QuestionServiceImp.java | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/QuestionServiceImp.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/QuestionServiceImp.java index 5de0b04..101f876 100644 --- a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/QuestionServiceImp.java +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/QuestionServiceImp.java @@ -36,8 +36,8 @@ public class QuestionServiceImp implements IQuestionService { private Utilities utilities; @Override - public StatusDTO> getAllQuestions(String status, String search) { - if (search == null) { + public StatusDTO> getAllQuestions(String status, String search, String topic) { + if (search == null && topic == null) { if (status.equalsIgnoreCase("all")) { return new StatusDTO>("", true, utilities.convertQuestionListToQuestionResponseDTOList(questionRepository.findAll())); } @@ -51,7 +51,7 @@ else if (status.equalsIgnoreCase("unapproved")) { return new StatusDTO>("Provided invalid status. Should be one of 'all', 'approved' or 'unapproved'.", false, null); } } - else { + else if (search != null && topic == null) { if (status.equalsIgnoreCase("approved")) { return new StatusDTO>("", true, utilities.convertQuestionListToQuestionResponseDTOList(questionRepository.findByQuestionContainingIgnoreCaseAndIsApprovedTrue(search))); } @@ -59,6 +59,22 @@ else if (status.equalsIgnoreCase("unapproved")) { return new StatusDTO>("Question search only works with 'approved' status.", false, null); } } + else if (search == null && topic != null) { + if (status.equalsIgnoreCase("approved")) { + return new StatusDTO>("", true, utilities.convertQuestionListToQuestionResponseDTOList(questionRepository.findByTopicContainingIgnoreCaseAndIsApprovedTrue(topic))); + } + else { + return new StatusDTO>("Question search only works with 'approved' status.", false, null); + } + } + else { + if (status.equalsIgnoreCase("approved")) { + return new StatusDTO>("", true, utilities.convertQuestionListToQuestionResponseDTOList(questionRepository.findByTopicContainingIgnoreCaseAndQuestionContainingIgnoreCaseAndIsApprovedTrue(topic, search))); + } + else { + return new StatusDTO>("Question search only works with 'approved' status.", false, null); + } + } } @Override From a469cea0fd0e574988feb3d7af60f54b32363a44 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 12:29:11 +0530 Subject: [PATCH 380/464] Update login.component.html --- do_connect_frontend/src/app/login/login.component.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/do_connect_frontend/src/app/login/login.component.html b/do_connect_frontend/src/app/login/login.component.html index 70cbbde..028dd9a 100644 --- a/do_connect_frontend/src/app/login/login.component.html +++ b/do_connect_frontend/src/app/login/login.component.html @@ -4,7 +4,7 @@

Login

- +
@@ -12,7 +12,7 @@
- +
From 42eea54c9ca42b509fed0593666760eb5f4da49a Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 12:29:14 +0530 Subject: [PATCH 381/464] Update post-question.component.html --- .../src/app/post-question/post-question.component.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/do_connect_frontend/src/app/post-question/post-question.component.html b/do_connect_frontend/src/app/post-question/post-question.component.html index 7f4c33e..3bfdbaa 100644 --- a/do_connect_frontend/src/app/post-question/post-question.component.html +++ b/do_connect_frontend/src/app/post-question/post-question.component.html @@ -4,7 +4,7 @@

Ask Question

- + @@ -14,7 +14,7 @@
- +
Date: Mon, 29 Aug 2022 12:29:17 +0530 Subject: [PATCH 382/464] Update register.component.html --- .../src/app/register/register.component.html | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/do_connect_frontend/src/app/register/register.component.html b/do_connect_frontend/src/app/register/register.component.html index e64a489..86cbb5d 100644 --- a/do_connect_frontend/src/app/register/register.component.html +++ b/do_connect_frontend/src/app/register/register.component.html @@ -4,7 +4,7 @@

Register

- +
@@ -12,7 +12,7 @@
- +
@@ -20,7 +20,7 @@
- +
@@ -32,7 +32,7 @@
- +
@@ -44,7 +44,7 @@
- + +
+

All Questions

+
+
-
-
+
+
-

{{ question.question }}

-
+

{{ question.question }}

+
From 47bcdd11bf593aeabd09c6e90fcec69592f35867 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 13:12:17 +0530 Subject: [PATCH 384/464] Update home.component.ts --- .../src/app/home/home.component.ts | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/do_connect_frontend/src/app/home/home.component.ts b/do_connect_frontend/src/app/home/home.component.ts index 1f3af06..0f11509 100644 --- a/do_connect_frontend/src/app/home/home.component.ts +++ b/do_connect_frontend/src/app/home/home.component.ts @@ -1,6 +1,7 @@ -import { HttpClient } from '@angular/common/http'; +import { HttpClient, HttpErrorResponse } from '@angular/common/http'; import { Component, OnInit } from '@angular/core'; import { Router } from '@angular/router'; +import { QuestionType } from '../constants/constants'; import { UserService } from '../service/user.service'; import { isUserAdmin, isUserLoggedIn } from '../utils/util'; @@ -13,8 +14,9 @@ const OPEN_CHAT_BUTTON_LABEL = 'Chat'; }) export class HomeComponent implements OnInit { - data: any; - search: any; + + questionList: QuestionType[] = []; + search: string = ''; chatbox = 'none'; isAdmin: boolean = isUserAdmin(); isUserLoggedIn: boolean = isUserLoggedIn(); @@ -24,24 +26,29 @@ export class HomeComponent implements OnInit { ngOnInit(): void { this._userService.getApprovedQuestions().subscribe({ - next: (res) => (this.data = res), - error: (err) => this.router.navigate(['/error/' + err.status]), + next: (result) => (this.questionList = result as QuestionType[]), + error: (error: HttpErrorResponse) => { + if (error.status === 400) { + alert(error.error); + } + else { + this.router.navigate(['/error/' + error.status]); + } + }, }); } toggleChatBox() { this.chatbox = this.chatbox === 'block' ? 'none' : 'block'; - var elem: any = document.getElementById('msgbox'); - elem.scrollTop = elem.scrollHeight; } - openQuestion(id: any) { + openQuestion(id: number) { this.router.navigate([`/question/${id}`]); } onSearch() { this._userService.searchQuestion(this.search).subscribe({ - next: (res) => (this.data = res), + next: (result) => (this.questionList = result as QuestionType[]), error: (err) => this.router.navigate(['/error/' + err.status]), }); } From 1ef72fadb4302c8239280e7e148a3368731373b3 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 13:12:20 +0530 Subject: [PATCH 385/464] Update home.component.html --- do_connect_frontend/src/app/home/home.component.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/do_connect_frontend/src/app/home/home.component.html b/do_connect_frontend/src/app/home/home.component.html index 3d05511..d01e0cc 100644 --- a/do_connect_frontend/src/app/home/home.component.html +++ b/do_connect_frontend/src/app/home/home.component.html @@ -1,14 +1,14 @@

All Questions

-
+
-
-
-
+
+
+

{{ question.question }}

+
+
+ Hello +
+
+ + +
From 614a9073436eb5f25254bea1fdc983c542ca99eb Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 15:39:27 +0530 Subject: [PATCH 392/464] Update navbar.component.html --- do_connect_frontend/src/app/navbar/navbar.component.html | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/do_connect_frontend/src/app/navbar/navbar.component.html b/do_connect_frontend/src/app/navbar/navbar.component.html index 1f23e69..eefee85 100644 --- a/do_connect_frontend/src/app/navbar/navbar.component.html +++ b/do_connect_frontend/src/app/navbar/navbar.component.html @@ -1,5 +1,5 @@
+
+ + +

{{ question.question }}

-
- +
+
+ Topic + {{ question.topic }} +
+
+ Posted By + {{ question.postedBy }} +
+
+ Posted At + {{ question.postedAt | date:'medium' }} +
+
+ +
From 3dcbe8718b4eb181673125ff2b1d70f89d0d9406 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 16:35:10 +0530 Subject: [PATCH 398/464] Update Question.java --- .../main/java/com/wipro/cp/doconnect/entity/Question.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Question.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Question.java index c325979..fbf41a3 100644 --- a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Question.java +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/Question.java @@ -1,3 +1,9 @@ +/* + * @Author: Devashish Ashok Pathrabe + * Modified Date: 23-08-2022 + * Description: Question Entity + */ + package com.wipro.cp.doconnect.entity; import java.util.Date; From fe10872d8e26579b17ef181845831e92a91ef179 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 16:35:13 +0530 Subject: [PATCH 399/464] Update User.java --- .../src/main/java/com/wipro/cp/doconnect/entity/User.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/User.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/User.java index 236c6c1..7c27f2a 100644 --- a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/User.java +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/entity/User.java @@ -1,3 +1,9 @@ +/* + * @Author: Devashish Ashok Pathrabe + * Modified Date: 23-08-2022 + * Description: User Entity + */ + package com.wipro.cp.doconnect.entity; import javax.persistence.Column; From 5d002278733c9ad8d40c3a0d8677114dadb538a0 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 16:35:16 +0530 Subject: [PATCH 400/464] Update ListToStringConverter.java --- .../com/wipro/cp/doconnect/util/ListToStringConverter.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/util/ListToStringConverter.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/util/ListToStringConverter.java index 88227b7..d16515f 100644 --- a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/util/ListToStringConverter.java +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/util/ListToStringConverter.java @@ -1,3 +1,9 @@ +/* + * @Author: Devashish Ashok Pathrabe + * Modified Date: 25-08-2022 + * Description: List to String Converter + */ + package com.wipro.cp.doconnect.util; import java.util.Arrays; From 0fe60178d2ae05cd99a10965d4ba3de86afca4b7 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 16:35:27 +0530 Subject: [PATCH 401/464] Update Utilities.java --- .../main/java/com/wipro/cp/doconnect/util/Utilities.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/util/Utilities.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/util/Utilities.java index c01f583..07ec57d 100644 --- a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/util/Utilities.java +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/util/Utilities.java @@ -1,3 +1,9 @@ +/* + * @Author: Devashish Ashok Pathrabe + * Modified Date: 26-08-2022 + * Description: Utilities file + */ + package com.wipro.cp.doconnect.util; import java.util.List; From 168560c7a5e613dc9288979a255c1410bcc6561b Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 16:35:31 +0530 Subject: [PATCH 402/464] Update post-question.component.ts --- .../src/app/post-question/post-question.component.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/do_connect_frontend/src/app/post-question/post-question.component.ts b/do_connect_frontend/src/app/post-question/post-question.component.ts index 1598a58..a252001 100644 --- a/do_connect_frontend/src/app/post-question/post-question.component.ts +++ b/do_connect_frontend/src/app/post-question/post-question.component.ts @@ -32,6 +32,7 @@ export class PostQuestionComponent implements OnInit { if (imageFile) { this._uploadService.uploadImage(imageFile).subscribe({ next: (result) => { + console.log('***', result); this.uploadedImages.push(result); }, error: (error: HttpErrorResponse) => { @@ -55,7 +56,7 @@ export class PostQuestionComponent implements OnInit { .postQuestion({ question: this.questionForm.value.question, topic: this.questionForm.value.topic, - images: this.questionForm.value.uploadedImages, + images: this.uploadedImages, }) .subscribe({ next: (result) => { From 2b5f2eeef595ad489a9aaa6fe36349f1d5499431 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 17:42:01 +0530 Subject: [PATCH 403/464] Update constants.ts --- do_connect_frontend/src/app/constants/constants.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/do_connect_frontend/src/app/constants/constants.ts b/do_connect_frontend/src/app/constants/constants.ts index ce86d8e..f5d8c0e 100644 --- a/do_connect_frontend/src/app/constants/constants.ts +++ b/do_connect_frontend/src/app/constants/constants.ts @@ -40,6 +40,15 @@ export interface AnswerPostType { images: string[]; } +export interface AnswerType extends AnswerPostType { + id: number; + postedBy: string; + postedAt: Date; + approvedBy: string; + isApproved: boolean; + question: QuestionType; +} + export const QUESTIONS_TOPICS = [ 'Actors', 'Algebra', From e1ac7e22166760ab4075bff18b5ec1e9a0b4fc11 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 17:42:03 +0530 Subject: [PATCH 404/464] Update dashboard.component.html --- .../src/app/dashboard/dashboard.component.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/do_connect_frontend/src/app/dashboard/dashboard.component.html b/do_connect_frontend/src/app/dashboard/dashboard.component.html index 8d20d0d..595de5e 100644 --- a/do_connect_frontend/src/app/dashboard/dashboard.component.html +++ b/do_connect_frontend/src/app/dashboard/dashboard.component.html @@ -19,7 +19,7 @@
- + @@ -52,15 +52,15 @@ - + - + - +
Username Name Email Role
{{ user.username }} {{ user.name }} {{ user.email }} {{ user.isAdmin === true ? "Admin" : "User" }}Question Topic Posted ByDatePosted At Actions
Question Answer Posted ByDatePosted At Actions
{{ answer.question.question }}{{ answer.question?.question }} {{ answer.answer }} {{ answer.postedBy }}{{ answer.postedAt }}{{ answer.postedAt | date:'medium' }} +
+ + + Only '.png' and '.jpeg' are supported
-
- +
+
+ image +
-
+
+ +
+ -
-

Answers

-
-
-
{{ answer.answer }}
-
-
- - image - +
+

Other Answers

+
+
+
+ {{ answerData.answer }} +
+ Posted By + {{ answerData.postedBy }} +
+
+ Posted At + {{ answerData.postedAt | date:'medium' }} +
+
+ Approved By + {{ answerData.approvedBy }} +
+
+
+ image +
-

Posted By: {{ answer.postedBy }}

From 81f74df0f2cc9ced5967e727bbb49bec96dd79b0 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 17:42:13 +0530 Subject: [PATCH 408/464] Update question.component.ts --- .../src/app/question/question.component.ts | 97 ++++++++++--------- 1 file changed, 50 insertions(+), 47 deletions(-) diff --git a/do_connect_frontend/src/app/question/question.component.ts b/do_connect_frontend/src/app/question/question.component.ts index 61ee8da..a664851 100644 --- a/do_connect_frontend/src/app/question/question.component.ts +++ b/do_connect_frontend/src/app/question/question.component.ts @@ -1,5 +1,8 @@ +import { HttpErrorResponse } from '@angular/common/http'; import { Component, OnInit } from '@angular/core'; +import { FormControl, FormGroup, Validators } from '@angular/forms'; import { ActivatedRoute, Route, Router } from '@angular/router'; +import { AnswerType, BASE_URL, QuestionType } from '../constants/constants'; import { UploadImageService } from '../service/upload-image.service'; import { UserService } from '../service/user.service'; @@ -9,76 +12,76 @@ import { UserService } from '../service/user.service'; styleUrls: ['./question.component.css'], }) export class QuestionComponent implements OnInit { - data: any; - answer = ''; - answersList: any; - questionId: any; - warning = ''; + public answerForm !: FormGroup; + questionData: QuestionType | undefined = undefined; + answersList: AnswerType[] = []; + questionId: number | undefined; uploadedImages: string[] = []; - file: File = new File(['init'], 'init.txt'); - constructor( - private _userService: UserService, - private activatedRoute: ActivatedRoute, - private router: Router, - private _uploadService: UploadImageService - ) {} + constructor(private _userService: UserService, private activatedRoute: ActivatedRoute, private router: Router, private _uploadService: UploadImageService) {} ngOnInit(): void { + this.answerForm = new FormGroup({ + answer: new FormControl('', [Validators.required]), + images: new FormControl('') + }) this.getData(); } getData() { let urlParams = this.activatedRoute.snapshot.params; this.questionId = urlParams['id']; - console.log(this.questionId); - this.data = this._userService.getQuestion(this.questionId).subscribe({ - next: (res) => (this.data = res), - error: (err) => this.router.navigate(['/error/' + err.status]), - }); - - this._userService.getAnswers(this.questionId).subscribe({ - next: (res) => (this.answersList = res), - error: (err) => this.router.navigate(['/error/' + err.status]), - }); + if (this.questionId) { + this._userService.getQuestion(this.questionId).subscribe({ + next: (result) => (this.questionData = result as QuestionType), + error: (err) => this.router.navigate(['/error/' + err.status]), + }); + this._userService.getAnswers(this.questionId).subscribe({ + next: (result) => (this.answersList = result as AnswerType[]), + error: (err) => this.router.navigate(['/error/' + err.status]), + }); + } } onChange(event: any) { - this.file = event.target.files[0]; - } - getImageUrl(image: any) { - const imageUrl = 'http://localhost:4000/' + image; - return imageUrl; + const imageFile = event.target.files[0]; + if (imageFile) { + this._uploadService.uploadImage(imageFile).subscribe({ + next: (result) => { + this.uploadedImages.push(result); + }, + error: (error: HttpErrorResponse) => { + if (error.status === 400) { + alert(error.error); + } + else { + this.router.navigate(['/error/' + error.status]); + } + }, + }); + } } - onUploadImage() { - this._uploadService.uploadImage(this.file).subscribe({ - next: (res) => console.warn(res), - error: (err) => { - if (err.status === 200) this.uploadedImages.push(err.error.text); - else this.router.navigate(['/error/' + err.status]); - }, - }); + + getImageUrl(imageName: string) { + return `${BASE_URL}/images/${imageName}`; } - onSubmit() { - if (this.answer === '') { - this.warning = 'All fields are required!'; - return; - } - this._userService + submit() { + if (this.questionId) { + this._userService .postAnswer(this.questionId, { - answer: this.answer, + answer: this.answerForm.value.answer, images: this.uploadedImages, }) .subscribe({ - next: (res) => { - alert('Successfully Submitted'); + next: (result) => { + alert('Your answer submission was successful.'); this.router.navigate(['/']); }, - error: (err) => { - console.log(err); - this.router.navigate(['/error/' + err.status]); + error: (error) => { + this.router.navigate(['/error/' + error.status]); }, }); + } } } From a1b33b3f3bb687c5264f94b71eb30f8a2eb01592 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 18:39:30 +0530 Subject: [PATCH 409/464] Update constants.ts --- do_connect_frontend/src/app/constants/constants.ts | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/do_connect_frontend/src/app/constants/constants.ts b/do_connect_frontend/src/app/constants/constants.ts index f5d8c0e..1b29e4d 100644 --- a/do_connect_frontend/src/app/constants/constants.ts +++ b/do_connect_frontend/src/app/constants/constants.ts @@ -8,17 +8,18 @@ export interface JWTCustomPayload extends JwtPayload { name: string; } -export interface UserRegisterType { +export interface UserLoginType { username: string; + password: string; +} +export interface UserRegisterType extends UserLoginType { name: string; email: string; - password: string; isAdmin: boolean; } -export interface UserLoginType { - username: string; - password: string; +export interface UserType extends Omit { + id: number; } export interface QuestionPostType { From 1e72fceec38719a72b126bca937b1ff0d11828cb Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 18:39:35 +0530 Subject: [PATCH 410/464] Update dashboard.component.html --- .../app/dashboard/dashboard.component.html | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/do_connect_frontend/src/app/dashboard/dashboard.component.html b/do_connect_frontend/src/app/dashboard/dashboard.component.html index 595de5e..c24d559 100644 --- a/do_connect_frontend/src/app/dashboard/dashboard.component.html +++ b/do_connect_frontend/src/app/dashboard/dashboard.component.html @@ -1,19 +1,19 @@
- - -
-
-
+
+
@@ -23,8 +23,8 @@ - - + + @@ -46,7 +46,7 @@
QuestionActions
{{ question.question }}
{{ question.question }} {{ question.topic }} {{ question.postedBy }} {{ question.postedAt | date: 'medium' }}
-
+
@@ -56,9 +56,9 @@ - - - + + +
QuestionActions
{{ answer.question?.question }}{{ answer.answer }}
{{ answer.question?.question }}{{ answer.answer }} {{ answer.postedBy }} {{ answer.postedAt | date:'medium' }} @@ -79,7 +79,7 @@
-
+
@@ -89,7 +89,7 @@ - + From 4b47c9f42585ae0be4d3f9a1bf74efd093d8776d Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 18:39:43 +0530 Subject: [PATCH 411/464] Update dashboard.component.ts --- .../src/app/dashboard/dashboard.component.ts | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/do_connect_frontend/src/app/dashboard/dashboard.component.ts b/do_connect_frontend/src/app/dashboard/dashboard.component.ts index c54939f..bc54039 100644 --- a/do_connect_frontend/src/app/dashboard/dashboard.component.ts +++ b/do_connect_frontend/src/app/dashboard/dashboard.component.ts @@ -1,7 +1,7 @@ import { Component, OnInit } from '@angular/core'; import { Router } from '@angular/router'; +import { AnswerType, QuestionType, UserType } from '../constants/constants'; import { AdminService } from '../service/admin.service'; -import { UserService } from '../service/user.service'; @Component({ selector: 'app-dashboard', @@ -10,13 +10,13 @@ import { UserService } from '../service/user.service'; }) export class DashboardComponent implements OnInit { + mode = 'questions'; - data: any; - constructor( - private _userService: UserService, - private _adminService: AdminService, - private router: Router - ) {} + questionList: QuestionType[] = []; + answerList: AnswerType[] = []; + userList: UserType[] = []; + + constructor(private _adminService: AdminService, private router: Router) {} ngOnInit(): void { this.getUnapprovedQuestions(); @@ -25,7 +25,7 @@ export class DashboardComponent implements OnInit { getUnapprovedQuestions() { this.mode = 'questions'; this._adminService.getUnapprovedQuestions().subscribe({ - next: (res) => (this.data = res), + next: (result) => (this.questionList = result as QuestionType[]), error: (err) => this.router.navigate(['/error/' + err.status]), }); } @@ -33,7 +33,7 @@ export class DashboardComponent implements OnInit { getUnapprovedAnswers() { this.mode = 'answers'; this._adminService.getUnapprovedAnswers().subscribe({ - next: (res) => (this.data = res), + next: (result) => (this.answerList = result as AnswerType[]), error: (err) => this.router.navigate(['/error/' + err.status]), }); } @@ -41,12 +41,12 @@ export class DashboardComponent implements OnInit { getUsers() { this.mode = 'users'; this._adminService.getUsers().subscribe({ - next: (res) => (this.data = res), + next: (result) => (this.userList = result as UserType[]), error: (err) => this.router.navigate(['/error/' + err.status]), }); } - onDelete(id: any) { + onDelete(id: number) { if (confirm('Are you sure you want to remove this user? This action cannot be reverted.')) { this._adminService.deleteUser(id).subscribe({ next: (res) => this.getUsers(), From cfeecd6bc0927960e74d27cb3fa72edea3fb3f37 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 18:39:46 +0530 Subject: [PATCH 412/464] Update home.component.html --- do_connect_frontend/src/app/home/home.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/do_connect_frontend/src/app/home/home.component.html b/do_connect_frontend/src/app/home/home.component.html index 0a03d24..05ef64b 100644 --- a/do_connect_frontend/src/app/home/home.component.html +++ b/do_connect_frontend/src/app/home/home.component.html @@ -5,7 +5,7 @@

All Questions

- From 2ac852824f32d8de7242ee31d9f4393055e0cd17 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 18:39:49 +0530 Subject: [PATCH 413/464] Update question.component.ts --- do_connect_frontend/src/app/question/question.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/do_connect_frontend/src/app/question/question.component.ts b/do_connect_frontend/src/app/question/question.component.ts index a664851..560e13d 100644 --- a/do_connect_frontend/src/app/question/question.component.ts +++ b/do_connect_frontend/src/app/question/question.component.ts @@ -29,7 +29,7 @@ export class QuestionComponent implements OnInit { } getData() { - let urlParams = this.activatedRoute.snapshot.params; + const urlParams = this.activatedRoute.snapshot.params; this.questionId = urlParams['id']; if (this.questionId) { this._userService.getQuestion(this.questionId).subscribe({ From 2a556914de3a9145da4476be8aca4ae476b97231 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 18:39:53 +0530 Subject: [PATCH 414/464] Update admin.service.ts --- do_connect_frontend/src/app/service/admin.service.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/do_connect_frontend/src/app/service/admin.service.ts b/do_connect_frontend/src/app/service/admin.service.ts index 6aa8205..696399c 100644 --- a/do_connect_frontend/src/app/service/admin.service.ts +++ b/do_connect_frontend/src/app/service/admin.service.ts @@ -1,6 +1,6 @@ import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; -import { BASE_URL } from '../constants/constants'; +import { AnswerType, BASE_URL } from '../constants/constants'; @Injectable({ providedIn: 'root', @@ -22,23 +22,23 @@ export class AdminService { return this.http.get(BASE_URL + '/users'); } - deleteUser(id: any) { + deleteUser(id: number) { return this.http.delete(BASE_URL + '/users/' + id); } - approveQuestion(id: any) { + approveQuestion(id: number) { return this.http.put(BASE_URL + '/questions/' + id, { isApproved: true }); } - approveAnswer(answer: any) { + approveAnswer(answer: AnswerType) { return this.http.put(BASE_URL + '/questions/' + answer.question.id + '/answers/' + answer.id, { isApproved: true }); } - deleteQuestion(id: any) { + deleteQuestion(id: number) { return this.http.delete(BASE_URL + '/questions/' + id); } - deleteAnswer(answer: any) { + deleteAnswer(answer: AnswerType) { return this.http.delete(BASE_URL + '/questions/' + answer.question.id + '/answers/' + answer.id); } From 4d5989eceef0f1b9118236efe38aaada6077d923 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 18:43:14 +0530 Subject: [PATCH 415/464] Update dashboard.component.html --- .../src/app/dashboard/dashboard.component.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/do_connect_frontend/src/app/dashboard/dashboard.component.html b/do_connect_frontend/src/app/dashboard/dashboard.component.html index c24d559..9fdef6e 100644 --- a/do_connect_frontend/src/app/dashboard/dashboard.component.html +++ b/do_connect_frontend/src/app/dashboard/dashboard.component.html @@ -37,7 +37,7 @@ @@ -70,7 +70,7 @@ From b2d856484c80090035edd85e6485363fa11457f6 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 18:43:17 +0530 Subject: [PATCH 416/464] Update dashboard.component.ts --- .../src/app/dashboard/dashboard.component.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/do_connect_frontend/src/app/dashboard/dashboard.component.ts b/do_connect_frontend/src/app/dashboard/dashboard.component.ts index bc54039..842d2ee 100644 --- a/do_connect_frontend/src/app/dashboard/dashboard.component.ts +++ b/do_connect_frontend/src/app/dashboard/dashboard.component.ts @@ -65,7 +65,7 @@ export class DashboardComponent implements OnInit { }); } - onRejectQuestion(id: number) { + onDeleteQuestion(id: number) { if (confirm('Are you sure? This action cannot be reverted.')) { this._adminService.deleteQuestion(id).subscribe({ next: (res) => this.getUnapprovedQuestions(), @@ -77,7 +77,7 @@ export class DashboardComponent implements OnInit { } } - onApproveAnswer(answer: any) { + onApproveAnswer(answer: AnswerType) { this._adminService.approveAnswer(answer).subscribe({ next: (res) => this.getUnapprovedAnswers(), error: (err) => { @@ -87,7 +87,7 @@ export class DashboardComponent implements OnInit { }); } - onRejectAnswer(answer: any) { + onDeleteAnswer(answer: AnswerType) { if (confirm('Are you sure? This action cannot be reverted.')) { this._adminService.deleteAnswer(answer).subscribe({ next: (res) => this.getUnapprovedAnswers(), From d944a66a47545a4887e8dd32a933cfb54f4fc801 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 19:16:41 +0530 Subject: [PATCH 417/464] Create auth.guard.ts --- .../src/app/utils/auth.guard.ts | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 do_connect_frontend/src/app/utils/auth.guard.ts diff --git a/do_connect_frontend/src/app/utils/auth.guard.ts b/do_connect_frontend/src/app/utils/auth.guard.ts new file mode 100644 index 0000000..47319e5 --- /dev/null +++ b/do_connect_frontend/src/app/utils/auth.guard.ts @@ -0,0 +1,68 @@ +import { Injectable } from '@angular/core'; +import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot, UrlTree } from '@angular/router'; +import { Observable } from 'rxjs'; +import { isUserAdmin, isUserLoggedIn } from './util'; + +function getResolvedUrl(route: ActivatedRouteSnapshot): string { + return route.pathFromRoot + .map(v => v.url.map(segment => segment.toString()).join('/')) + .join('/'); +} + +@Injectable({ + providedIn: 'root' +}) +export class AuthGuard implements CanActivate { + + isUserLoggedIn = isUserLoggedIn(); + isUserAdmin = isUserAdmin(); + + constructor(public router: Router) { } + + canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable | Promise | boolean | UrlTree { + const url = getResolvedUrl(route); + console.log({url}); + if (this.isUserLoggedIn) { + if (['/register', '/login'].includes(url)) { + if (this.isUserAdmin) { + this.router.navigate(['dashboard']); + return false; + } + else { + this.router.navigate(['']); + return false; + } + } + else if (['/', '/post-question'].includes(url) || url.startsWith('/question/')) { + if (this.isUserAdmin) { + this.router.navigate(['dashboard']); + return false; + } + else { + return true; + } + } + else if (['/dashboard'].includes(url)) { + if (this.isUserAdmin) { + return true; + } + else { + this.router.navigate(['']); + return false; + } + } + else { + return true; + } + } + else { + if (['/dashboard', '/post-question'].includes(url) || url.startsWith('/question/')) { + this.router.navigate(['']); + return false; + } + else { + return true; + } + } + } +} From ee55b814506279dc36a8e8a88a7f4ed8885fc289 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 19:16:44 +0530 Subject: [PATCH 418/464] Update app-routing.module.ts --- .../src/app/app-routing.module.ts | 47 +++++++++++++++---- 1 file changed, 39 insertions(+), 8 deletions(-) diff --git a/do_connect_frontend/src/app/app-routing.module.ts b/do_connect_frontend/src/app/app-routing.module.ts index ae2828d..928fc4f 100644 --- a/do_connect_frontend/src/app/app-routing.module.ts +++ b/do_connect_frontend/src/app/app-routing.module.ts @@ -8,16 +8,47 @@ import { PageNotFoundComponent } from './page-not-found/page-not-found.component import { PostQuestionComponent } from './post-question/post-question.component'; import { QuestionComponent } from './question/question.component'; import { RegisterComponent } from './register/register.component'; +import { AuthGuard } from './utils/auth.guard'; const routes: Routes = [ - { path: '', component: HomeComponent }, - { path: 'login', component: LoginComponent }, - { path: 'register', component: RegisterComponent }, - { path: 'dashboard', component: DashboardComponent }, - { path: 'post-question', component: PostQuestionComponent }, - { path: 'question/:id', component: QuestionComponent }, - { path: 'error/:status', component: ErrorComponent }, - { path: '**', component: PageNotFoundComponent }, + { + path: '', + component: HomeComponent, + pathMatch: 'full' + }, + { + path: 'login', + component: LoginComponent, + canActivate: [AuthGuard] + }, + { + path: 'register', + component: RegisterComponent, + canActivate: [AuthGuard] + }, + { + path: 'dashboard', + component: DashboardComponent, + canActivate: [AuthGuard] + }, + { + path: 'post-question', + component: PostQuestionComponent, + canActivate: [AuthGuard] + }, + { + path: 'question/:id', + component: QuestionComponent, + canActivate: [AuthGuard] + }, + { + path: 'error/:status', + component: ErrorComponent + }, + { + path: '**', + component: PageNotFoundComponent + }, ]; @NgModule({ From f01ee38373a94b132eb143924a71f16212d160cc Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 19:26:43 +0530 Subject: [PATCH 419/464] Update admin.service.ts --- do_connect_frontend/src/app/service/admin.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/do_connect_frontend/src/app/service/admin.service.ts b/do_connect_frontend/src/app/service/admin.service.ts index 696399c..2aaa5e1 100644 --- a/do_connect_frontend/src/app/service/admin.service.ts +++ b/do_connect_frontend/src/app/service/admin.service.ts @@ -23,7 +23,7 @@ export class AdminService { } deleteUser(id: number) { - return this.http.delete(BASE_URL + '/users/' + id); + return this.http.delete(BASE_URL + '/users/' + id, { responseType: 'text' }); } approveQuestion(id: number) { From 6acd437fe0833d9430eed288860110d81da6d8c8 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 19:26:46 +0530 Subject: [PATCH 420/464] Update auth.guard.ts --- do_connect_frontend/src/app/utils/auth.guard.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/do_connect_frontend/src/app/utils/auth.guard.ts b/do_connect_frontend/src/app/utils/auth.guard.ts index 47319e5..5cd2018 100644 --- a/do_connect_frontend/src/app/utils/auth.guard.ts +++ b/do_connect_frontend/src/app/utils/auth.guard.ts @@ -21,7 +21,6 @@ export class AuthGuard implements CanActivate { canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable | Promise | boolean | UrlTree { const url = getResolvedUrl(route); - console.log({url}); if (this.isUserLoggedIn) { if (['/register', '/login'].includes(url)) { if (this.isUserAdmin) { From 250856fe569f90f0d4165e15d2c91332f27282fc Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 19:29:02 +0530 Subject: [PATCH 421/464] Update dashboard.component.ts --- .../src/app/dashboard/dashboard.component.ts | 20 ++++--------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/do_connect_frontend/src/app/dashboard/dashboard.component.ts b/do_connect_frontend/src/app/dashboard/dashboard.component.ts index 842d2ee..ea3192b 100644 --- a/do_connect_frontend/src/app/dashboard/dashboard.component.ts +++ b/do_connect_frontend/src/app/dashboard/dashboard.component.ts @@ -50,10 +50,7 @@ export class DashboardComponent implements OnInit { if (confirm('Are you sure you want to remove this user? This action cannot be reverted.')) { this._adminService.deleteUser(id).subscribe({ next: (res) => this.getUsers(), - error: (err) => { - if (err.status === 200) this.getUsers(); - else this.router.navigate(['/error/' + err.status]); - }, + error: (err) => this.router.navigate(['/error/' + err.status]), }); } } @@ -69,10 +66,7 @@ export class DashboardComponent implements OnInit { if (confirm('Are you sure? This action cannot be reverted.')) { this._adminService.deleteQuestion(id).subscribe({ next: (res) => this.getUnapprovedQuestions(), - error: (err) => { - if (err.status === 200) this.getUnapprovedQuestions(); - else this.router.navigate(['/error/' + err.status]); - }, + error: (err) => this.router.navigate(['/error/' + err.status]), }); } } @@ -80,10 +74,7 @@ export class DashboardComponent implements OnInit { onApproveAnswer(answer: AnswerType) { this._adminService.approveAnswer(answer).subscribe({ next: (res) => this.getUnapprovedAnswers(), - error: (err) => { - if (err.status === 200) this.getUnapprovedAnswers(); - else this.router.navigate(['/error/' + err.status]); - }, + error: (err) => this.router.navigate(['/error/' + err.status]), }); } @@ -91,10 +82,7 @@ export class DashboardComponent implements OnInit { if (confirm('Are you sure? This action cannot be reverted.')) { this._adminService.deleteAnswer(answer).subscribe({ next: (res) => this.getUnapprovedAnswers(), - error: (err) => { - if (err.status === 200) this.getUnapprovedAnswers(); - else this.router.navigate(['/error/' + err.status]); - }, + error: (err) => this.router.navigate(['/error/' + err.status]), }); } } From 8898b4e13c378b4f128d4a28d057fd17ccafa730 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 19:29:04 +0530 Subject: [PATCH 422/464] Update admin.service.ts --- do_connect_frontend/src/app/service/admin.service.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/do_connect_frontend/src/app/service/admin.service.ts b/do_connect_frontend/src/app/service/admin.service.ts index 2aaa5e1..5001ded 100644 --- a/do_connect_frontend/src/app/service/admin.service.ts +++ b/do_connect_frontend/src/app/service/admin.service.ts @@ -35,11 +35,11 @@ export class AdminService { } deleteQuestion(id: number) { - return this.http.delete(BASE_URL + '/questions/' + id); + return this.http.delete(BASE_URL + '/questions/' + id, { responseType: 'text' }); } deleteAnswer(answer: AnswerType) { - return this.http.delete(BASE_URL + '/questions/' + answer.question.id + '/answers/' + answer.id); + return this.http.delete(BASE_URL + '/questions/' + answer.question.id + '/answers/' + answer.id, { responseType: 'text' }); } } From 2a1221175f2a42c891921acd42798234a96af204 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 20:04:15 +0530 Subject: [PATCH 423/464] Update page-not-found.component.html --- .../src/app/page-not-found/page-not-found.component.html | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/do_connect_frontend/src/app/page-not-found/page-not-found.component.html b/do_connect_frontend/src/app/page-not-found/page-not-found.component.html index 023105f..d100f9a 100644 --- a/do_connect_frontend/src/app/page-not-found/page-not-found.component.html +++ b/do_connect_frontend/src/app/page-not-found/page-not-found.component.html @@ -1,3 +1,4 @@ -
-

Page Not Found!

+
+

Requested page does not exist

+
From e2372aaa1c247625bd71fb828f42ecdf3474f8e6 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 20:04:20 +0530 Subject: [PATCH 424/464] Update page-not-found.component.ts --- .../src/app/page-not-found/page-not-found.component.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/do_connect_frontend/src/app/page-not-found/page-not-found.component.ts b/do_connect_frontend/src/app/page-not-found/page-not-found.component.ts index 8aeb748..abe2ae9 100644 --- a/do_connect_frontend/src/app/page-not-found/page-not-found.component.ts +++ b/do_connect_frontend/src/app/page-not-found/page-not-found.component.ts @@ -1,4 +1,5 @@ import { Component, OnInit } from '@angular/core'; +import { isUserAdmin, isUserLoggedIn } from '../utils/util'; @Component({ selector: 'app-page-not-found', @@ -7,9 +8,10 @@ import { Component, OnInit } from '@angular/core'; }) export class PageNotFoundComponent implements OnInit { - constructor() { } + isUserAdmin = isUserAdmin(); - ngOnInit(): void { - } + constructor() {} + + ngOnInit(): void {} } From cacb0626e31d4545d40fb2cf0467bfa41c7262e6 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 20:15:39 +0530 Subject: [PATCH 425/464] Update app-routing.module.ts --- do_connect_frontend/src/app/app-routing.module.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/do_connect_frontend/src/app/app-routing.module.ts b/do_connect_frontend/src/app/app-routing.module.ts index 928fc4f..29172e0 100644 --- a/do_connect_frontend/src/app/app-routing.module.ts +++ b/do_connect_frontend/src/app/app-routing.module.ts @@ -42,7 +42,7 @@ const routes: Routes = [ canActivate: [AuthGuard] }, { - path: 'error/:status', + path: 'unauthorized', component: ErrorComponent }, { From 7d938ebc7dc9f892d531d1fbbbcd41c0dfefc2f0 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 20:15:42 +0530 Subject: [PATCH 426/464] Update dashboard.component.ts --- .../src/app/dashboard/dashboard.component.ts | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/do_connect_frontend/src/app/dashboard/dashboard.component.ts b/do_connect_frontend/src/app/dashboard/dashboard.component.ts index ea3192b..ff80fa8 100644 --- a/do_connect_frontend/src/app/dashboard/dashboard.component.ts +++ b/do_connect_frontend/src/app/dashboard/dashboard.component.ts @@ -2,6 +2,7 @@ import { Component, OnInit } from '@angular/core'; import { Router } from '@angular/router'; import { AnswerType, QuestionType, UserType } from '../constants/constants'; import { AdminService } from '../service/admin.service'; +import { handleErrorResponse } from '../utils/util'; @Component({ selector: 'app-dashboard', @@ -26,7 +27,7 @@ export class DashboardComponent implements OnInit { this.mode = 'questions'; this._adminService.getUnapprovedQuestions().subscribe({ next: (result) => (this.questionList = result as QuestionType[]), - error: (err) => this.router.navigate(['/error/' + err.status]), + error: (err) => handleErrorResponse(err, this.router), }); } @@ -34,7 +35,7 @@ export class DashboardComponent implements OnInit { this.mode = 'answers'; this._adminService.getUnapprovedAnswers().subscribe({ next: (result) => (this.answerList = result as AnswerType[]), - error: (err) => this.router.navigate(['/error/' + err.status]), + error: (err) => handleErrorResponse(err, this.router), }); } @@ -42,7 +43,7 @@ export class DashboardComponent implements OnInit { this.mode = 'users'; this._adminService.getUsers().subscribe({ next: (result) => (this.userList = result as UserType[]), - error: (err) => this.router.navigate(['/error/' + err.status]), + error: (err) => handleErrorResponse(err, this.router), }); } @@ -50,7 +51,7 @@ export class DashboardComponent implements OnInit { if (confirm('Are you sure you want to remove this user? This action cannot be reverted.')) { this._adminService.deleteUser(id).subscribe({ next: (res) => this.getUsers(), - error: (err) => this.router.navigate(['/error/' + err.status]), + error: (err) => handleErrorResponse(err, this.router), }); } } @@ -58,7 +59,7 @@ export class DashboardComponent implements OnInit { onApproveQuestion(id: number) { this._adminService.approveQuestion(id).subscribe({ next: (res) => this.getUnapprovedQuestions(), - error: (err) => this.router.navigate(['/error/' + err.status]), + error: (err) => handleErrorResponse(err, this.router), }); } @@ -66,7 +67,7 @@ export class DashboardComponent implements OnInit { if (confirm('Are you sure? This action cannot be reverted.')) { this._adminService.deleteQuestion(id).subscribe({ next: (res) => this.getUnapprovedQuestions(), - error: (err) => this.router.navigate(['/error/' + err.status]), + error: (err) => handleErrorResponse(err, this.router), }); } } @@ -74,7 +75,7 @@ export class DashboardComponent implements OnInit { onApproveAnswer(answer: AnswerType) { this._adminService.approveAnswer(answer).subscribe({ next: (res) => this.getUnapprovedAnswers(), - error: (err) => this.router.navigate(['/error/' + err.status]), + error: (err) => handleErrorResponse(err, this.router), }); } @@ -82,7 +83,7 @@ export class DashboardComponent implements OnInit { if (confirm('Are you sure? This action cannot be reverted.')) { this._adminService.deleteAnswer(answer).subscribe({ next: (res) => this.getUnapprovedAnswers(), - error: (err) => this.router.navigate(['/error/' + err.status]), + error: (err) => handleErrorResponse(err, this.router), }); } } From e4673f984e487222bcbb6aecd20054e0086c60be Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 20:15:44 +0530 Subject: [PATCH 427/464] Update error.component.html --- do_connect_frontend/src/app/error/error.component.html | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/do_connect_frontend/src/app/error/error.component.html b/do_connect_frontend/src/app/error/error.component.html index ddf5487..e125e3e 100644 --- a/do_connect_frontend/src/app/error/error.component.html +++ b/do_connect_frontend/src/app/error/error.component.html @@ -1,6 +1,4 @@ -
-

Internal Server Error!

-

Login Required!

-

Unauthorized Access!

-

Bad Request!

+
+

You are not authorized to access this page / resource

+
From 7c4eafac97fe0403eb9ccfd7e6b653d5e56f4683 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 20:15:46 +0530 Subject: [PATCH 428/464] Update error.component.ts --- .../src/app/error/error.component.ts | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/do_connect_frontend/src/app/error/error.component.ts b/do_connect_frontend/src/app/error/error.component.ts index 9bdea5f..633cbff 100644 --- a/do_connect_frontend/src/app/error/error.component.ts +++ b/do_connect_frontend/src/app/error/error.component.ts @@ -1,5 +1,5 @@ import { Component, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; +import { isUserAdmin } from '../utils/util'; @Component({ selector: 'app-error', @@ -7,12 +7,11 @@ import { ActivatedRoute } from '@angular/router'; styleUrls: ['./error.component.css'], }) export class ErrorComponent implements OnInit { - statusCode: any; - constructor(private activatedRoute: ActivatedRoute) {} + isUserAdmin = isUserAdmin(); + + constructor() {} + + ngOnInit(): void {} - ngOnInit(): void { - let urlParams = this.activatedRoute.snapshot.params; - this.statusCode = urlParams['status']; - } } From 1fcbeb365e2c99edb19d280b5be041939668ba57 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 20:15:49 +0530 Subject: [PATCH 429/464] Update navbar.component.ts --- .../src/app/navbar/navbar.component.ts | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/do_connect_frontend/src/app/navbar/navbar.component.ts b/do_connect_frontend/src/app/navbar/navbar.component.ts index fa04c24..78d74ec 100644 --- a/do_connect_frontend/src/app/navbar/navbar.component.ts +++ b/do_connect_frontend/src/app/navbar/navbar.component.ts @@ -2,7 +2,7 @@ import { HttpErrorResponse } from '@angular/common/http'; import { Component, OnInit } from '@angular/core'; import { Router } from '@angular/router'; import { UserService } from '../service/user.service'; -import { getCurrentUsername, isUserAdmin, isUserLoggedIn } from '../utils/util'; +import { getCurrentUsername, handleErrorResponse, isUserAdmin, isUserLoggedIn } from '../utils/util'; @Component({ selector: 'app-navbar', @@ -33,14 +33,7 @@ export class NavbarComponent implements OnInit { alert(result); this.router.navigate(['/login']); }, - error: (error: HttpErrorResponse) => { - if (error.status === 400) { - alert(error.error); - } - else { - this.router.navigate(['/error/' + error.status]); - } - }, + error: (error: HttpErrorResponse) => handleErrorResponse(error, this.router), }); } } From 7997cb7f518a2727cb21efba0a6bb5d4222bcbdd Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 20:15:52 +0530 Subject: [PATCH 430/464] Update home.component.ts --- .../src/app/home/home.component.ts | 20 +++---------------- 1 file changed, 3 insertions(+), 17 deletions(-) diff --git a/do_connect_frontend/src/app/home/home.component.ts b/do_connect_frontend/src/app/home/home.component.ts index 1ea57bf..74b9b2b 100644 --- a/do_connect_frontend/src/app/home/home.component.ts +++ b/do_connect_frontend/src/app/home/home.component.ts @@ -3,7 +3,7 @@ import { Component, OnInit } from '@angular/core'; import { Router } from '@angular/router'; import { QUESTIONS_TOPICS, QuestionType } from '../constants/constants'; import { UserService } from '../service/user.service'; -import { isUserAdmin, isUserLoggedIn } from '../utils/util'; +import { handleErrorResponse, isUserAdmin, isUserLoggedIn } from '../utils/util'; const OPEN_CHAT_BUTTON_LABEL = 'Chat'; @@ -29,14 +29,7 @@ export class HomeComponent implements OnInit { ngOnInit(): void { this._userService.getApprovedQuestions().subscribe({ next: (result) => (this.questionList = result as QuestionType[]), - error: (error: HttpErrorResponse) => { - if (error.status === 400) { - alert(error.error); - } - else { - this.router.navigate(['/error/' + error.status]); - } - }, + error: (error: HttpErrorResponse) => handleErrorResponse(error, this.router), }); } @@ -51,14 +44,7 @@ export class HomeComponent implements OnInit { searchHelper(query: string, topic: string) { this._userService.searchQuestion(query, (topic === 'All') ? '' : topic).subscribe({ next: (result) => (this.questionList = result as QuestionType[]), - error: (error: HttpErrorResponse) => { - if (error.status === 400) { - alert(error.error); - } - else { - this.router.navigate(['/error/' + error.status]); - } - }, + error: (error: HttpErrorResponse) => handleErrorResponse(error, this.router), }); } From 69df4c2e7d91deaa5ca070f91c773bd5977ef366 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 20:15:55 +0530 Subject: [PATCH 431/464] Update post-question.component.ts --- .../src/app/post-question/post-question.component.ts | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/do_connect_frontend/src/app/post-question/post-question.component.ts b/do_connect_frontend/src/app/post-question/post-question.component.ts index dfba432..0b1d021 100644 --- a/do_connect_frontend/src/app/post-question/post-question.component.ts +++ b/do_connect_frontend/src/app/post-question/post-question.component.ts @@ -5,6 +5,7 @@ import { Router } from '@angular/router'; import { BASE_URL, QUESTIONS_TOPICS } from '../constants/constants'; import { UploadImageService } from '../service/upload-image.service'; import { UserService } from '../service/user.service'; +import { handleErrorResponse } from '../utils/util'; @Component({ selector: 'app-post-question', @@ -34,14 +35,7 @@ export class PostQuestionComponent implements OnInit { next: (result) => { this.uploadedImages.push(result); }, - error: (error: HttpErrorResponse) => { - if (error.status === 400) { - alert(error.error); - } - else { - this.router.navigate(['/error/' + error.status]); - } - }, + error: (error: HttpErrorResponse) => handleErrorResponse(error, this.router), }); } } @@ -62,7 +56,7 @@ export class PostQuestionComponent implements OnInit { alert('Your question submission was successful.'); this.router.navigate(['/']); }, - error: (error) => this.router.navigate(['/error/' + error.status]), + error: (error) => handleErrorResponse(error, this.router), }); } From 1c6ab6d7f57b2efcfec23c0cbe17c8ed93dc1fe4 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 20:15:57 +0530 Subject: [PATCH 432/464] Update question.component.ts --- .../src/app/question/question.component.ts | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/do_connect_frontend/src/app/question/question.component.ts b/do_connect_frontend/src/app/question/question.component.ts index 560e13d..d228bb5 100644 --- a/do_connect_frontend/src/app/question/question.component.ts +++ b/do_connect_frontend/src/app/question/question.component.ts @@ -5,6 +5,7 @@ import { ActivatedRoute, Route, Router } from '@angular/router'; import { AnswerType, BASE_URL, QuestionType } from '../constants/constants'; import { UploadImageService } from '../service/upload-image.service'; import { UserService } from '../service/user.service'; +import { handleErrorResponse } from '../utils/util'; @Component({ selector: 'app-question', @@ -34,11 +35,11 @@ export class QuestionComponent implements OnInit { if (this.questionId) { this._userService.getQuestion(this.questionId).subscribe({ next: (result) => (this.questionData = result as QuestionType), - error: (err) => this.router.navigate(['/error/' + err.status]), + error: (error) => handleErrorResponse(error, this.router), }); this._userService.getAnswers(this.questionId).subscribe({ next: (result) => (this.answersList = result as AnswerType[]), - error: (err) => this.router.navigate(['/error/' + err.status]), + error: (error) => handleErrorResponse(error, this.router), }); } } @@ -50,14 +51,7 @@ export class QuestionComponent implements OnInit { next: (result) => { this.uploadedImages.push(result); }, - error: (error: HttpErrorResponse) => { - if (error.status === 400) { - alert(error.error); - } - else { - this.router.navigate(['/error/' + error.status]); - } - }, + error: (error: HttpErrorResponse) => handleErrorResponse(error, this.router), }); } } @@ -78,9 +72,7 @@ export class QuestionComponent implements OnInit { alert('Your answer submission was successful.'); this.router.navigate(['/']); }, - error: (error) => { - this.router.navigate(['/error/' + error.status]); - }, + error: (error) => handleErrorResponse(error, this.router), }); } } From df095bdfa4dec9ba3e870d9e4e29564b4cbcb202 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 20:15:59 +0530 Subject: [PATCH 433/464] Update register.component.ts --- .../src/app/register/register.component.ts | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/do_connect_frontend/src/app/register/register.component.ts b/do_connect_frontend/src/app/register/register.component.ts index 9100623..61b552c 100644 --- a/do_connect_frontend/src/app/register/register.component.ts +++ b/do_connect_frontend/src/app/register/register.component.ts @@ -3,6 +3,7 @@ import { Router } from '@angular/router'; import { UserService } from '../service/user.service'; import { FormGroup, FormControl, Validators } from "@angular/forms"; import { HttpErrorResponse } from '@angular/common/http'; +import { handleErrorResponse } from '../utils/util'; @Component({ selector: 'app-register', @@ -43,14 +44,7 @@ export class RegisterComponent implements OnInit { alert(result); this.router.navigate(['/login']); }, - error: (error: HttpErrorResponse) => { - if (error.status === 400) { - alert(error.error); - } - else { - this.router.navigate(['/error/' + error.status]); - } - }, + error: (error: HttpErrorResponse) => handleErrorResponse(error, this.router), }); } } From e8a7d062932afdc42db0d75a02b85b132a25b23f Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 20:16:01 +0530 Subject: [PATCH 434/464] Update util.ts --- do_connect_frontend/src/app/utils/util.ts | 32 ++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/do_connect_frontend/src/app/utils/util.ts b/do_connect_frontend/src/app/utils/util.ts index ed97325..834b716 100644 --- a/do_connect_frontend/src/app/utils/util.ts +++ b/do_connect_frontend/src/app/utils/util.ts @@ -1,4 +1,5 @@ -import { HttpHeaders } from '@angular/common/http'; +import { HttpErrorResponse, HttpHeaders } from '@angular/common/http'; +import { Router } from '@angular/router'; import jwtDecode from 'jwt-decode'; import { JWTCustomPayload } from '../constants/constants'; @@ -30,3 +31,32 @@ export const getCurrentUsername = () => { } return undefined; }; + +export const handleErrorResponse = (error: HttpErrorResponse, router: Router) => { + if (error.status === 400) { + if (error?.error) { + alert(error.error); + } + return; + } + else if (error.status === 401) { + if (error?.error) { + alert(error.error); + } + router.navigate(['login']); + return; + } + else if (error.status === 403) { + if (error?.error) { + alert(error.error); + } + router.navigate(['unauthorized']); + return; + } + else { + if (error?.error) { + alert(error.error); + } + router.navigate(['page-not-found']); + } +}; From 83325657b793c1fd1c22113ee26daa590bea843c Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 20:21:54 +0530 Subject: [PATCH 435/464] Update auth.guard.ts --- do_connect_frontend/src/app/utils/auth.guard.ts | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/do_connect_frontend/src/app/utils/auth.guard.ts b/do_connect_frontend/src/app/utils/auth.guard.ts index 5cd2018..a424b80 100644 --- a/do_connect_frontend/src/app/utils/auth.guard.ts +++ b/do_connect_frontend/src/app/utils/auth.guard.ts @@ -12,18 +12,16 @@ function getResolvedUrl(route: ActivatedRouteSnapshot): string { @Injectable({ providedIn: 'root' }) -export class AuthGuard implements CanActivate { - isUserLoggedIn = isUserLoggedIn(); - isUserAdmin = isUserAdmin(); +export class AuthGuard implements CanActivate { constructor(public router: Router) { } canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable | Promise | boolean | UrlTree { const url = getResolvedUrl(route); - if (this.isUserLoggedIn) { + if (isUserLoggedIn()) { if (['/register', '/login'].includes(url)) { - if (this.isUserAdmin) { + if (isUserAdmin()) { this.router.navigate(['dashboard']); return false; } @@ -33,7 +31,7 @@ export class AuthGuard implements CanActivate { } } else if (['/', '/post-question'].includes(url) || url.startsWith('/question/')) { - if (this.isUserAdmin) { + if (isUserAdmin()) { this.router.navigate(['dashboard']); return false; } @@ -42,7 +40,7 @@ export class AuthGuard implements CanActivate { } } else if (['/dashboard'].includes(url)) { - if (this.isUserAdmin) { + if (isUserAdmin()) { return true; } else { From 0581bb6e52a2eb233f4dbf5d19435444340c6263 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 20:28:10 +0530 Subject: [PATCH 436/464] Update dashboard.component.html --- .../src/app/dashboard/dashboard.component.html | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/do_connect_frontend/src/app/dashboard/dashboard.component.html b/do_connect_frontend/src/app/dashboard/dashboard.component.html index 9fdef6e..2913634 100644 --- a/do_connect_frontend/src/app/dashboard/dashboard.component.html +++ b/do_connect_frontend/src/app/dashboard/dashboard.component.html @@ -14,7 +14,10 @@
-
UsernameAction
{{ user.username }} {{ user.name }} {{ user.email }}
+
+ No questions to approve +
+
@@ -47,7 +50,10 @@
Question Topic
- +
+ No answers to approve +
+
@@ -80,7 +86,10 @@
Question Answer
- +
+ No users exist +
+
From 03875d3c1a7db533a17f18e7efe0db39214190f5 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 22:26:22 +0530 Subject: [PATCH 437/464] Update AnswerServiceImp.java --- .../com/wipro/cp/doconnect/service/AnswerServiceImp.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/AnswerServiceImp.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/AnswerServiceImp.java index 9a07b25..88c85b8 100644 --- a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/AnswerServiceImp.java +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/AnswerServiceImp.java @@ -1,3 +1,9 @@ +/* +* @Author: Tapas Kumar Saha +* Modified Date: 26-08-2022 +* Description: Answer Service +*/ + package com.wipro.cp.doconnect.service; import java.util.List; From 16c678307b4763eebbc43c2252b92dfc4f9e6512 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 22:26:24 +0530 Subject: [PATCH 438/464] Update EmailServiceImp.java --- .../com/wipro/cp/doconnect/service/EmailServiceImp.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/EmailServiceImp.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/EmailServiceImp.java index c746e03..0db80c5 100644 --- a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/EmailServiceImp.java +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/EmailServiceImp.java @@ -1,3 +1,9 @@ +/* +* @Author: Devashish Ashok Pathrabe +* Modified Date: 26-08-2022 +* Description: Email Service +*/ + package com.wipro.cp.doconnect.service; import org.springframework.beans.factory.annotation.Autowired; From f65bcb8191ab30df5bb06a738198177df0d3c3e3 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 22:26:26 +0530 Subject: [PATCH 439/464] Update IAnswerService.java --- .../java/com/wipro/cp/doconnect/service/IAnswerService.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IAnswerService.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IAnswerService.java index 1a1a78f..e3acce2 100644 --- a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IAnswerService.java +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IAnswerService.java @@ -1,3 +1,9 @@ +/* +* @Author: Devashish Ashok Pathrabe +* Modified Date: 26-08-2022 +* Description: Answer Service Interface +*/ + package com.wipro.cp.doconnect.service; import java.util.List; From 8253faa9e34e25c0f0c78873223f1944d5f15d87 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 22:26:29 +0530 Subject: [PATCH 440/464] Update IEmailService.java --- .../java/com/wipro/cp/doconnect/service/IEmailService.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IEmailService.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IEmailService.java index 3237959..ae08e81 100644 --- a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IEmailService.java +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IEmailService.java @@ -1,3 +1,9 @@ +/* +* @Author: Devashish Ashok Pathrabe +* Modified Date: 26-08-2022 +* Description: Email Service Interface +*/ + package com.wipro.cp.doconnect.service; import com.wipro.cp.doconnect.dto.EmailDTO; From 60016af1103b97f2735ac05a1065fccdc7efe560 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 22:26:32 +0530 Subject: [PATCH 441/464] Update ILogoutTokenService.java --- .../com/wipro/cp/doconnect/service/ILogoutTokenService.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/ILogoutTokenService.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/ILogoutTokenService.java index 9fb26fa..4a0d965 100644 --- a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/ILogoutTokenService.java +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/ILogoutTokenService.java @@ -1,3 +1,9 @@ +/* +* @Author: Devashish Ashok Pathrabe +* Modified Date: 26-08-2022 +* Description: Logout Token Service Interface +*/ + package com.wipro.cp.doconnect.service; import java.util.List; From 5c0e1957c06d957f318383f51eb52f54e2058d68 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 22:26:34 +0530 Subject: [PATCH 442/464] Update IQuestionService.java --- .../com/wipro/cp/doconnect/service/IQuestionService.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IQuestionService.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IQuestionService.java index 45e14bd..c063e99 100644 --- a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IQuestionService.java +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IQuestionService.java @@ -1,3 +1,9 @@ +/* +* @Author: Devashish Ashok Pathrabe +* Modified Date: 26-08-2022 +* Description: Question Service Interface +*/ + package com.wipro.cp.doconnect.service; import java.util.List; From ccb480e7a9a219a0a0a0d878a56ea8fa4348373f Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 22:26:37 +0530 Subject: [PATCH 443/464] Update IUserService.java --- .../java/com/wipro/cp/doconnect/service/IUserService.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IUserService.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IUserService.java index 92d81f8..c35a72b 100644 --- a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IUserService.java +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/IUserService.java @@ -1,3 +1,9 @@ +/* +* @Author: Devashish Ashok Pathrabe +* Modified Date: 26-08-2022 +* Description: User Service Interface +*/ + package com.wipro.cp.doconnect.service; import java.util.List; From f71d757f05c9585c2a8bbf02abe08ef1127f0590 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 22:26:40 +0530 Subject: [PATCH 444/464] Update LogoutTokenServiceImp.java --- .../wipro/cp/doconnect/service/LogoutTokenServiceImp.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/LogoutTokenServiceImp.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/LogoutTokenServiceImp.java index 6ae7b15..a067626 100644 --- a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/LogoutTokenServiceImp.java +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/LogoutTokenServiceImp.java @@ -1,3 +1,9 @@ +/* +* @Author: Devashish Ashok Pathrabe +* Modified Date: 26-08-2022 +* Description: Logout Token Service +*/ + package com.wipro.cp.doconnect.service; import java.util.List; From 55b4bdaa56f0fee294a4df67b8f45eae0bbf7008 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 22:26:43 +0530 Subject: [PATCH 445/464] Update QuestionServiceImp.java --- .../com/wipro/cp/doconnect/service/QuestionServiceImp.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/QuestionServiceImp.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/QuestionServiceImp.java index 101f876..48905aa 100644 --- a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/QuestionServiceImp.java +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/QuestionServiceImp.java @@ -1,3 +1,9 @@ +/* +* @Author: Jaddu Sai Prasad +* Modified Date: 26-08-2022 +* Description: Question Service +*/ + package com.wipro.cp.doconnect.service; import java.util.List; From 40d336ca074c797e1bcbc66fad99a6a4e82b790a Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 22:26:45 +0530 Subject: [PATCH 446/464] Update UserServiceImp.java --- .../java/com/wipro/cp/doconnect/service/UserServiceImp.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/UserServiceImp.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/UserServiceImp.java index f352d47..34d92f1 100644 --- a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/UserServiceImp.java +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/UserServiceImp.java @@ -1,3 +1,9 @@ +/* +* @Author: Ravi Kant Prasad +* Modified Date: 26-08-2022 +* Description: User Service +*/ + package com.wipro.cp.doconnect.service; import java.util.ArrayList; From 9f7b26a82bb01ddc62708c27e8506bc30b778788 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 22:26:51 +0530 Subject: [PATCH 447/464] Create UserServiceImpTest.java --- .../cp/doconnect/service/UserServiceImpTest.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 do_connect_backend/DoConnect/src/test/java/com/wipro/cp/doconnect/service/UserServiceImpTest.java diff --git a/do_connect_backend/DoConnect/src/test/java/com/wipro/cp/doconnect/service/UserServiceImpTest.java b/do_connect_backend/DoConnect/src/test/java/com/wipro/cp/doconnect/service/UserServiceImpTest.java new file mode 100644 index 0000000..ce6fb1a --- /dev/null +++ b/do_connect_backend/DoConnect/src/test/java/com/wipro/cp/doconnect/service/UserServiceImpTest.java @@ -0,0 +1,14 @@ +package com.wipro.cp.doconnect.service; + +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.Test; + +class UserServiceImpTest { + + @Test + void test() { + fail("Not yet implemented"); + } + +} From d805d8183904f8caebf2661d2ff3eb67d45bef4b Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 22:26:53 +0530 Subject: [PATCH 448/464] Update MessageController.java --- .../cp/doconnectchat/controller/MessageController.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/controller/MessageController.java b/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/controller/MessageController.java index 0bbc3a9..3895a06 100644 --- a/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/controller/MessageController.java +++ b/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/controller/MessageController.java @@ -1,3 +1,9 @@ +/* +* @Author: Devashish Ashok Pathrabe +* Modified Date: 26-08-2022 +* Description: Message REST Controller +*/ + package com.wipro.cp.doconnectchat.controller; import java.util.List; From f0cc9a855a7652b00175e88de9c2b1f4c31c6106 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 22:26:56 +0530 Subject: [PATCH 449/464] Update DoConnectChatApplication.java --- .../wipro/cp/doconnectchat/DoConnectChatApplication.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/DoConnectChatApplication.java b/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/DoConnectChatApplication.java index d89a36f..c272ac5 100644 --- a/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/DoConnectChatApplication.java +++ b/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/DoConnectChatApplication.java @@ -1,3 +1,9 @@ +/* +* @Author: Devashish Ashok Pathrabe +* Modified Date: 26-08-2022 +* Description: DoConnect Chat Application +*/ + package com.wipro.cp.doconnectchat; import org.springframework.boot.SpringApplication; From 46b249245607e2b3ac38bde7e1887ef25f76dc8c Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 22:26:58 +0530 Subject: [PATCH 450/464] Update MessageRequestDTO.java --- .../com/wipro/cp/doconnectchat/dto/MessageRequestDTO.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/dto/MessageRequestDTO.java b/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/dto/MessageRequestDTO.java index 02148a9..6572db1 100644 --- a/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/dto/MessageRequestDTO.java +++ b/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/dto/MessageRequestDTO.java @@ -1,3 +1,9 @@ +/* +* @Author: Devashish Ashok Pathrabe +* Modified Date: 26-08-2022 +* Description: Message Request DTO +*/ + package com.wipro.cp.doconnectchat.dto; public class MessageRequestDTO { From 32b2860458ac521f53aaf5d975ce716d5ca64482 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 22:27:01 +0530 Subject: [PATCH 451/464] Update MessageResponseDTO.java --- .../com/wipro/cp/doconnectchat/dto/MessageResponseDTO.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/dto/MessageResponseDTO.java b/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/dto/MessageResponseDTO.java index c94c477..62a563e 100644 --- a/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/dto/MessageResponseDTO.java +++ b/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/dto/MessageResponseDTO.java @@ -1,3 +1,9 @@ +/* +* @Author: Devashish Ashok Pathrabe +* Modified Date: 26-08-2022 +* Description: Message Response DTO +*/ + package com.wipro.cp.doconnectchat.dto; import java.util.Date; From f2e0bbf58bf6ee052de9fcc91a5e10408e78a01e Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 22:27:04 +0530 Subject: [PATCH 452/464] Update Message.java --- .../java/com/wipro/cp/doconnectchat/entity/Message.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/entity/Message.java b/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/entity/Message.java index 1990adb..729ca3b 100644 --- a/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/entity/Message.java +++ b/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/entity/Message.java @@ -1,3 +1,9 @@ +/* +* @Author: Devashish Ashok Pathrabe +* Modified Date: 26-08-2022 +* Description: Message Entity +*/ + package com.wipro.cp.doconnectchat.entity; import java.util.Date; From 111e9ac62a6f126eb955b6180a4c85739048c58f Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 22:27:06 +0530 Subject: [PATCH 453/464] Update MessageRepository.java --- .../cp/doconnectchat/repository/MessageRepository.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/repository/MessageRepository.java b/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/repository/MessageRepository.java index 5b531c7..aa5d19b 100644 --- a/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/repository/MessageRepository.java +++ b/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/repository/MessageRepository.java @@ -1,3 +1,9 @@ +/* +* @Author: Devashish Ashok Pathrabe +* Modified Date: 26-08-2022 +* Description: Message Repository +*/ + package com.wipro.cp.doconnectchat.repository; import java.util.List; From 259dc4acb354841327dac795473246c6996d02bf Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 22:27:09 +0530 Subject: [PATCH 454/464] Update IMessageService.java --- .../com/wipro/cp/doconnectchat/service/IMessageService.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/service/IMessageService.java b/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/service/IMessageService.java index d117d89..0f4a154 100644 --- a/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/service/IMessageService.java +++ b/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/service/IMessageService.java @@ -1,3 +1,9 @@ +/* +* @Author: Komal Anil Lawand +* Modified Date: 26-08-2022 +* Description: Message Service Interface +*/ + package com.wipro.cp.doconnectchat.service; import java.util.List; From 453c4921e7afd35bb64101b28e5034c0dec3ae28 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 22:27:12 +0530 Subject: [PATCH 455/464] Update MessageServiceImp.java --- .../wipro/cp/doconnectchat/service/MessageServiceImp.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/service/MessageServiceImp.java b/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/service/MessageServiceImp.java index 8365691..059a720 100644 --- a/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/service/MessageServiceImp.java +++ b/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/service/MessageServiceImp.java @@ -1,3 +1,9 @@ +/* +* @Author: Komal Anil Lawand +* Modified Date: 26-08-2022 +* Description: Message Service +*/ + package com.wipro.cp.doconnectchat.service; import java.util.List; From 8b40325d9a56db2ecd8c326639766d30842f3a88 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 23:22:25 +0530 Subject: [PATCH 456/464] Update AnswerServiceImp.java --- .../doconnect/service/AnswerServiceImp.java | 37 ++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/AnswerServiceImp.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/AnswerServiceImp.java index 88c85b8..5a90f45 100644 --- a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/AnswerServiceImp.java +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/AnswerServiceImp.java @@ -45,7 +45,14 @@ public class AnswerServiceImp implements IAnswerService { @Autowired private Utilities utilities; - + + /* + * @Author: Tapas Kumar Saha + * Modified Date: 26-08-2022 + * Description: Get all answers for a particular answer status + * Params: AnswerStatus string + * Return Type: AnswerResponseDTO List wrapped with StatusDTO + */ @Override public StatusDTO> getAllAnswers(String answerStatus) { if (answerStatus.equalsIgnoreCase("all")) { @@ -62,6 +69,13 @@ else if (answerStatus.equalsIgnoreCase("unapproved")) { } } + /* + * @Author: Tapas Kumar Saha + * Modified Date: 26-08-2022 + * Description: Get all answers for a particular question ID and answer status + * Params: QuestionID long, AnswerStatus string + * Return Type: AnswerResponseDTO List wrapped with StatusDTO + */ @Override public StatusDTO> getAllAnswersForQuestionId(Long questionId, String answerStatus) { if (answerStatus.equalsIgnoreCase("all")) { @@ -78,6 +92,13 @@ else if (answerStatus.equalsIgnoreCase("unapproved")) { } } + /* + * @Author: Tapas Kumar Saha + * Modified Date: 26-08-2022 + * Description: Create answer for a particular question ID + * Params: QuestionID long, AnswerRequestDTO object, PostedBy string + * Return Type: AnswerResponseDTO wrapped with StatusDTO + */ @Override public StatusDTO createAnswerForQuestionId(Long questionId, AnswerRequestDTO answerRequestDTO, String postedBy) { Optional optionalQuestion = questionRepository.findById(questionId); @@ -95,6 +116,13 @@ public StatusDTO createAnswerForQuestionId(Long questionId, A return new StatusDTO("", true, utilities.convertAnswerToAnswerResponseDTO(savedAnswer)); } + /* + * @Author: Tapas Kumar Saha + * Modified Date: 26-08-2022 + * Description: Update approval status of a particular answer for a particular question ID + * Params: QuestionID long, AnswerID long, AnswerUpdateDTO object, ApprovedBy string + * Return Type: AnswerResponseDTO wrapped with StatusDTO + */ @Override public StatusDTO updateAnswerForQuestionId(Long questionId, Long answerId, AnswerUpdateDTO answerUpdateDTO, String approvedBy) { boolean questionExists = questionRepository.existsById(questionId); @@ -111,6 +139,13 @@ public StatusDTO updateAnswerForQuestionId(Long questionId, L return new StatusDTO("", true, utilities.convertAnswerToAnswerResponseDTO(answerRepository.save(answer))); } + /* + * @Author: Tapas Kumar Saha + * Modified Date: 26-08-2022 + * Description: Delete a particular answer for a particular question ID + * Params: QuestionID long, AnswerID long + * Return Type: Boolean wrapped with StatusDTO + */ @Override public StatusDTO deleteAnswerForQuestionById(Long questionId, Long answerId) { boolean questionExists = questionRepository.existsById(questionId); From 683c7db6a37ce4c74b5210c4f4006b5f7f70f317 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 23:22:28 +0530 Subject: [PATCH 457/464] Update EmailServiceImp.java --- .../com/wipro/cp/doconnect/service/EmailServiceImp.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/EmailServiceImp.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/EmailServiceImp.java index 0db80c5..370f74e 100644 --- a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/EmailServiceImp.java +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/EmailServiceImp.java @@ -27,6 +27,13 @@ public class EmailServiceImp implements IEmailService { @Value("${spring.mail.username}") private String sender; + /* + * @Author: Devashish Ashok Pathrabe + * Modified Date: 26-08-2022 + * Description: Send email notification + * Params: EmailDTO object + * Return Type: Boolean + */ @Override public boolean sendNotificationEmail(EmailDTO emailDTO) { try { From d496f2dcb05574b1ec8e49af50d43a5b3fe1a0d9 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 23:22:32 +0530 Subject: [PATCH 458/464] Update LogoutTokenServiceImp.java --- .../service/LogoutTokenServiceImp.java | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/LogoutTokenServiceImp.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/LogoutTokenServiceImp.java index a067626..97295fa 100644 --- a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/LogoutTokenServiceImp.java +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/LogoutTokenServiceImp.java @@ -20,26 +20,61 @@ public class LogoutTokenServiceImp implements ILogoutTokenService { @Autowired LogoutTokenRepository logoutTokenRepository; + /* + * @Author: Devashish Ashok Pathrabe + * Modified Date: 26-08-2022 + * Description: Check if a particular token exist + * Params: Token string + * Return Type: Boolean + */ @Override public boolean checkIfTokenExists(String token) { return logoutTokenRepository.existsByToken(token); } + /* + * @Author: Devashish Ashok Pathrabe + * Modified Date: 26-08-2022 + * Description: Create token + * Params: LogoutToken + * Return Type: LogoutToken + */ @Override public LogoutToken createToken(LogoutToken logoutToken) { return logoutTokenRepository.save(logoutToken); } + /* + * @Author: Devashish Ashok Pathrabe + * Modified Date: 26-08-2022 + * Description: Create tokens + * Params: LogoutToken List + * Return Type: LogoutToken List + */ @Override public List createTokens(List logoutTokenList) { return logoutTokenRepository.saveAllAndFlush(logoutTokenList); } + /* + * @Author: Devashish Ashok Pathrabe + * Modified Date: 26-08-2022 + * Description: Get all tokens + * Params: None + * Return Type: LogoutToken List + */ @Override public List getAllTokens() { return logoutTokenRepository.findAll(); } + /* + * @Author: Devashish Ashok Pathrabe + * Modified Date: 26-08-2022 + * Description: Delete all tokens + * Params: None + * Return Type: None + */ @Override public void deleteAllTokens() { logoutTokenRepository.deleteAllInBatch(); From 2b54b540789a01f69ccf82ecaa692312b716d711 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 23:22:35 +0530 Subject: [PATCH 459/464] Update QuestionServiceImp.java --- .../doconnect/service/QuestionServiceImp.java | 39 ++++++++++++++++++- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/QuestionServiceImp.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/QuestionServiceImp.java index 48905aa..912b8b1 100644 --- a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/QuestionServiceImp.java +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/QuestionServiceImp.java @@ -41,6 +41,13 @@ public class QuestionServiceImp implements IQuestionService { @Autowired private Utilities utilities; + /* + * @Author: Jaddu Sai Prasad + * Modified Date: 26-08-2022 + * Description: Get all questions for a particular status, search and topic + * Params: Status string, Search string, Topic string + * Return Type: QuestionResponseDTO List wrapped with StatusDTO + */ @Override public StatusDTO> getAllQuestions(String status, String search, String topic) { if (search == null && topic == null) { @@ -82,7 +89,14 @@ else if (search == null && topic != null) { } } } - + + /* + * @Author: Jaddu Sai Prasad + * Modified Date: 26-08-2022 + * Description: Get question for a particular question ID + * Params: QuestionID long + * Return Type: QuestionResponseDTO wrapped with StatusDTO + */ @Override public StatusDTO getQuestionById(Long questionId) { Optional optionalQuestion = questionRepository.findById(questionId); @@ -91,7 +105,14 @@ public StatusDTO getQuestionById(Long questionId) { } return new StatusDTO("", true, utilities.convertQuestionToQuestionResponseDTO(optionalQuestion.get())); } - + + /* + * @Author: Jaddu Sai Prasad + * Modified Date: 26-08-2022 + * Description: Create question + * Params: QuestionRequestDTO object, PostedBy string + * Return Type: QuestionResponseDTO wrapped with StatusDTO + */ @Override public StatusDTO createQuestion(QuestionRequestDTO questionRequestDTO, String postedBy) { Question question = new Question(questionRequestDTO.getQuestion(), questionRequestDTO.getTopic(), questionRequestDTO.getImages(), postedBy); @@ -105,6 +126,13 @@ public StatusDTO createQuestion(QuestionRequestDTO question return new StatusDTO("", true, utilities.convertQuestionToQuestionResponseDTO(savedQuestion)); } + /* + * @Author: Jaddu Sai Prasad + * Modified Date: 26-08-2022 + * Description: Update approval status of a particular question ID + * Params: QuestionUpdateDTO object, QuestionID long, ApprovedBy string + * Return Type: QuestionResponseDTO wrapped with StatusDTO + */ @Override public StatusDTO updateQuestion(QuestionUpdateDTO questionUpdateDTO, Long questionId, String approvedBy) { Optional optionalQuestion = questionRepository.findById(questionId); @@ -117,6 +145,13 @@ public StatusDTO updateQuestion(QuestionUpdateDTO questionU return new StatusDTO("", true, utilities.convertQuestionToQuestionResponseDTO(questionRepository.save(question))); } + /* + * @Author: Jaddu Sai Prasad + * Modified Date: 26-08-2022 + * Description: Delete a particular question ID + * Params: QuestionID long + * Return Type: Boolean wrapped with StatusDTO + */ @Override public StatusDTO deleteQuestionById(Long questionId) { Optional optionalQuestion = questionRepository.findById(questionId); From c2efb54f019941ad823c7a3fef32c0f9c378c062 Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 23:22:39 +0530 Subject: [PATCH 460/464] Update UserServiceImp.java --- .../cp/doconnect/service/UserServiceImp.java | 51 ++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/UserServiceImp.java b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/UserServiceImp.java index 34d92f1..b1dc57c 100644 --- a/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/UserServiceImp.java +++ b/do_connect_backend/DoConnect/src/main/java/com/wipro/cp/doconnect/service/UserServiceImp.java @@ -48,7 +48,14 @@ private StatusDTO convertOptionalUserToStatusDTOUserResponseDTO public StatusDTO getUserByUsername(String username) { return convertOptionalUserToStatusDTOUserResponseDTO(userRepository.findByUsername(username), "User with username " + username + " does not exist."); } - + + /* + * @Author: Ravi Kant Prasad + * Modified Date: 26-08-2022 + * Description: Load user by username + * Params: Username string + * Return Type: UserDetails object + */ @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { Optional optionalUser = userRepository.findByUsername(username); @@ -59,6 +66,13 @@ public UserDetails loadUserByUsername(String username) throws UsernameNotFoundEx return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), new ArrayList<>()); } + /* + * @Author: Ravi Kant Prasad + * Modified Date: 26-08-2022 + * Description: Create user + * Params: UserRegisterDTO object + * Return Type: UserResponseDTO wrapped with StatusDTO + */ @Override public StatusDTO createUser(UserRegisterDTO userRegisterDTO) { if (userRepository.existsByUsername(userRegisterDTO.getUsername())) { @@ -74,16 +88,37 @@ public StatusDTO createUser(UserRegisterDTO userRegisterDTO) { return new StatusDTO("", true, convertUserToUserResponseDTO(userRepository.save(user))); } + /* + * @Author: Ravi Kant Prasad + * Modified Date: 26-08-2022 + * Description: Get all users + * Params: None + * Return Type: UserResponseDTO List + */ @Override public List getAllUsers() { return userRepository.findAll().stream().map(user -> convertUserToUserResponseDTO(user)).collect(Collectors.toList()); } + /* + * @Author: Ravi Kant Prasad + * Modified Date: 26-08-2022 + * Description: Get user by a particular user ID + * Params: User ID long + * Return Type: UserResponseDTO object wrapped with StatusDTO + */ @Override public StatusDTO getUserById(Long id) { return convertOptionalUserToStatusDTOUserResponseDTO(userRepository.findById(id), "User with ID " + id + " does not exist."); } + /* + * @Author: Ravi Kant Prasad + * Modified Date: 26-08-2022 + * Description: Update a particular user ID + * Params: UserUpdateDTO object, User ID long + * Return Type: UserResponseDTO object wrapped with StatusDTO + */ @Override public StatusDTO updateUser(UserUpdateDTO userUpdateDTO, Long id) { Optional optionalUser = userRepository.findById(id); @@ -96,6 +131,13 @@ public StatusDTO updateUser(UserUpdateDTO userUpdateDTO, Long i return new StatusDTO("", true, convertUserToUserResponseDTO(userRepository.save(user))); } + /* + * @Author: Ravi Kant Prasad + * Modified Date: 26-08-2022 + * Description: Delete a particular user ID + * Params: User ID long + * Return Type: Boolean + */ @Override public boolean deleteUserById(Long id) { Optional optionalUser = userRepository.findById(id); @@ -106,6 +148,13 @@ public boolean deleteUserById(Long id) { return true; } + /* + * @Author: Ravi Kant Prasad + * Modified Date: 26-08-2022 + * Description: Delete all users + * Params: None + * Return Type: None + */ @Override public void deleteAllUsers() { userRepository.deleteAllInBatch(); From 91d7834c4b7ce22f4b8355b53226880b9ad201ac Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 23:22:42 +0530 Subject: [PATCH 461/464] Update IMessageService.java --- .../com/wipro/cp/doconnectchat/service/IMessageService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/service/IMessageService.java b/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/service/IMessageService.java index 0f4a154..255edc2 100644 --- a/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/service/IMessageService.java +++ b/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/service/IMessageService.java @@ -1,5 +1,5 @@ /* -* @Author: Komal Anil Lawand +* @Author: Devashish Ashok Pathrabe * Modified Date: 26-08-2022 * Description: Message Service Interface */ From 02c249fb16a469d3b13cd9e34a860a0fba93186e Mon Sep 17 00:00:00 2001 From: Devashish Ashok Pathrabe Date: Mon, 29 Aug 2022 23:22:44 +0530 Subject: [PATCH 462/464] Update MessageServiceImp.java --- .../doconnectchat/service/MessageServiceImp.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/service/MessageServiceImp.java b/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/service/MessageServiceImp.java index 059a720..f0892f1 100644 --- a/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/service/MessageServiceImp.java +++ b/do_connect_backend/DoConnectChat/src/main/java/com/wipro/cp/doconnectchat/service/MessageServiceImp.java @@ -27,11 +27,25 @@ private MessageResponseDTO convertMessageToMessageResponseDTO(Message message) { return new MessageResponseDTO(message.getMessage(), message.getPostedAt(), message.getPostedBy()); } + /* + * @Author: Komal Anil Lawand + * Modified Date: 26-08-2022 + * Description: Get all messages + * Params: None + * Return Type: MessageResponseDTO list + */ @Override public List getAllMessages() { return messageRepository.findAllByOrderByPostedAtAsc().stream().map(message -> convertMessageToMessageResponseDTO(message)).collect(Collectors.toList()); } + /* + * @Author: Komal Anil Lawand + * Modified Date: 26-08-2022 + * Description: Create message + * Params: MessageRequestDTO object + * Return Type: Boolean + */ @Override public boolean createMessage(MessageRequestDTO messageRequestDTO) { try { From 5ae38ab57a4902c752c8686d28f7cafb9315b9e5 Mon Sep 17 00:00:00 2001 From: ravi0818 Date: Tue, 30 Aug 2022 14:07:11 +0530 Subject: [PATCH 463/464] test cases added for userservice and questionservice --- .../src/main/resources/application.properties | 12 +- .../service/QuestionServiceImpTest.java | 63 +++++++++ .../doconnect/service/UserServiceImpTest.java | 64 +++++++++- .../src/main/resources/application.properties | 4 +- .../src/app/constants/constants.ts | 120 +++++++++--------- .../src/app/navbar/navbar.component.ts | 16 ++- 6 files changed, 204 insertions(+), 75 deletions(-) create mode 100644 do_connect_backend/DoConnect/src/test/java/com/wipro/cp/doconnect/service/QuestionServiceImpTest.java diff --git a/do_connect_backend/DoConnect/src/main/resources/application.properties b/do_connect_backend/DoConnect/src/main/resources/application.properties index 851090b..26b2c2e 100644 --- a/do_connect_backend/DoConnect/src/main/resources/application.properties +++ b/do_connect_backend/DoConnect/src/main/resources/application.properties @@ -1,8 +1,8 @@ -server.port=9090 +server.port=8181 spring.datasource.url=jdbc:mysql://localhost:3306/do_connect?createDatabaseIfNotExist=true&useSSL=false spring.datasource.username=root -spring.datasource.password=Sonu#2000 +spring.datasource.password=root spring.jpa.hibernate.ddl-auto=update spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect spring.jpa.open-in-view=false @@ -13,8 +13,8 @@ spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true spring.mail.host=smtp.gmail.com spring.mail.port=587 -spring.mail.username= -spring.mail.password= +spring.mail.username=rkprasad0818@gmail.com +spring.mail.password=enbeznbouvjxkprb spring.mail.properties.mail.smtp.auth=true spring.mail.properties.mail.smtp.starttls.enable=true @@ -25,6 +25,6 @@ jwt.token-validity-time=10800 image-storage-directory=/do_connect_images valid-image-extensions=png,jpeg -enable-notification-emails=false +enable-notification-emails=true -chat-microservice-base-url=http://localhost:9191 +chat-microservice-base-url=http://localhost:8282 diff --git a/do_connect_backend/DoConnect/src/test/java/com/wipro/cp/doconnect/service/QuestionServiceImpTest.java b/do_connect_backend/DoConnect/src/test/java/com/wipro/cp/doconnect/service/QuestionServiceImpTest.java new file mode 100644 index 0000000..c524dc4 --- /dev/null +++ b/do_connect_backend/DoConnect/src/test/java/com/wipro/cp/doconnect/service/QuestionServiceImpTest.java @@ -0,0 +1,63 @@ +package com.wipro.cp.doconnect.service; + +import static org.junit.jupiter.api.Assertions.*; + +import java.util.List; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import com.wipro.cp.doconnect.dto.QuestionRequestDTO; +import com.wipro.cp.doconnect.dto.QuestionResponseDTO; +import com.wipro.cp.doconnect.dto.QuestionUpdateDTO; +import com.wipro.cp.doconnect.dto.StatusDTO; + +/* +* @Author: Jaddu Sai Prasad +* Modified Date: 30-08-2022 +* Description: Test Cases for QuestionServiceImp +* Params: None +* Return Type: None +*/ +@SpringBootTest +class QuestionServiceImpTest { + + @Autowired + IQuestionService questionService; + + @Test + void testGetAllQuestions() { + StatusDTO> reponse = questionService.getAllQuestions("approved", null, "programming"); + assertNotNull(reponse); + } + + @Test + void testGetQuestionById() { + StatusDTO response = questionService.getQuestionById(3L); + assertNotNull(response); + } + + @Test + void testCreateQuestion() { + QuestionRequestDTO question = new QuestionRequestDTO(); + question.setQuestion("What is Autowired anotation?"); + question.setTopic("Programming"); + StatusDTO response = questionService.createQuestion(question, "user04"); + } + + @Test + void testUpdateQuestion() { + QuestionUpdateDTO updatedQuestion = new QuestionUpdateDTO(); + updatedQuestion.setIsApproved(true); + StatusDTO response = questionService.updateQuestion(updatedQuestion, 10L, "admin01"); + assertNotNull(response); + } + + @Test + void testDeleteQuestionById() { + StatusDTO reponse = questionService.deleteQuestionById(10L); + assertNotNull(reponse); + } + +} diff --git a/do_connect_backend/DoConnect/src/test/java/com/wipro/cp/doconnect/service/UserServiceImpTest.java b/do_connect_backend/DoConnect/src/test/java/com/wipro/cp/doconnect/service/UserServiceImpTest.java index ce6fb1a..00fcedb 100644 --- a/do_connect_backend/DoConnect/src/test/java/com/wipro/cp/doconnect/service/UserServiceImpTest.java +++ b/do_connect_backend/DoConnect/src/test/java/com/wipro/cp/doconnect/service/UserServiceImpTest.java @@ -2,13 +2,73 @@ import static org.junit.jupiter.api.Assertions.*; +import java.util.List; + import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import com.wipro.cp.doconnect.dto.StatusDTO; +import com.wipro.cp.doconnect.dto.UserRegisterDTO; +import com.wipro.cp.doconnect.dto.UserResponseDTO; +import com.wipro.cp.doconnect.dto.UserUpdateDTO; + +/* +* @Author: Ravi Kant Prasad +* Modified Date: 30-08-2022 +* Description: Test Cases for UserServiceImp +* Params: None +* Return Type: None +*/ +@SpringBootTest class UserServiceImpTest { + + @Autowired + IUserService userService; + + @Test + void testCreateUser() { + UserRegisterDTO user = new UserRegisterDTO(); + user.setUsername("testuser"); + user.setEmail("testuser@gmail.com"); + user.setName("Test User"); + user.setIsAdmin(false); + user.setPassword("testuser12345"); + StatusDTO response = userService.createUser(user); + assertNotNull(response); + } + + @Test + void testGetAllUsers() { + List response= userService.getAllUsers(); + assertNotNull(response); + } + + @Test + void testGetUserById() { + StatusDTO response = userService.getUserById(1L); + assertNotNull(response); + } @Test - void test() { - fail("Not yet implemented"); + void testUpdateUser() { + UserUpdateDTO user = new UserUpdateDTO(); + user.setName("Test User Updated"); + user.setIsAdmin(false); + StatusDTO response = userService.updateUser(user, 6L); + assertNotNull(response); } + @Test + void testDeleteUserById() { + boolean response = userService.deleteUserById(6L); + assertNotNull(response); + } + +// @Test +// void testDeleteAllUsers() { +// fail("Not yet implemented"); +// } + } diff --git a/do_connect_backend/DoConnectChat/src/main/resources/application.properties b/do_connect_backend/DoConnectChat/src/main/resources/application.properties index 9040e50..d9d7c7f 100644 --- a/do_connect_backend/DoConnectChat/src/main/resources/application.properties +++ b/do_connect_backend/DoConnectChat/src/main/resources/application.properties @@ -1,8 +1,8 @@ -server.port=9191 +server.port=8282 spring.datasource.url=jdbc:mysql://localhost:3306/do_connect?createDatabaseIfNotExist=true&useSSL=false spring.datasource.username=root -spring.datasource.password=Sonu#2000 +spring.datasource.password=root spring.jpa.hibernate.ddl-auto=update spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect spring.jpa.open-in-view=false diff --git a/do_connect_frontend/src/app/constants/constants.ts b/do_connect_frontend/src/app/constants/constants.ts index 1b29e4d..abd13aa 100644 --- a/do_connect_frontend/src/app/constants/constants.ts +++ b/do_connect_frontend/src/app/constants/constants.ts @@ -1,87 +1,87 @@ -import { JwtPayload } from "jwt-decode"; +import { JwtPayload } from 'jwt-decode'; -export const BASE_URL = 'http://localhost:9090/api/v1'; +export const BASE_URL = 'http://localhost:8181/api/v1'; export interface JWTCustomPayload extends JwtPayload { - isAdmin: boolean; - email: string; - name: string; + isAdmin: boolean; + email: string; + name: string; } export interface UserLoginType { - username: string; - password: string; + username: string; + password: string; } export interface UserRegisterType extends UserLoginType { - name: string; - email: string; - isAdmin: boolean; + name: string; + email: string; + isAdmin: boolean; } export interface UserType extends Omit { - id: number; + id: number; } export interface QuestionPostType { - question: string; - topic: string; - images: string[]; + question: string; + topic: string; + images: string[]; } export interface QuestionType extends QuestionPostType { - id: number; - postedBy: string; - postedAt: Date; - approvedBy: string; - isApproved: boolean; + id: number; + postedBy: string; + postedAt: Date; + approvedBy: string; + isApproved: boolean; } export interface AnswerPostType { - answer: string; - images: string[]; + answer: string; + images: string[]; } export interface AnswerType extends AnswerPostType { - id: number; - postedBy: string; - postedAt: Date; - approvedBy: string; - isApproved: boolean; - question: QuestionType; + id: number; + postedBy: string; + postedAt: Date; + approvedBy: string; + isApproved: boolean; + question: QuestionType; } export const QUESTIONS_TOPICS = [ - 'Actors', - 'Algebra', - 'Applications', - 'Arts', - 'Books', - 'Climate Change', - 'Comedy / Humour', - 'Commerce', - 'Computer Science', - 'Current Affairs', - 'Electronics', - 'Engineering', - 'Food', - 'Games', - 'General', - 'General Knowledge', - 'History', - 'Hobbies', - 'Humanity', - 'Information Technology', - 'Internet', - 'Mathematics', - 'Movies', - 'Music', - 'Pets', - 'Philosophy', - 'Programming', - 'Random', - 'Restaurants', - 'Science', - 'Television', - 'Travel', - 'Weather', + 'Actors', + 'Algebra', + 'Applications', + 'Arts', + 'Books', + 'Climate Change', + 'Comedy / Humour', + 'Commerce', + 'Computer Science', + 'Current Affairs', + 'Electronics', + 'Engineering', + 'Food', + 'Games', + 'General', + 'General Knowledge', + 'History', + 'Hobbies', + 'Humanity', + 'Information Technology', + 'Internet', + 'Mathematics', + 'Movies', + 'Music', + 'Pets', + 'Philosophy', + 'Programming', + 'Random', + 'Restaurants', + 'Science', + 'Television', + 'Travel', + 'Weather', ]; diff --git a/do_connect_frontend/src/app/navbar/navbar.component.ts b/do_connect_frontend/src/app/navbar/navbar.component.ts index 78d74ec..a42a092 100644 --- a/do_connect_frontend/src/app/navbar/navbar.component.ts +++ b/do_connect_frontend/src/app/navbar/navbar.component.ts @@ -2,7 +2,12 @@ import { HttpErrorResponse } from '@angular/common/http'; import { Component, OnInit } from '@angular/core'; import { Router } from '@angular/router'; import { UserService } from '../service/user.service'; -import { getCurrentUsername, handleErrorResponse, isUserAdmin, isUserLoggedIn } from '../utils/util'; +import { + getCurrentUsername, + handleErrorResponse, + isUserAdmin, + isUserLoggedIn, +} from '../utils/util'; @Component({ selector: 'app-navbar', @@ -10,7 +15,6 @@ import { getCurrentUsername, handleErrorResponse, isUserAdmin, isUserLoggedIn } styleUrls: ['./navbar.component.css'], }) export class NavbarComponent implements OnInit { - isAdmin = isUserAdmin(); isLoggedIn = isUserLoggedIn(); username = getCurrentUsername(); @@ -18,10 +22,11 @@ export class NavbarComponent implements OnInit { constructor(private _userService: UserService, private router: Router) {} ngOnInit(): void { - this.router.events.subscribe(event => { - if (event.constructor.name === "NavigationEnd") { + this.router.events.subscribe((event) => { + if (event.constructor.name === 'NavigationEnd') { this.isAdmin = isUserAdmin(); this.isLoggedIn = isUserLoggedIn(); + this.username = getCurrentUsername(); } }); } @@ -33,7 +38,8 @@ export class NavbarComponent implements OnInit { alert(result); this.router.navigate(['/login']); }, - error: (error: HttpErrorResponse) => handleErrorResponse(error, this.router), + error: (error: HttpErrorResponse) => + handleErrorResponse(error, this.router), }); } } From 494f7b599b51132b6e72663c4db1ccd58977ac30 Mon Sep 17 00:00:00 2001 From: ravi0818 Date: Tue, 30 Aug 2022 14:09:38 +0530 Subject: [PATCH 464/464] final commit --- .../DoConnect/src/main/resources/application.properties | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/do_connect_backend/DoConnect/src/main/resources/application.properties b/do_connect_backend/DoConnect/src/main/resources/application.properties index 26b2c2e..331049e 100644 --- a/do_connect_backend/DoConnect/src/main/resources/application.properties +++ b/do_connect_backend/DoConnect/src/main/resources/application.properties @@ -13,8 +13,8 @@ spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true spring.mail.host=smtp.gmail.com spring.mail.port=587 -spring.mail.username=rkprasad0818@gmail.com -spring.mail.password=enbeznbouvjxkprb +spring.mail.username= +spring.mail.password= spring.mail.properties.mail.smtp.auth=true spring.mail.properties.mail.smtp.starttls.enable=true @@ -25,6 +25,6 @@ jwt.token-validity-time=10800 image-storage-directory=/do_connect_images valid-image-extensions=png,jpeg -enable-notification-emails=true +enable-notification-emails=false chat-microservice-base-url=http://localhost:8282
Username Name