diff --git a/.gitignore b/.gitignore index 0828a05..f2c94e7 100644 --- a/.gitignore +++ b/.gitignore @@ -115,3 +115,5 @@ fabric.properties .idea/**/azureSettings.xml # End of https://www.toptal.com/developers/gitignore/api/clion + +run/ \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..98cd9e7 --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +backend \ No newline at end of file diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml new file mode 100644 index 0000000..61eb0a1 --- /dev/null +++ b/.idea/dataSources.xml @@ -0,0 +1,19 @@ + + + + + sqlite.xerial + true + org.sqlite.JDBC + jdbc:sqlite:$PROJECT_DIR$/old_backend/sqlite.db + $ProjectFileDir$ + + + sqlite.xerial + true + org.sqlite.JDBC + jdbc:sqlite:$PROJECT_DIR$/run/sqlite.db + $ProjectFileDir$ + + + \ No newline at end of file diff --git a/.idea/file_server.iml b/.idea/file_server.iml new file mode 100644 index 0000000..6d70257 --- /dev/null +++ b/.idea/file_server.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..f0452e2 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..75aa0b0 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..9661ac7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/backend/CMakeLists.txt b/backend/CMakeLists.txt new file mode 100644 index 0000000..a6d05ce --- /dev/null +++ b/backend/CMakeLists.txt @@ -0,0 +1,70 @@ +cmake_minimum_required(VERSION 3.20) +project(backend) + +set(CMAKE_CXX_STANDARD 23) +set(CMAKE_CXX_STANDARD_REQUIRED YES) + +add_executable(backend + src/main.cpp + + src/dto/dto.h + src/dto/responses.cpp + + src/db/db.h + src/db/db.cpp + + src/db/model/Inode.cc + src/db/model/Inode.h + src/db/model/Tokens.cc + src/db/model/Tokens.h + src/db/model/User.cc + src/db/model/User.h + + src/controllers/controllers.h + src/controllers/admin.cpp + src/controllers/fs.cpp + src/controllers/user.cpp + src/controllers/auth/auth_common.cpp + src/controllers/auth/auth_basic.cpp + src/controllers/auth/auth_2fa.cpp + + src/filters/filters.h + src/filters/filters.cpp + src/controllers/auth/auth_gitlab.cpp) + + +if (MINGW) + target_link_libraries(backend -static-libgcc -static-libstdc++) +endif (MINGW) + + +find_package(Drogon CONFIG REQUIRED) +find_package(CURL CONFIG REQUIRED) +find_package(PNG REQUIRED) +find_path(JWT_CPP_INCLUDE_DIRS "jwt-cpp/base.h") +find_path(BOTAN_INCLUDE_DIRS "botan/botan.h") +find_path(QR_INCLUDE_DIRS "qrcodegen.hpp") +find_path(PNGPP_INCLUDE_DIRS "png++/color.hpp") +find_library(BOTAN_LIBRARY botan-2) +find_library(QR_LIBRARY nayuki-qr-code-generator) + +target_include_directories(backend PRIVATE + src + ${JWT_CPP_INCLUDE_DIRS} + ${BOTAN_INCLUDE_DIRS} + ${QR_INCLUDE_DIRS} + ${PNGPP_INCLUDE_DIRS} +) + +target_link_libraries(backend + Drogon::Drogon + CURL::libcurl + PNG::PNG + ${BOTAN_LIBRARY} + ${QR_LIBRARY} +) + +target_compile_options(backend PRIVATE + $<$:-g -Wall -Wno-unknown-pragmas> + $<$:-O3> +) \ No newline at end of file diff --git a/backend/src/controllers/admin.cpp b/backend/src/controllers/admin.cpp new file mode 100644 index 0000000..ae777a1 --- /dev/null +++ b/backend/src/controllers/admin.cpp @@ -0,0 +1,88 @@ +#pragma clang diagnostic push +#pragma ide diagnostic ignored "performance-unnecessary-value-param" +#pragma ide diagnostic ignored "readability-convert-member-functions-to-static" + +#include "controllers.h" +#include "dto/dto.h" + +namespace api { + void admin::users(req_type, cbk_type cbk) { + db::MapperUser user_mapper(drogon::app().getDbClient()); + std::vector entries; + auto users = user_mapper.findAll(); + for (const db::User& user : users) + entries.emplace_back( + user.getValueOfId(), + user.getValueOfGitlab() != 0, + db::User_getEnumTfaType(user) != db::tfaTypes::NONE, + user.getValueOfName(), + db::User_getEnumRole(user) + ); + cbk(dto::Responses::get_admin_users_res(entries)); + } + + void admin::set_role(req_type req, cbk_type cbk) { + Json::Value& json = *req->jsonObject(); + try { + uint64_t user_id = dto::json_get(json, "user").value(); + db::UserRole role = (db::UserRole)dto::json_get(json, "role").value(); + + db::MapperUser user_mapper(drogon::app().getDbClient()); + auto user = user_mapper.findByPrimaryKey(user_id); + user.setRole(role); + user_mapper.update(user); + + cbk(dto::Responses::get_success_res()); + } catch (const std::exception&) { + cbk(dto::Responses::get_badreq_res("Validation error")); + } + } + + void admin::logout(req_type req, cbk_type cbk) { + Json::Value& json = *req->jsonObject(); + try { + uint64_t user_id = dto::json_get(json, "user").value(); + + db::MapperUser user_mapper(drogon::app().getDbClient()); + auto user = user_mapper.findByPrimaryKey(user_id); + auth::revoke_all(user); + + cbk(dto::Responses::get_success_res()); + } catch (const std::exception&) { + cbk(dto::Responses::get_badreq_res("Validation error")); + } + } + + void admin::delete_user(req_type req, cbk_type cbk) { + Json::Value& json = *req->jsonObject(); + try { + uint64_t user_id = dto::json_get(json, "user").value(); + + db::MapperUser user_mapper(drogon::app().getDbClient()); + auto user = user_mapper.findByPrimaryKey(user_id); + auth::revoke_all(user); + fs::delete_node(fs::get_node(user.getValueOfRootId()).value(), true); + user_mapper.deleteOne(user); + cbk(dto::Responses::get_success_res()); + } catch (const std::exception&) { + cbk(dto::Responses::get_badreq_res("Validation error")); + } + } + + void admin::disable_2fa(req_type req, cbk_type cbk) { + Json::Value& json = *req->jsonObject(); + try { + uint64_t user_id = dto::json_get(json, "user").value(); + + db::MapperUser user_mapper(drogon::app().getDbClient()); + auto user = user_mapper.findByPrimaryKey(user_id); + user.setTfaType(db::tfaTypes::NONE); + user_mapper.update(user); + + cbk(dto::Responses::get_success_res()); + } catch (const std::exception&) { + cbk(dto::Responses::get_badreq_res("Validation error")); + } + } +} +#pragma clang diagnostic pop \ No newline at end of file diff --git a/backend/src/controllers/auth/auth_2fa.cpp b/backend/src/controllers/auth/auth_2fa.cpp new file mode 100644 index 0000000..a0a5c52 --- /dev/null +++ b/backend/src/controllers/auth/auth_2fa.cpp @@ -0,0 +1,103 @@ +#pragma clang diagnostic push +#pragma ide diagnostic ignored "readability-make-member-function-const" +#pragma ide diagnostic ignored "readability-convert-member-functions-to-static" + +#include +#include +#include +#include + +#include "controllers/controllers.h" +#include "db/db.h" +#include "dto/dto.h" + +std::string create_totp_qrcode(const db::User& user, const std::string& b32_secret) { + const int qrcode_pixel_size = 4; + + std::stringstream code_ss; + code_ss << "otpauth://totp/MFileserver:" + << user.getValueOfName() + << "?secret=" + << b32_secret + << "&issuer=MFileserver"; + auto code = qrcodegen::QrCode::encodeText(code_ss.str().c_str(), qrcodegen::QrCode::Ecc::MEDIUM); + const int mod_count = code.getSize(); + png::image image(mod_count*qrcode_pixel_size, mod_count*qrcode_pixel_size); + for (int x = 0; x < mod_count; x++) for (int y = 0; y < mod_count; y++) { + const bool mod = code.getModule(x, y); + const int x_img_start = x * qrcode_pixel_size, y_img_start = y * qrcode_pixel_size; + for (int x_img = x_img_start; x_img < x_img_start + qrcode_pixel_size; x_img++) for (int y_img = y_img_start; y_img < y_img_start + qrcode_pixel_size; y_img++) + image[x_img][y_img] = mod ? 0 : 0xff; + } + std::stringstream image_ss; + image.write_stream(image_ss); + + std::string image_str = image_ss.str(); + std::vector secret(image_str.data(), image_str.data()+image_str.size()); + + return "data:image/png;base64," + Botan::base64_encode(secret); +} + +namespace api { + void auth::tfa_setup(req_type req, cbk_type cbk) { + db::User user = dto::get_user(req); + Json::Value &json = *req->jsonObject(); + try { + bool mail = dto::json_get(json, "mail").value(); + + auto secret_uchar = rng->random_vec(32); + std::vector secret(secret_uchar.data(), secret_uchar.data()+32); + user.setTfaSecret(secret); + + db::MapperUser user_mapper(drogon::app().getDbClient()); + user_mapper.update(user); + + if (mail) { + send_mail(user); + cbk(dto::Responses::get_success_res()); + } else { + std::string b32_secret = Botan::base32_encode(secret_uchar); + b32_secret.erase(std::remove(b32_secret.begin(), b32_secret.end(), '='), b32_secret.end()); + std::string code = create_totp_qrcode(user, b32_secret); + cbk(dto::Responses::get_tfa_setup_res(b32_secret, code)); + } + } catch (const std::exception&) { + cbk(dto::Responses::get_badreq_res("Validation error")); + } + } + + void auth::tfa_complete(req_type req, cbk_type cbk) { + db::User user = dto::get_user(req); + Json::Value &json = *req->jsonObject(); + try { + bool mail = dto::json_get(json, "mail").value(); + uint32_t code = std::stoi(dto::json_get(json, "code").value()); + + user.setTfaType(mail ? db::tfaTypes::EMAIL : db::tfaTypes::TOTP); + + if (!verify2fa(user, code)) + return cbk(dto::Responses::get_unauth_res("Incorrect 2fa")); + + db::MapperUser user_mapper(drogon::app().getDbClient()); + user_mapper.update(user); + + revoke_all(user); + cbk(dto::Responses::get_success_res()); + } catch (const std::exception&) { + cbk(dto::Responses::get_badreq_res("Validation error")); + } + } + + void auth::tfa_disable(req_type req, cbk_type cbk) { + db::User user = dto::get_user(req); + + db::MapperUser user_mapper(drogon::app().getDbClient()); + user.setTfaType(db::tfaTypes::NONE); + user_mapper.update(user); + + revoke_all(user); + cbk(dto::Responses::get_success_res()); + } +} + +#pragma clang diagnostic pop \ No newline at end of file diff --git a/backend/src/controllers/auth/auth_basic.cpp b/backend/src/controllers/auth/auth_basic.cpp new file mode 100644 index 0000000..1b0cfbb --- /dev/null +++ b/backend/src/controllers/auth/auth_basic.cpp @@ -0,0 +1,135 @@ +#pragma clang diagnostic push +#pragma ide diagnostic ignored "readability-make-member-function-const" +#pragma ide diagnostic ignored "readability-convert-member-functions-to-static" + +#include +#include +#include +#include + +#include "controllers/controllers.h" +#include "db/db.h" +#include "dto/dto.h" + +namespace api { + void auth::login(req_type req, cbk_type cbk) { + Json::Value &json = *req->jsonObject(); + try { + std::string username = dto::json_get(json, "username").value(); + std::string password = dto::json_get(json, "password").value(); + std::optional otp = dto::json_get(json, "otp"); + + auto db = drogon::app().getDbClient(); + + db::MapperUser user_mapper(db); + auto db_users = user_mapper.findBy( + db::Criteria(db::User::Cols::_name, db::CompareOps::EQ, username) && + db::Criteria(db::User::Cols::_gitlab, db::CompareOps::EQ, 0) + ); + if (db_users.empty()) { + cbk(dto::Responses::get_unauth_res("Invalid username or password")); + return; + } + db::User &db_user = db_users.at(0); + if (!Botan::argon2_check_pwhash(password.c_str(), password.size(), db_user.getValueOfPassword())) { + cbk(dto::Responses::get_unauth_res("Invalid username or password")); + return; + } + if (db::User_getEnumRole(db_user) == db::UserRole::DISABLED) { + cbk(dto::Responses::get_unauth_res("Account is disabled")); + return; + } + + const auto tfa = db::User_getEnumTfaType(db_user); + if (tfa != db::tfaTypes::NONE) { + if (!otp.has_value()) { + if (tfa == db::tfaTypes::EMAIL) send_mail(db_user); + return cbk(dto::Responses::get_success_res()); + } + if (!verify2fa(db_user, std::stoi(otp.value()))) + return cbk(dto::Responses::get_unauth_res("Incorrect 2fa")); + } + + cbk(dto::Responses::get_login_res(get_token(db_user))); + } catch (const std::exception&) { + cbk(dto::Responses::get_badreq_res("Validation error")); + } + } + + void auth::signup(req_type req, cbk_type cbk) { + Json::Value &json = *req->jsonObject(); + try { + std::string username = dto::json_get(json, "username").value(); + std::string password = dto::json_get(json, "password").value(); + + db::MapperUser user_mapper(drogon::app().getDbClient()); + + auto existing_users = user_mapper.count( + db::Criteria(db::User::Cols::_name, db::CompareOps::EQ, username) && + db::Criteria(db::User::Cols::_gitlab, db::CompareOps::EQ, 0) + ); + if (existing_users != 0) { + cbk(dto::Responses::get_badreq_res("Username is already taken")); + return; + } + + //std::string hash = Botan::argon2_generate_pwhash(password.c_str(), password.size(), *rng, 1, 256*1024, 2); + std::string hash = Botan::argon2_generate_pwhash(password.c_str(), password.size(), *rng, 1, 16*1024, 1); + + db::User new_user; + new_user.setName(username); + new_user.setPassword(hash); + new_user.setGitlab(0); + new_user.setRole(db::UserRole::DISABLED); + new_user.setRootId(0); + new_user.setTfaType(db::tfaTypes::NONE); + + user_mapper.insert(new_user); + generate_root(new_user); + cbk(dto::Responses::get_success_res()); + } catch (const std::exception& e) { + cbk(dto::Responses::get_badreq_res("Validation error")); + } + } + + void auth::refresh(req_type req, cbk_type cbk) { + db::User user = dto::get_user(req); + db::Token token = dto::get_token(req); + + db::MapperToken token_mapper(drogon::app().getDbClient()); + token_mapper.deleteOne(token); + cbk(dto::Responses::get_login_res( get_token(user))); + } + + void auth::logout_all(req_type req, cbk_type cbk) { + db::User user = dto::get_user(req); + revoke_all(user); + cbk(dto::Responses::get_success_res()); + } + + void auth::change_password(req_type req, cbk_type cbk) { + db::User user = dto::get_user(req); + Json::Value &json = *req->jsonObject(); + try { + std::string old_pw = dto::json_get(json, "oldPassword").value(); + std::string new_pw = dto::json_get(json, "newPassword").value(); + + auto db = drogon::app().getDbClient(); + db::MapperUser user_mapper(db); + + if (!Botan::argon2_check_pwhash(old_pw.c_str(), old_pw.size(), user.getValueOfPassword())) + return cbk(dto::Responses::get_unauth_res("Old password is wrong")); + + std::string hash = Botan::argon2_generate_pwhash(new_pw.c_str(), new_pw.size(), *rng, 1, 256*1024, 2); + + user.setPassword(hash); + user_mapper.update(user); + revoke_all(user); + cbk(dto::Responses::get_success_res()); + } catch (const std::exception&) { + cbk(dto::Responses::get_badreq_res("Validation error")); + } + } +} + +#pragma clang diagnostic pop \ No newline at end of file diff --git a/backend/src/controllers/auth/auth_common.cpp b/backend/src/controllers/auth/auth_common.cpp new file mode 100644 index 0000000..5ce8d73 --- /dev/null +++ b/backend/src/controllers/auth/auth_common.cpp @@ -0,0 +1,110 @@ +#pragma clang diagnostic push +#pragma ide diagnostic ignored "readability-make-member-function-const" +#pragma ide diagnostic ignored "readability-convert-member-functions-to-static" + +#include +#include + +#include +#include +#include + +#if defined(BOTAN_HAS_SYSTEM_RNG) +#include +#else +#include +#endif + +#include +#include +#include + +#include "controllers/controllers.h" +#include "db/db.h" +#include "dto/dto.h" + +size_t payload_source(char* ptr, size_t size, size_t nmemb, void* userp) { + auto* ss = (std::stringstream*)userp; + return ss->readsome(ptr, (long)(size*nmemb)); +} + +namespace api { +#if defined(BOTAN_HAS_SYSTEM_RNG) + std::unique_ptr auth::rng = std::make_unique(); +#else + std::unique_ptr auth::rng = std::make_unique(); +#endif + + bool auth::verify2fa(const db::User& user, uint32_t totp) { + size_t allowed_skew = db::User_getEnumTfaType(user) == db::tfaTypes::TOTP ? 0 : 10; + const auto& totp_secret = (const std::vector&) user.getValueOfTfaSecret(); + return Botan::TOTP(Botan::OctetString(totp_secret)).verify_totp(totp, std::chrono::system_clock::now(), allowed_skew); + } + + void auth::send_mail(const db::User& user) { + std::stringstream ss; + std::time_t t = std::time(nullptr); + const auto& totp_secret = (const std::vector&) user.getValueOfTfaSecret(); + char totp[16]; + std::snprintf(totp, 16, "%06d", Botan::TOTP(Botan::OctetString(totp_secret)).generate_totp(t)); + ss.imbue(std::locale("en_US.utf8")); + ss << "Date: " << std::put_time(std::localtime(&t), "%a, %d %b %Y %T %z") << "\r\n"; + ss << "To: " << user.getValueOfName() << "\r\n"; + ss << "From: fileserver@mattv.de\r\n"; + ss << "Message-ID: " << Botan::UUID(*rng).to_string() << "@mattv.de>\r\n"; + ss << "Subject: Fileserver - EMail 2fa code\r\n"; + ss << "Your code is: " << totp << "\r\n"; + ss << "It is valid for 5 Minutes\r\n"; + + CURL* curl = curl_easy_init(); + curl_easy_setopt(curl, CURLOPT_USERNAME, "no-reply@mattv.de"); + curl_easy_setopt(curl, CURLOPT_PASSWORD, "noreplyLONGPASS123"); + curl_easy_setopt(curl, CURLOPT_URL, "smtp://mail.mattv.de:587"); + curl_easy_setopt(curl, CURLOPT_USE_SSL, (long)CURLUSESSL_ALL); + auto recp = curl_slist_append(nullptr, user.getValueOfName().c_str()); + curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, recp); + curl_easy_setopt(curl, CURLOPT_READFUNCTION, &payload_source); + curl_easy_setopt(curl, CURLOPT_READDATA, &ss); + curl_easy_setopt(curl, CURLOPT_UPLOAD, 1); + curl_easy_perform(curl); + curl_slist_free_all(recp); + curl_easy_cleanup(curl); + } + + std::string auth::get_token(const db::User& user) { + auto db = drogon::app().getDbClient(); + + db::MapperToken token_mapper(db); + const auto iat = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()); + const auto exp = iat + std::chrono::hours{24}; + + db::Token new_token; + new_token.setOwnerId(user.getValueOfId()); + new_token.setExp(exp.count()); + + token_mapper.insert(new_token); + + return jwt::create() + .set_type("JWT") + .set_payload_claim("sub", picojson::value((int64_t)user.getValueOfId())) + .set_payload_claim("jti", picojson::value((int64_t)new_token.getValueOfId())) + .set_issued_at(std::chrono::system_clock::from_time_t(iat.count())) + .set_expires_at(std::chrono::system_clock::from_time_t(exp.count())) + .sign(jwt::algorithm::hs256{jwt_secret}); + } + + void auth::generate_root(db::User& user) { + db::MapperUser user_mapper(drogon::app().getDbClient()); + + auto node = fs::create_node("", user, false, std::nullopt, true); + user.setRootId(std::get(node).getValueOfId()); + user_mapper.update(user); + } + + void auth::revoke_all(const db::User& user) { + db::MapperToken token_mapper(drogon::app().getDbClient()); + token_mapper.deleteBy(db::Criteria(db::Token::Cols::_owner_id, db::CompareOps::EQ, user.getValueOfId())); + } +} + +#pragma clang diagnostic pop diff --git a/backend/src/controllers/auth/auth_gitlab.cpp b/backend/src/controllers/auth/auth_gitlab.cpp new file mode 100644 index 0000000..f5074eb --- /dev/null +++ b/backend/src/controllers/auth/auth_gitlab.cpp @@ -0,0 +1,118 @@ +#pragma clang diagnostic push +#pragma ide diagnostic ignored "performance-unnecessary-value-param" +#pragma ide diagnostic ignored "readability-make-member-function-const" +#pragma ide diagnostic ignored "readability-convert-member-functions-to-static" + +#include + +#include "controllers/controllers.h" +#include "dto/dto.h" + +const std::string GITLAB_ID = "98bcbad78cb1f880d1d1de62291d70a791251a7bea077bfe7df111ef3c115760"; +const std::string GITLAB_SECRET = "7ee01d2b204aff3a05f9d028f004d169b6d381ec873e195f314b3935fa150959"; +const std::string GITLAB_URL = "https://gitlab.mattv.de"; +const std::string GITLAB_API_URL = "https://ssh.gitlab.mattv.de"; + +std::string get_redirect_uri(req_type req) { + auto host_header = req->headers().find("host"); + std::stringstream ss; + ss << (req->isOnSecureConnection() ? "https" : "http") + << "://" + << (host_header != req->headers().end() ? host_header->second : "127.0.0.1:1234") + << "/api/auth/gitlab_callback"; + return drogon::utils::urlEncode(ss.str()); +} + +const drogon::HttpClientPtr& get_gitlab_client() { + static drogon::HttpClientPtr client = drogon::HttpClient::newHttpClient(GITLAB_API_URL, drogon::app().getLoop(), false, false); + return client; +} + + +namespace api { + std::optional auth::get_gitlab_tokens(req_type req, const std::string& code_or_token, bool token) { + std::stringstream ss; + ss << "/oauth/token" + << "?redirect_uri=" << get_redirect_uri(req) + << "&client_id=" << GITLAB_ID + << "&client_secret=" << GITLAB_SECRET + << (token ? "&refresh_token=" : "&code=") << code_or_token + << "&grant_type=" << (token ? "refresh_token" : "authorization_code"); + auto gitlab_req = drogon::HttpRequest::newHttpRequest(); + gitlab_req->setPathEncode(false); + gitlab_req->setPath(ss.str()); + gitlab_req->setMethod(drogon::HttpMethod::Post); + auto res_tuple = get_gitlab_client()->sendRequest(gitlab_req); + auto res = res_tuple.second; + if ((res->statusCode() != drogon::HttpStatusCode::k200OK) && (res->statusCode() != drogon::HttpStatusCode::k201Created)) + return std::nullopt; + auto json = *res->jsonObject(); + return std::make_optional( + json["access_token"].as(), + json["refresh_token"].as() + ); + } + + std::optional auth::get_gitlab_user(const std::string& at) { + auto gitlab_req = drogon::HttpRequest::newHttpRequest(); + gitlab_req->setPath("/api/v4/user"); + gitlab_req->addHeader("Authorization", "Bearer " + at); + gitlab_req->setMethod(drogon::HttpMethod::Get); + auto res_tuple = get_gitlab_client()->sendRequest(gitlab_req); + auto res = res_tuple.second; + if (res->statusCode() != drogon::HttpStatusCode::k200OK) + return std::nullopt; + auto json = *res->jsonObject(); + return std::make_optional( + json["username"].as(), + json.get("is_admin", false).as() + ); + } + + void auth::gitlab(req_type req, cbk_type cbk) { + std::stringstream ss; + ss << GITLAB_URL << "/oauth/authorize" + << "?redirect_uri=" << get_redirect_uri(req) + << "&client_id=" << GITLAB_ID + << "&scope=read_user&response_type=code"; + cbk(drogon::HttpResponse::newRedirectionResponse(ss.str())); + } + + void auth::gitlab_callback(req_type req, cbk_type cbk, std::string code) { + auto tokens = get_gitlab_tokens(req, code, false); + if (!tokens.has_value()) + return cbk(dto::Responses::get_unauth_res("Invalid code")); + auto info = get_gitlab_user(tokens->at); + if (!info.has_value()) + return cbk(dto::Responses::get_unauth_res("Invalid code")); + + db::MapperUser user_mapper(drogon::app().getDbClient()); + auto db_users = user_mapper.findBy( + db::Criteria(db::User::Cols::_name, db::CompareOps::EQ, info->name) && + db::Criteria(db::User::Cols::_gitlab, db::CompareOps::EQ, 1) + ); + + if (db_users.empty()) { + db::User new_user; + new_user.setName(info->name); + new_user.setPassword(""); + new_user.setGitlab(1); + new_user.setRole(info->is_admin ? db::UserRole::ADMIN : db::UserRole::DISABLED); + new_user.setRootId(0); + new_user.setTfaType(db::tfaTypes::NONE); + + user_mapper.insert(new_user); + generate_root(new_user); + db_users.push_back(new_user); + } + db::User& db_user = db_users.at(0); + db_user.setGitlabAt(tokens->at); + db_user.setGitlabRt(tokens->rt); + user_mapper.update(db_user); + + const std::string& token = get_token(db_user); + cbk(drogon::HttpResponse::newRedirectionResponse("/set_token?token="+token)); + } +} + +#pragma clang diagnostic pop \ No newline at end of file diff --git a/backend/src/controllers/controllers.h b/backend/src/controllers/controllers.h new file mode 100644 index 0000000..c9e1ba7 --- /dev/null +++ b/backend/src/controllers/controllers.h @@ -0,0 +1,119 @@ +#ifndef BACKEND_CONTROLLERS_H +#define BACKEND_CONTROLLERS_H +#include +#include +#include +#include +#include + +#include "db/db.h" + +using req_type = const drogon::HttpRequestPtr&; +using cbk_type = std::function&&; + +namespace api { +class admin : public drogon::HttpController { +public: + METHOD_LIST_BEGIN + METHOD_ADD(admin::users, "/users", drogon::Get, "Login", "Admin"); + METHOD_ADD(admin::set_role, "/set_role", drogon::Post, "Login", "Admin"); + METHOD_ADD(admin::logout, "/logout", drogon::Post, "Login", "Admin"); + METHOD_ADD(admin::delete_user, "/delete", drogon::Post, "Login", "Admin"); + METHOD_ADD(admin::disable_2fa, "/disable_2fa", drogon::Post, "Login", "Admin"); + METHOD_LIST_END + + void users(req_type, cbk_type); + void set_role(req_type, cbk_type); + void logout(req_type, cbk_type); + void delete_user(req_type, cbk_type); + void disable_2fa(req_type, cbk_type); +}; + +class auth : public drogon::HttpController { +public: + METHOD_LIST_BEGIN + METHOD_ADD(auth::gitlab, "/gitlab", drogon::Get); + METHOD_ADD(auth::gitlab_callback, "/gitlab_callback?code={}", drogon::Get); + METHOD_ADD(auth::signup, "/signup", drogon::Post); + METHOD_ADD(auth::login, "/login", drogon::Post); + METHOD_ADD(auth::refresh, "/refresh", drogon::Post, "Login"); + METHOD_ADD(auth::tfa_setup, "/2fa/setup", drogon::Post, "Login"); + METHOD_ADD(auth::tfa_complete, "/2fa/complete", drogon::Post, "Login"); + METHOD_ADD(auth::tfa_disable, "/2fa/disable", drogon::Post, "Login"); + METHOD_ADD(auth::change_password, "/change_password", drogon::Post, "Login"); + METHOD_ADD(auth::logout_all, "/logout_all", drogon::Post, "Login"); + METHOD_LIST_END + + struct gitlab_tokens { + gitlab_tokens(std::string at, std::string rt) : at(std::move(at)), rt(std::move(rt)) {} + std::string at, rt; + }; + struct gitlab_user { + gitlab_user(std::string name, bool isAdmin) : name(std::move(name)), is_admin(isAdmin) {} + std::string name; + bool is_admin; + }; + + static std::unique_ptr rng; + + static std::optional get_gitlab_tokens(req_type, const std::string&, bool token); + static std::optional get_gitlab_user(const std::string&); + static bool verify2fa(const db::User&, uint32_t totp); + static void send_mail(const db::User&); + static std::string get_token(const db::User&); + static void generate_root(db::User&); + static void revoke_all(const db::User&); + + void gitlab(req_type, cbk_type); + void gitlab_callback(req_type, cbk_type, std::string code); + void signup(req_type, cbk_type); + void login(req_type, cbk_type); + void refresh(req_type, cbk_type); + void tfa_setup(req_type, cbk_type); + void tfa_complete(req_type, cbk_type); + void tfa_disable(req_type, cbk_type); + void change_password(req_type, cbk_type); + void logout_all(req_type, cbk_type); +}; + +class fs : public drogon::HttpController { +public: + METHOD_LIST_BEGIN + METHOD_ADD(fs::root, "/root", drogon::Get, "Login"); + METHOD_ADD(fs::node, "/node/{}", drogon::Get, "Login"); + METHOD_ADD(fs::path, "/path/{}", drogon::Get, "Login"); + METHOD_ADD(fs::create_node_req, "/createFolder", drogon::Post, "Login"); + METHOD_ADD(fs::create_node_req, "/createFile", drogon::Post, "Login"); + METHOD_ADD(fs::delete_node_req, "/delete/{}", drogon::Post, "Login"); + METHOD_ADD(fs::upload, "/upload/{}", drogon::Post, "Login"); + METHOD_ADD(fs::download, "/download", drogon::Post, "Login"); + METHOD_LIST_END + + static std::optional get_node(uint64_t node); + static std::optional get_node_and_validate(const db::User& user, uint64_t node); + static std::vector get_children(const db::INode& parent); + static std::variant create_node(std::string name, const db::User& owner, bool file, const std::optional &parent, bool force = false); + static void delete_node(db::INode node, bool allow_root = false); + + + void root(req_type, cbk_type); + void node(req_type, cbk_type, uint64_t node); + void path(req_type, cbk_type, uint64_t node); + template void create_node_req(req_type req, cbk_type cbk); + void delete_node_req(req_type, cbk_type, uint64_t node); + void upload(req_type, cbk_type, uint64_t node); + void download(req_type, cbk_type); +}; + +class user : public drogon::HttpController { +public: + METHOD_LIST_BEGIN + METHOD_ADD(user::info, "/info", drogon::Get, "Login"); + METHOD_ADD(user::delete_user, "/delete", drogon::Post, "Login"); + METHOD_LIST_END + + void info(req_type, cbk_type); + void delete_user(req_type, cbk_type); +}; +} +#endif //BACKEND_CONTROLLERS_H diff --git a/backend/src/controllers/fs.cpp b/backend/src/controllers/fs.cpp new file mode 100644 index 0000000..d6f5fb2 --- /dev/null +++ b/backend/src/controllers/fs.cpp @@ -0,0 +1,211 @@ +#pragma clang diagnostic push +#pragma ide diagnostic ignored "performance-unnecessary-value-param" +#pragma ide diagnostic ignored "readability-convert-member-functions-to-static" + +#include +#include "controllers.h" +#include "dto/dto.h" + +char windows_invalid_chars[] = "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F<>:\"/\\|"; + +std::string generate_path(db::INode node) { + db::MapperInode inode_mapper(drogon::app().getDbClient()); + std::stack path; + path.push(node); + while (node.getParentId() != nullptr) { + node = inode_mapper.findByPrimaryKey(node.getValueOfParentId()); + path.push(node); + } + std::stringstream ss; + while (!path.empty()) { + const db::INode& seg = path.top(); + ss << seg.getValueOfName(); + if (seg.getValueOfIsFile() == 0) ss << '/'; + path.pop(); + } + return ss.str(); +} + +namespace api { + std::optional fs::get_node(uint64_t node) { + db::MapperInode inode_mapper(drogon::app().getDbClient()); + try { + return inode_mapper.findByPrimaryKey(node); + } catch (const std::exception&) { + return std::nullopt; + } + } + + std::optional fs::get_node_and_validate(const db::User &user, uint64_t node) { + auto inode = get_node(node); + if (!inode.has_value()) return std::nullopt; + if (inode->getValueOfOwnerId() != user.getValueOfId()) return std::nullopt; + return inode; + } + + std::vector fs::get_children(const db::INode& parent) { + db::MapperInode inode_mapper(drogon::app().getDbClient()); + return inode_mapper.findBy(db::Criteria(db::INode::Cols::_parent_id, db::CompareOps::EQ, parent.getValueOfId())); + } + + std::variant fs::create_node(std::string name, const db::User& owner, bool file, const std::optional &parent, bool force) { + // Stolen from https://github.com/boostorg/filesystem/blob/develop/src/portability.cpp + if (!force) + if (name.empty() || name[0] == ' ' || name.find_first_of(windows_invalid_chars, 0, sizeof(windows_invalid_chars)) != std::string::npos || *(name.end() - 1) == ' ' || *(name.end() - 1) == '.' || name == "." || name == "..") + return {"Invalid name"}; + + db::INode node; + node.setIsFile(file ? 1 : 0); + node.setName(name); + node.setOwnerId(owner.getValueOfId()); + if (parent.has_value()) { + auto parent_node = get_node_and_validate(owner, *parent); + if (!parent_node.has_value()) + return {"Invalid parent"}; + if (parent_node->getValueOfIsFile() != 0) + return {"Can't use file as parent"}; + auto children = get_children(*parent_node); + for (const auto& child : children) + if (child.getValueOfName() == name) + return {"File/Folder already exists"}; + node.setParentId(*parent); + } + db::MapperInode inode_mapper(drogon::app().getDbClient()); + inode_mapper.insert(node); + return {node}; + } + + void fs::delete_node(db::INode node, bool allow_root) { + if (node.getValueOfParentId() == 0 && (!allow_root)) return; + if (node.getValueOfIsFile() == 0) { + auto children = get_children(node); + for (const auto& child : children) delete_node(child, false); + } else { + std::filesystem::path p("./files"); + p /= std::to_string(node.getValueOfId()); + std::filesystem::remove(p); + } + db::MapperInode inode_mapper(drogon::app().getDbClient()); + inode_mapper.deleteOne(node); + } + + void fs::root(req_type req, cbk_type cbk) { + db::User user = dto::get_user(req); + cbk(dto::Responses::get_root_res(user.getValueOfRootId())); + } + + void fs::node(req_type req, cbk_type cbk, uint64_t node) { + db::User user = dto::get_user(req); + auto inode = get_node_and_validate(user, node); + if (!inode.has_value()) + cbk(dto::Responses::get_badreq_res("Unknown node")); + else if (inode->getValueOfIsFile() == 0) { + std::vector children; + for (const db::INode& child : get_children(*inode)) children.push_back(child.getValueOfId()); + cbk(dto::Responses::get_node_folder_res( + inode->getValueOfId(), + inode->getValueOfName(), + inode->getParentId(), + children + )); + } else + cbk(dto::Responses::get_node_file_res( + inode->getValueOfId(), + inode->getValueOfName(), + inode->getParentId(), + inode->getValueOfSize() + )); + } + + void fs::path(req_type req, cbk_type cbk, uint64_t node) { + db::User user = dto::get_user(req); + auto inode = get_node_and_validate(user, node); + if (!inode.has_value()) + cbk(dto::Responses::get_badreq_res("Unknown node")); + else + cbk(dto::Responses::get_path_res( generate_path(*inode))); + } + + template + void fs::create_node_req(req_type req, cbk_type cbk) { + db::User user = dto::get_user(req); + Json::Value& json = *req->jsonObject(); + try { + uint64_t parent = dto::json_get(json, "parent").value(); + std::string name = dto::json_get(json, "name").value(); + + auto new_node = create_node(name, user, file, std::make_optional(parent)); + if (std::holds_alternative(new_node)) + cbk(dto::Responses::get_badreq_res(std::get(new_node))); + else + cbk(dto::Responses::get_new_node_res(std::get(new_node).getValueOfId())); + } catch (const std::exception&) { + cbk(dto::Responses::get_badreq_res("Validation error")); + } + } + + void fs::delete_node_req(req_type req, cbk_type cbk, uint64_t node) { + db::User user = dto::get_user(req); + auto inode = get_node_and_validate(user, node); + if (!inode.has_value()) + cbk(dto::Responses::get_badreq_res("Unknown node")); + else if (inode->getValueOfParentId() == 0) + cbk(dto::Responses::get_badreq_res("Can't delete root")); + else { + delete_node(*inode); + cbk(dto::Responses::get_success_res()); + } + } + + void fs::upload(req_type req, cbk_type cbk, uint64_t node) { + db::User user = dto::get_user(req); + + auto inode = get_node_and_validate(user, node); + if (!inode.has_value()) + return cbk(dto::Responses::get_badreq_res("Unknown node")); + if (inode->getValueOfIsFile() == 0) + return cbk(dto::Responses::get_badreq_res("Can't upload to a directory")); + + drogon::MultiPartParser mpp; + if (mpp.parse(req) != 0) + return cbk(dto::Responses::get_badreq_res("Failed to parse files")); + if (mpp.getFiles().size() != 1) + return cbk(dto::Responses::get_badreq_res("Exactly 1 file needed")); + + const drogon::HttpFile& file = mpp.getFiles().at(0); + + std::filesystem::path p("./files"); + p /= std::to_string(inode->getValueOfId()); + + file.saveAs(p.string()); + + inode->setSize(file.fileLength()); + db::MapperInode inode_mapper(drogon::app().getDbClient()); + inode_mapper.update(*inode); + cbk(dto::Responses::get_success_res()); + } + + void fs::download(req_type req, cbk_type cbk) { + db::User user = dto::get_user(req); + + auto node_id = req->getOptionalParameter("id"); + if (!node_id.has_value()) { + cbk(dto::Responses::get_badreq_res("Invalid node")); + return; + } + auto inode = get_node_and_validate(user, *node_id); + if (!inode.has_value()) { + cbk(dto::Responses::get_badreq_res("Invalid node")); + return; + } + + std::filesystem::path p("./files"); + p /= std::to_string(inode->getValueOfId()); + + cbk(drogon::HttpResponse::newFileResponse( + p.string(), + inode->getValueOfName() + )); + } +} +#pragma clang diagnostic pop \ No newline at end of file diff --git a/backend/src/controllers/user.cpp b/backend/src/controllers/user.cpp new file mode 100644 index 0000000..aab0fb7 --- /dev/null +++ b/backend/src/controllers/user.cpp @@ -0,0 +1,29 @@ +#pragma clang diagnostic push +#pragma ide diagnostic ignored "performance-unnecessary-value-param" +#pragma ide diagnostic ignored "readability-convert-member-functions-to-static" + +#include "controllers.h" +#include "dto/dto.h" + +namespace api { + void user::info(req_type req, cbk_type cbk) { + db::User user = dto::get_user(req); + cbk(dto::Responses::get_user_info_res( + user.getValueOfName(), + user.getValueOfGitlab() != 0, + db::User_getEnumTfaType(user) != db::tfaTypes::NONE) + ); + } + + void user::delete_user(req_type req, cbk_type cbk) { + db::MapperUser user_mapper(drogon::app().getDbClient()); + + db::User user = dto::get_user(req); + auth::revoke_all(user); + fs::delete_node((fs::get_node(user.getValueOfRootId())).value(), true); + user_mapper.deleteOne(user); + + cbk(dto::Responses::get_success_res()); + } +} +#pragma clang diagnostic pop \ No newline at end of file diff --git a/backend/src/db/db.cpp b/backend/src/db/db.cpp new file mode 100644 index 0000000..88cf967 --- /dev/null +++ b/backend/src/db/db.cpp @@ -0,0 +1,11 @@ +#include "db.h" + +namespace db { + UserRole User_getEnumRole(const User& user) noexcept { + return (UserRole)user.getValueOfRole(); + } + + tfaTypes User_getEnumTfaType(const User& user) noexcept { + return (tfaTypes)user.getValueOfTfaType(); + } +} diff --git a/backend/src/db/db.h b/backend/src/db/db.h new file mode 100644 index 0000000..f72e684 --- /dev/null +++ b/backend/src/db/db.h @@ -0,0 +1,43 @@ +#ifndef BACKEND_DB_H +#define BACKEND_DB_H + +#include + +#include +#include + +#include "model/Inode.h" +#include "model/Tokens.h" +#include "model/User.h" + +const std::string jwt_secret = "CUM"; + +namespace db { + enum UserRole : int { + ADMIN = 2, + USER = 1, + DISABLED = 0 + }; + + enum tfaTypes : int { + NONE = 0, + EMAIL = 1, + TOTP = 2 + }; + + using INode = drogon_model::sqlite3::Inode; + using Token = drogon_model::sqlite3::Tokens; + using User = drogon_model::sqlite3::User; + + using MapperInode = drogon::orm::Mapper; + using MapperToken = drogon::orm::Mapper; + using MapperUser = drogon::orm::Mapper; + + using Criteria = drogon::orm::Criteria; + using CompareOps = drogon::orm::CompareOperator; + + UserRole User_getEnumRole(const User&) noexcept; + tfaTypes User_getEnumTfaType(const User&) noexcept; +} + +#endif //BACKEND_DB_H diff --git a/backend/src/db/model/Inode.cc b/backend/src/db/model/Inode.cc new file mode 100644 index 0000000..01d839e --- /dev/null +++ b/backend/src/db/model/Inode.cc @@ -0,0 +1,1095 @@ +/** + * + * Inode.cc + * DO NOT EDIT. This file is generated by drogon_ctl + * + */ + +#include "Inode.h" +#include +#include + +using namespace drogon; +using namespace drogon::orm; +using namespace drogon_model::sqlite3; + +const std::string Inode::Cols::_id = "id"; +const std::string Inode::Cols::_is_file = "is_file"; +const std::string Inode::Cols::_name = "name"; +const std::string Inode::Cols::_parent_id = "parent_id"; +const std::string Inode::Cols::_owner_id = "owner_id"; +const std::string Inode::Cols::_size = "size"; +const std::string Inode::primaryKeyName = "id"; +const bool Inode::hasPrimaryKey = true; +const std::string Inode::tableName = "inode"; + +const std::vector Inode::metaData_={ +{"id","uint64_t","integer",8,1,1,1}, +{"is_file","uint64_t","integer",8,0,0,1}, +{"name","std::string","text",0,0,0,0}, +{"parent_id","uint64_t","integer",8,0,0,0}, +{"owner_id","uint64_t","integer",8,0,0,1}, +{"size","uint64_t","integer",8,0,0,0} +}; +const std::string &Inode::getColumnName(size_t index) noexcept(false) +{ + assert(index < metaData_.size()); + return metaData_[index].colName_; +} +Inode::Inode(const Row &r, const ssize_t indexOffset) noexcept +{ + if(indexOffset < 0) + { + if(!r["id"].isNull()) + { + id_=std::make_shared(r["id"].as()); + } + if(!r["is_file"].isNull()) + { + isFile_=std::make_shared(r["is_file"].as()); + } + if(!r["name"].isNull()) + { + name_=std::make_shared(r["name"].as()); + } + if(!r["parent_id"].isNull()) + { + parentId_=std::make_shared(r["parent_id"].as()); + } + if(!r["owner_id"].isNull()) + { + ownerId_=std::make_shared(r["owner_id"].as()); + } + if(!r["size"].isNull()) + { + size_=std::make_shared(r["size"].as()); + } + } + else + { + size_t offset = (size_t)indexOffset; + if(offset + 6 > r.size()) + { + LOG_FATAL << "Invalid SQL result for this model"; + return; + } + size_t index; + index = offset + 0; + if(!r[index].isNull()) + { + id_=std::make_shared(r[index].as()); + } + index = offset + 1; + if(!r[index].isNull()) + { + isFile_=std::make_shared(r[index].as()); + } + index = offset + 2; + if(!r[index].isNull()) + { + name_=std::make_shared(r[index].as()); + } + index = offset + 3; + if(!r[index].isNull()) + { + parentId_=std::make_shared(r[index].as()); + } + index = offset + 4; + if(!r[index].isNull()) + { + ownerId_=std::make_shared(r[index].as()); + } + index = offset + 5; + if(!r[index].isNull()) + { + size_=std::make_shared(r[index].as()); + } + } + +} + +Inode::Inode(const Json::Value &pJson, const std::vector &pMasqueradingVector) noexcept(false) +{ + if(pMasqueradingVector.size() != 6) + { + LOG_ERROR << "Bad masquerading vector"; + return; + } + if(!pMasqueradingVector[0].empty() && pJson.isMember(pMasqueradingVector[0])) + { + dirtyFlag_[0] = true; + if(!pJson[pMasqueradingVector[0]].isNull()) + { + id_=std::make_shared((uint64_t)pJson[pMasqueradingVector[0]].asUInt64()); + } + } + if(!pMasqueradingVector[1].empty() && pJson.isMember(pMasqueradingVector[1])) + { + dirtyFlag_[1] = true; + if(!pJson[pMasqueradingVector[1]].isNull()) + { + isFile_=std::make_shared((uint64_t)pJson[pMasqueradingVector[1]].asUInt64()); + } + } + if(!pMasqueradingVector[2].empty() && pJson.isMember(pMasqueradingVector[2])) + { + dirtyFlag_[2] = true; + if(!pJson[pMasqueradingVector[2]].isNull()) + { + name_=std::make_shared(pJson[pMasqueradingVector[2]].asString()); + } + } + if(!pMasqueradingVector[3].empty() && pJson.isMember(pMasqueradingVector[3])) + { + dirtyFlag_[3] = true; + if(!pJson[pMasqueradingVector[3]].isNull()) + { + parentId_=std::make_shared((uint64_t)pJson[pMasqueradingVector[3]].asUInt64()); + } + } + if(!pMasqueradingVector[4].empty() && pJson.isMember(pMasqueradingVector[4])) + { + dirtyFlag_[4] = true; + if(!pJson[pMasqueradingVector[4]].isNull()) + { + ownerId_=std::make_shared((uint64_t)pJson[pMasqueradingVector[4]].asUInt64()); + } + } + if(!pMasqueradingVector[5].empty() && pJson.isMember(pMasqueradingVector[5])) + { + dirtyFlag_[5] = true; + if(!pJson[pMasqueradingVector[5]].isNull()) + { + size_=std::make_shared((uint64_t)pJson[pMasqueradingVector[5]].asUInt64()); + } + } +} + +Inode::Inode(const Json::Value &pJson) noexcept(false) +{ + if(pJson.isMember("id")) + { + dirtyFlag_[0]=true; + if(!pJson["id"].isNull()) + { + id_=std::make_shared((uint64_t)pJson["id"].asUInt64()); + } + } + if(pJson.isMember("is_file")) + { + dirtyFlag_[1]=true; + if(!pJson["is_file"].isNull()) + { + isFile_=std::make_shared((uint64_t)pJson["is_file"].asUInt64()); + } + } + if(pJson.isMember("name")) + { + dirtyFlag_[2]=true; + if(!pJson["name"].isNull()) + { + name_=std::make_shared(pJson["name"].asString()); + } + } + if(pJson.isMember("parent_id")) + { + dirtyFlag_[3]=true; + if(!pJson["parent_id"].isNull()) + { + parentId_=std::make_shared((uint64_t)pJson["parent_id"].asUInt64()); + } + } + if(pJson.isMember("owner_id")) + { + dirtyFlag_[4]=true; + if(!pJson["owner_id"].isNull()) + { + ownerId_=std::make_shared((uint64_t)pJson["owner_id"].asUInt64()); + } + } + if(pJson.isMember("size")) + { + dirtyFlag_[5]=true; + if(!pJson["size"].isNull()) + { + size_=std::make_shared((uint64_t)pJson["size"].asUInt64()); + } + } +} + +void Inode::updateByMasqueradedJson(const Json::Value &pJson, + const std::vector &pMasqueradingVector) noexcept(false) +{ + if(pMasqueradingVector.size() != 6) + { + LOG_ERROR << "Bad masquerading vector"; + return; + } + if(!pMasqueradingVector[0].empty() && pJson.isMember(pMasqueradingVector[0])) + { + if(!pJson[pMasqueradingVector[0]].isNull()) + { + id_=std::make_shared((uint64_t)pJson[pMasqueradingVector[0]].asUInt64()); + } + } + if(!pMasqueradingVector[1].empty() && pJson.isMember(pMasqueradingVector[1])) + { + dirtyFlag_[1] = true; + if(!pJson[pMasqueradingVector[1]].isNull()) + { + isFile_=std::make_shared((uint64_t)pJson[pMasqueradingVector[1]].asUInt64()); + } + } + if(!pMasqueradingVector[2].empty() && pJson.isMember(pMasqueradingVector[2])) + { + dirtyFlag_[2] = true; + if(!pJson[pMasqueradingVector[2]].isNull()) + { + name_=std::make_shared(pJson[pMasqueradingVector[2]].asString()); + } + } + if(!pMasqueradingVector[3].empty() && pJson.isMember(pMasqueradingVector[3])) + { + dirtyFlag_[3] = true; + if(!pJson[pMasqueradingVector[3]].isNull()) + { + parentId_=std::make_shared((uint64_t)pJson[pMasqueradingVector[3]].asUInt64()); + } + } + if(!pMasqueradingVector[4].empty() && pJson.isMember(pMasqueradingVector[4])) + { + dirtyFlag_[4] = true; + if(!pJson[pMasqueradingVector[4]].isNull()) + { + ownerId_=std::make_shared((uint64_t)pJson[pMasqueradingVector[4]].asUInt64()); + } + } + if(!pMasqueradingVector[5].empty() && pJson.isMember(pMasqueradingVector[5])) + { + dirtyFlag_[5] = true; + if(!pJson[pMasqueradingVector[5]].isNull()) + { + size_=std::make_shared((uint64_t)pJson[pMasqueradingVector[5]].asUInt64()); + } + } +} + +void Inode::updateByJson(const Json::Value &pJson) noexcept(false) +{ + if(pJson.isMember("id")) + { + if(!pJson["id"].isNull()) + { + id_=std::make_shared((uint64_t)pJson["id"].asUInt64()); + } + } + if(pJson.isMember("is_file")) + { + dirtyFlag_[1] = true; + if(!pJson["is_file"].isNull()) + { + isFile_=std::make_shared((uint64_t)pJson["is_file"].asUInt64()); + } + } + if(pJson.isMember("name")) + { + dirtyFlag_[2] = true; + if(!pJson["name"].isNull()) + { + name_=std::make_shared(pJson["name"].asString()); + } + } + if(pJson.isMember("parent_id")) + { + dirtyFlag_[3] = true; + if(!pJson["parent_id"].isNull()) + { + parentId_=std::make_shared((uint64_t)pJson["parent_id"].asUInt64()); + } + } + if(pJson.isMember("owner_id")) + { + dirtyFlag_[4] = true; + if(!pJson["owner_id"].isNull()) + { + ownerId_=std::make_shared((uint64_t)pJson["owner_id"].asUInt64()); + } + } + if(pJson.isMember("size")) + { + dirtyFlag_[5] = true; + if(!pJson["size"].isNull()) + { + size_=std::make_shared((uint64_t)pJson["size"].asUInt64()); + } + } +} + +const uint64_t &Inode::getValueOfId() const noexcept +{ + const static uint64_t defaultValue = uint64_t(); + if(id_) + return *id_; + return defaultValue; +} +const std::shared_ptr &Inode::getId() const noexcept +{ + return id_; +} +void Inode::setId(const uint64_t &pId) noexcept +{ + id_ = std::make_shared(pId); + dirtyFlag_[0] = true; +} +const typename Inode::PrimaryKeyType & Inode::getPrimaryKey() const +{ + assert(id_); + return *id_; +} + +const uint64_t &Inode::getValueOfIsFile() const noexcept +{ + const static uint64_t defaultValue = uint64_t(); + if(isFile_) + return *isFile_; + return defaultValue; +} +const std::shared_ptr &Inode::getIsFile() const noexcept +{ + return isFile_; +} +void Inode::setIsFile(const uint64_t &pIsFile) noexcept +{ + isFile_ = std::make_shared(pIsFile); + dirtyFlag_[1] = true; +} + +const std::string &Inode::getValueOfName() const noexcept +{ + const static std::string defaultValue = std::string(); + if(name_) + return *name_; + return defaultValue; +} +const std::shared_ptr &Inode::getName() const noexcept +{ + return name_; +} +void Inode::setName(const std::string &pName) noexcept +{ + name_ = std::make_shared(pName); + dirtyFlag_[2] = true; +} +void Inode::setName(std::string &&pName) noexcept +{ + name_ = std::make_shared(std::move(pName)); + dirtyFlag_[2] = true; +} +void Inode::setNameToNull() noexcept +{ + name_.reset(); + dirtyFlag_[2] = true; +} + +const uint64_t &Inode::getValueOfParentId() const noexcept +{ + const static uint64_t defaultValue = uint64_t(); + if(parentId_) + return *parentId_; + return defaultValue; +} +const std::shared_ptr &Inode::getParentId() const noexcept +{ + return parentId_; +} +void Inode::setParentId(const uint64_t &pParentId) noexcept +{ + parentId_ = std::make_shared(pParentId); + dirtyFlag_[3] = true; +} +void Inode::setParentIdToNull() noexcept +{ + parentId_.reset(); + dirtyFlag_[3] = true; +} + +const uint64_t &Inode::getValueOfOwnerId() const noexcept +{ + const static uint64_t defaultValue = uint64_t(); + if(ownerId_) + return *ownerId_; + return defaultValue; +} +const std::shared_ptr &Inode::getOwnerId() const noexcept +{ + return ownerId_; +} +void Inode::setOwnerId(const uint64_t &pOwnerId) noexcept +{ + ownerId_ = std::make_shared(pOwnerId); + dirtyFlag_[4] = true; +} + +const uint64_t &Inode::getValueOfSize() const noexcept +{ + const static uint64_t defaultValue = uint64_t(); + if(size_) + return *size_; + return defaultValue; +} +const std::shared_ptr &Inode::getSize() const noexcept +{ + return size_; +} +void Inode::setSize(const uint64_t &pSize) noexcept +{ + size_ = std::make_shared(pSize); + dirtyFlag_[5] = true; +} +void Inode::setSizeToNull() noexcept +{ + size_.reset(); + dirtyFlag_[5] = true; +} + +void Inode::updateId(const uint64_t id) +{ + id_ = std::make_shared(id); +} + +const std::vector &Inode::insertColumns() noexcept +{ + static const std::vector inCols={ + "is_file", + "name", + "parent_id", + "owner_id", + "size" + }; + return inCols; +} + +void Inode::outputArgs(drogon::orm::internal::SqlBinder &binder) const +{ + if(dirtyFlag_[1]) + { + if(getIsFile()) + { + binder << getValueOfIsFile(); + } + else + { + binder << nullptr; + } + } + if(dirtyFlag_[2]) + { + if(getName()) + { + binder << getValueOfName(); + } + else + { + binder << nullptr; + } + } + if(dirtyFlag_[3]) + { + if(getParentId()) + { + binder << getValueOfParentId(); + } + else + { + binder << nullptr; + } + } + if(dirtyFlag_[4]) + { + if(getOwnerId()) + { + binder << getValueOfOwnerId(); + } + else + { + binder << nullptr; + } + } + if(dirtyFlag_[5]) + { + if(getSize()) + { + binder << getValueOfSize(); + } + else + { + binder << nullptr; + } + } +} + +const std::vector Inode::updateColumns() const +{ + std::vector ret; + if(dirtyFlag_[1]) + { + ret.push_back(getColumnName(1)); + } + if(dirtyFlag_[2]) + { + ret.push_back(getColumnName(2)); + } + if(dirtyFlag_[3]) + { + ret.push_back(getColumnName(3)); + } + if(dirtyFlag_[4]) + { + ret.push_back(getColumnName(4)); + } + if(dirtyFlag_[5]) + { + ret.push_back(getColumnName(5)); + } + return ret; +} + +void Inode::updateArgs(drogon::orm::internal::SqlBinder &binder) const +{ + if(dirtyFlag_[1]) + { + if(getIsFile()) + { + binder << getValueOfIsFile(); + } + else + { + binder << nullptr; + } + } + if(dirtyFlag_[2]) + { + if(getName()) + { + binder << getValueOfName(); + } + else + { + binder << nullptr; + } + } + if(dirtyFlag_[3]) + { + if(getParentId()) + { + binder << getValueOfParentId(); + } + else + { + binder << nullptr; + } + } + if(dirtyFlag_[4]) + { + if(getOwnerId()) + { + binder << getValueOfOwnerId(); + } + else + { + binder << nullptr; + } + } + if(dirtyFlag_[5]) + { + if(getSize()) + { + binder << getValueOfSize(); + } + else + { + binder << nullptr; + } + } +} +Json::Value Inode::toJson() const +{ + Json::Value ret; + if(getId()) + { + ret["id"]=(Json::UInt64)getValueOfId(); + } + else + { + ret["id"]=Json::Value(); + } + if(getIsFile()) + { + ret["is_file"]=(Json::UInt64)getValueOfIsFile(); + } + else + { + ret["is_file"]=Json::Value(); + } + if(getName()) + { + ret["name"]=getValueOfName(); + } + else + { + ret["name"]=Json::Value(); + } + if(getParentId()) + { + ret["parent_id"]=(Json::UInt64)getValueOfParentId(); + } + else + { + ret["parent_id"]=Json::Value(); + } + if(getOwnerId()) + { + ret["owner_id"]=(Json::UInt64)getValueOfOwnerId(); + } + else + { + ret["owner_id"]=Json::Value(); + } + if(getSize()) + { + ret["size"]=(Json::UInt64)getValueOfSize(); + } + else + { + ret["size"]=Json::Value(); + } + return ret; +} + +Json::Value Inode::toMasqueradedJson( + const std::vector &pMasqueradingVector) const +{ + Json::Value ret; + if(pMasqueradingVector.size() == 6) + { + if(!pMasqueradingVector[0].empty()) + { + if(getId()) + { + ret[pMasqueradingVector[0]]=(Json::UInt64)getValueOfId(); + } + else + { + ret[pMasqueradingVector[0]]=Json::Value(); + } + } + if(!pMasqueradingVector[1].empty()) + { + if(getIsFile()) + { + ret[pMasqueradingVector[1]]=(Json::UInt64)getValueOfIsFile(); + } + else + { + ret[pMasqueradingVector[1]]=Json::Value(); + } + } + if(!pMasqueradingVector[2].empty()) + { + if(getName()) + { + ret[pMasqueradingVector[2]]=getValueOfName(); + } + else + { + ret[pMasqueradingVector[2]]=Json::Value(); + } + } + if(!pMasqueradingVector[3].empty()) + { + if(getParentId()) + { + ret[pMasqueradingVector[3]]=(Json::UInt64)getValueOfParentId(); + } + else + { + ret[pMasqueradingVector[3]]=Json::Value(); + } + } + if(!pMasqueradingVector[4].empty()) + { + if(getOwnerId()) + { + ret[pMasqueradingVector[4]]=(Json::UInt64)getValueOfOwnerId(); + } + else + { + ret[pMasqueradingVector[4]]=Json::Value(); + } + } + if(!pMasqueradingVector[5].empty()) + { + if(getSize()) + { + ret[pMasqueradingVector[5]]=(Json::UInt64)getValueOfSize(); + } + else + { + ret[pMasqueradingVector[5]]=Json::Value(); + } + } + return ret; + } + LOG_ERROR << "Masquerade failed"; + if(getId()) + { + ret["id"]=(Json::UInt64)getValueOfId(); + } + else + { + ret["id"]=Json::Value(); + } + if(getIsFile()) + { + ret["is_file"]=(Json::UInt64)getValueOfIsFile(); + } + else + { + ret["is_file"]=Json::Value(); + } + if(getName()) + { + ret["name"]=getValueOfName(); + } + else + { + ret["name"]=Json::Value(); + } + if(getParentId()) + { + ret["parent_id"]=(Json::UInt64)getValueOfParentId(); + } + else + { + ret["parent_id"]=Json::Value(); + } + if(getOwnerId()) + { + ret["owner_id"]=(Json::UInt64)getValueOfOwnerId(); + } + else + { + ret["owner_id"]=Json::Value(); + } + if(getSize()) + { + ret["size"]=(Json::UInt64)getValueOfSize(); + } + else + { + ret["size"]=Json::Value(); + } + return ret; +} + +bool Inode::validateJsonForCreation(const Json::Value &pJson, std::string &err) +{ + if(pJson.isMember("id")) + { + if(!validJsonOfField(0, "id", pJson["id"], err, true)) + return false; + } + if(pJson.isMember("is_file")) + { + if(!validJsonOfField(1, "is_file", pJson["is_file"], err, true)) + return false; + } + else + { + err="The is_file column cannot be null"; + return false; + } + if(pJson.isMember("name")) + { + if(!validJsonOfField(2, "name", pJson["name"], err, true)) + return false; + } + if(pJson.isMember("parent_id")) + { + if(!validJsonOfField(3, "parent_id", pJson["parent_id"], err, true)) + return false; + } + if(pJson.isMember("owner_id")) + { + if(!validJsonOfField(4, "owner_id", pJson["owner_id"], err, true)) + return false; + } + else + { + err="The owner_id column cannot be null"; + return false; + } + if(pJson.isMember("size")) + { + if(!validJsonOfField(5, "size", pJson["size"], err, true)) + return false; + } + return true; +} +bool Inode::validateMasqueradedJsonForCreation(const Json::Value &pJson, + const std::vector &pMasqueradingVector, + std::string &err) +{ + if(pMasqueradingVector.size() != 6) + { + err = "Bad masquerading vector"; + return false; + } + try { + if(!pMasqueradingVector[0].empty()) + { + if(pJson.isMember(pMasqueradingVector[0])) + { + if(!validJsonOfField(0, pMasqueradingVector[0], pJson[pMasqueradingVector[0]], err, true)) + return false; + } + } + if(!pMasqueradingVector[1].empty()) + { + if(pJson.isMember(pMasqueradingVector[1])) + { + if(!validJsonOfField(1, pMasqueradingVector[1], pJson[pMasqueradingVector[1]], err, true)) + return false; + } + else + { + err="The " + pMasqueradingVector[1] + " column cannot be null"; + return false; + } + } + if(!pMasqueradingVector[2].empty()) + { + if(pJson.isMember(pMasqueradingVector[2])) + { + if(!validJsonOfField(2, pMasqueradingVector[2], pJson[pMasqueradingVector[2]], err, true)) + return false; + } + } + if(!pMasqueradingVector[3].empty()) + { + if(pJson.isMember(pMasqueradingVector[3])) + { + if(!validJsonOfField(3, pMasqueradingVector[3], pJson[pMasqueradingVector[3]], err, true)) + return false; + } + } + if(!pMasqueradingVector[4].empty()) + { + if(pJson.isMember(pMasqueradingVector[4])) + { + if(!validJsonOfField(4, pMasqueradingVector[4], pJson[pMasqueradingVector[4]], err, true)) + return false; + } + else + { + err="The " + pMasqueradingVector[4] + " column cannot be null"; + return false; + } + } + if(!pMasqueradingVector[5].empty()) + { + if(pJson.isMember(pMasqueradingVector[5])) + { + if(!validJsonOfField(5, pMasqueradingVector[5], pJson[pMasqueradingVector[5]], err, true)) + return false; + } + } + } + catch(const Json::LogicError &e) + { + err = e.what(); + return false; + } + return true; +} +bool Inode::validateJsonForUpdate(const Json::Value &pJson, std::string &err) +{ + if(pJson.isMember("id")) + { + if(!validJsonOfField(0, "id", pJson["id"], err, false)) + return false; + } + else + { + err = "The value of primary key must be set in the json object for update"; + return false; + } + if(pJson.isMember("is_file")) + { + if(!validJsonOfField(1, "is_file", pJson["is_file"], err, false)) + return false; + } + if(pJson.isMember("name")) + { + if(!validJsonOfField(2, "name", pJson["name"], err, false)) + return false; + } + if(pJson.isMember("parent_id")) + { + if(!validJsonOfField(3, "parent_id", pJson["parent_id"], err, false)) + return false; + } + if(pJson.isMember("owner_id")) + { + if(!validJsonOfField(4, "owner_id", pJson["owner_id"], err, false)) + return false; + } + if(pJson.isMember("size")) + { + if(!validJsonOfField(5, "size", pJson["size"], err, false)) + return false; + } + return true; +} +bool Inode::validateMasqueradedJsonForUpdate(const Json::Value &pJson, + const std::vector &pMasqueradingVector, + std::string &err) +{ + if(pMasqueradingVector.size() != 6) + { + err = "Bad masquerading vector"; + return false; + } + try { + if(!pMasqueradingVector[0].empty() && pJson.isMember(pMasqueradingVector[0])) + { + if(!validJsonOfField(0, pMasqueradingVector[0], pJson[pMasqueradingVector[0]], err, false)) + return false; + } + else + { + err = "The value of primary key must be set in the json object for update"; + return false; + } + if(!pMasqueradingVector[1].empty() && pJson.isMember(pMasqueradingVector[1])) + { + if(!validJsonOfField(1, pMasqueradingVector[1], pJson[pMasqueradingVector[1]], err, false)) + return false; + } + if(!pMasqueradingVector[2].empty() && pJson.isMember(pMasqueradingVector[2])) + { + if(!validJsonOfField(2, pMasqueradingVector[2], pJson[pMasqueradingVector[2]], err, false)) + return false; + } + if(!pMasqueradingVector[3].empty() && pJson.isMember(pMasqueradingVector[3])) + { + if(!validJsonOfField(3, pMasqueradingVector[3], pJson[pMasqueradingVector[3]], err, false)) + return false; + } + if(!pMasqueradingVector[4].empty() && pJson.isMember(pMasqueradingVector[4])) + { + if(!validJsonOfField(4, pMasqueradingVector[4], pJson[pMasqueradingVector[4]], err, false)) + return false; + } + if(!pMasqueradingVector[5].empty() && pJson.isMember(pMasqueradingVector[5])) + { + if(!validJsonOfField(5, pMasqueradingVector[5], pJson[pMasqueradingVector[5]], err, false)) + return false; + } + } + catch(const Json::LogicError &e) + { + err = e.what(); + return false; + } + return true; +} +bool Inode::validJsonOfField(size_t index, + const std::string &fieldName, + const Json::Value &pJson, + std::string &err, + bool isForCreation) +{ + switch(index) + { + case 0: + if(pJson.isNull()) + { + err="The " + fieldName + " column cannot be null"; + return false; + } + if(isForCreation) + { + err="The automatic primary key cannot be set"; + return false; + } + if(!pJson.isUInt64()) + { + err="Type error in the "+fieldName+" field"; + return false; + } + break; + case 1: + if(pJson.isNull()) + { + err="The " + fieldName + " column cannot be null"; + return false; + } + if(!pJson.isUInt64()) + { + err="Type error in the "+fieldName+" field"; + return false; + } + break; + case 2: + if(pJson.isNull()) + { + return true; + } + if(!pJson.isString()) + { + err="Type error in the "+fieldName+" field"; + return false; + } + break; + case 3: + if(pJson.isNull()) + { + return true; + } + if(!pJson.isUInt64()) + { + err="Type error in the "+fieldName+" field"; + return false; + } + break; + case 4: + if(pJson.isNull()) + { + err="The " + fieldName + " column cannot be null"; + return false; + } + if(!pJson.isUInt64()) + { + err="Type error in the "+fieldName+" field"; + return false; + } + break; + case 5: + if(pJson.isNull()) + { + return true; + } + if(!pJson.isUInt64()) + { + err="Type error in the "+fieldName+" field"; + return false; + } + break; + default: + err="Internal error in the server"; + return false; + break; + } + return true; +} diff --git a/backend/src/db/model/Inode.h b/backend/src/db/model/Inode.h new file mode 100644 index 0000000..2f59e33 --- /dev/null +++ b/backend/src/db/model/Inode.h @@ -0,0 +1,275 @@ +/** + * + * Inode.h + * DO NOT EDIT. This file is generated by drogon_ctl + * + */ + +#pragma once +#include +#include +#include +#include +#include +#ifdef __cpp_impl_coroutine +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace drogon +{ +namespace orm +{ +class DbClient; +using DbClientPtr = std::shared_ptr; +} +} +namespace drogon_model +{ +namespace sqlite3 +{ + +class Inode +{ + public: + struct Cols + { + static const std::string _id; + static const std::string _is_file; + static const std::string _name; + static const std::string _parent_id; + static const std::string _owner_id; + static const std::string _size; + }; + + const static int primaryKeyNumber; + const static std::string tableName; + const static bool hasPrimaryKey; + const static std::string primaryKeyName; + using PrimaryKeyType = uint64_t; + const PrimaryKeyType &getPrimaryKey() const; + + /** + * @brief constructor + * @param r One row of records in the SQL query result. + * @param indexOffset Set the offset to -1 to access all columns by column names, + * otherwise access all columns by offsets. + * @note If the SQL is not a style of 'select * from table_name ...' (select all + * columns by an asterisk), please set the offset to -1. + */ + explicit Inode(const drogon::orm::Row &r, const ssize_t indexOffset = 0) noexcept; + + /** + * @brief constructor + * @param pJson The json object to construct a new instance. + */ + explicit Inode(const Json::Value &pJson) noexcept(false); + + /** + * @brief constructor + * @param pJson The json object to construct a new instance. + * @param pMasqueradingVector The aliases of table columns. + */ + Inode(const Json::Value &pJson, const std::vector &pMasqueradingVector) noexcept(false); + + Inode() = default; + + void updateByJson(const Json::Value &pJson) noexcept(false); + void updateByMasqueradedJson(const Json::Value &pJson, + const std::vector &pMasqueradingVector) noexcept(false); + static bool validateJsonForCreation(const Json::Value &pJson, std::string &err); + static bool validateMasqueradedJsonForCreation(const Json::Value &, + const std::vector &pMasqueradingVector, + std::string &err); + static bool validateJsonForUpdate(const Json::Value &pJson, std::string &err); + static bool validateMasqueradedJsonForUpdate(const Json::Value &, + const std::vector &pMasqueradingVector, + std::string &err); + static bool validJsonOfField(size_t index, + const std::string &fieldName, + const Json::Value &pJson, + std::string &err, + bool isForCreation); + + /** For column id */ + ///Get the value of the column id, returns the default value if the column is null + const uint64_t &getValueOfId() const noexcept; + ///Return a shared_ptr object pointing to the column const value, or an empty shared_ptr object if the column is null + const std::shared_ptr &getId() const noexcept; + ///Set the value of the column id + void setId(const uint64_t &pId) noexcept; + + /** For column is_file */ + ///Get the value of the column is_file, returns the default value if the column is null + const uint64_t &getValueOfIsFile() const noexcept; + ///Return a shared_ptr object pointing to the column const value, or an empty shared_ptr object if the column is null + const std::shared_ptr &getIsFile() const noexcept; + ///Set the value of the column is_file + void setIsFile(const uint64_t &pIsFile) noexcept; + + /** For column name */ + ///Get the value of the column name, returns the default value if the column is null + const std::string &getValueOfName() const noexcept; + ///Return a shared_ptr object pointing to the column const value, or an empty shared_ptr object if the column is null + const std::shared_ptr &getName() const noexcept; + ///Set the value of the column name + void setName(const std::string &pName) noexcept; + void setName(std::string &&pName) noexcept; + void setNameToNull() noexcept; + + /** For column parent_id */ + ///Get the value of the column parent_id, returns the default value if the column is null + const uint64_t &getValueOfParentId() const noexcept; + ///Return a shared_ptr object pointing to the column const value, or an empty shared_ptr object if the column is null + const std::shared_ptr &getParentId() const noexcept; + ///Set the value of the column parent_id + void setParentId(const uint64_t &pParentId) noexcept; + void setParentIdToNull() noexcept; + + /** For column owner_id */ + ///Get the value of the column owner_id, returns the default value if the column is null + const uint64_t &getValueOfOwnerId() const noexcept; + ///Return a shared_ptr object pointing to the column const value, or an empty shared_ptr object if the column is null + const std::shared_ptr &getOwnerId() const noexcept; + ///Set the value of the column owner_id + void setOwnerId(const uint64_t &pOwnerId) noexcept; + + /** For column size */ + ///Get the value of the column size, returns the default value if the column is null + const uint64_t &getValueOfSize() const noexcept; + ///Return a shared_ptr object pointing to the column const value, or an empty shared_ptr object if the column is null + const std::shared_ptr &getSize() const noexcept; + ///Set the value of the column size + void setSize(const uint64_t &pSize) noexcept; + void setSizeToNull() noexcept; + + + static size_t getColumnNumber() noexcept { return 6; } + static const std::string &getColumnName(size_t index) noexcept(false); + + Json::Value toJson() const; + Json::Value toMasqueradedJson(const std::vector &pMasqueradingVector) const; + /// Relationship interfaces + private: + friend drogon::orm::Mapper; +#ifdef __cpp_impl_coroutine + friend drogon::orm::CoroMapper; +#endif + static const std::vector &insertColumns() noexcept; + void outputArgs(drogon::orm::internal::SqlBinder &binder) const; + const std::vector updateColumns() const; + void updateArgs(drogon::orm::internal::SqlBinder &binder) const; + ///For mysql or sqlite3 + void updateId(const uint64_t id); + std::shared_ptr id_; + std::shared_ptr isFile_; + std::shared_ptr name_; + std::shared_ptr parentId_; + std::shared_ptr ownerId_; + std::shared_ptr size_; + struct MetaData + { + const std::string colName_; + const std::string colType_; + const std::string colDatabaseType_; + const ssize_t colLength_; + const bool isAutoVal_; + const bool isPrimaryKey_; + const bool notNull_; + }; + static const std::vector metaData_; + bool dirtyFlag_[6]={ false }; + public: + static const std::string &sqlForFindingByPrimaryKey() + { + static const std::string sql="select * from " + tableName + " where id = ?"; + return sql; + } + + static const std::string &sqlForDeletingByPrimaryKey() + { + static const std::string sql="delete from " + tableName + " where id = ?"; + return sql; + } + std::string sqlForInserting(bool &needSelection) const + { + std::string sql="insert into " + tableName + " ("; + size_t parametersCount = 0; + needSelection = false; + if(dirtyFlag_[1]) + { + sql += "is_file,"; + ++parametersCount; + } + if(dirtyFlag_[2]) + { + sql += "name,"; + ++parametersCount; + } + if(dirtyFlag_[3]) + { + sql += "parent_id,"; + ++parametersCount; + } + if(dirtyFlag_[4]) + { + sql += "owner_id,"; + ++parametersCount; + } + if(dirtyFlag_[5]) + { + sql += "size,"; + ++parametersCount; + } + if(parametersCount > 0) + { + sql[sql.length()-1]=')'; + sql += " values ("; + } + else + sql += ") values ("; + + if(dirtyFlag_[1]) + { + sql.append("?,"); + + } + if(dirtyFlag_[2]) + { + sql.append("?,"); + + } + if(dirtyFlag_[3]) + { + sql.append("?,"); + + } + if(dirtyFlag_[4]) + { + sql.append("?,"); + + } + if(dirtyFlag_[5]) + { + sql.append("?,"); + + } + if(parametersCount > 0) + { + sql.resize(sql.length() - 1); + } + sql.append(1, ')'); + LOG_TRACE << sql; + return sql; + } +}; +} // namespace sqlite3 +} // namespace drogon_model diff --git a/backend/src/db/model/Tokens.cc b/backend/src/db/model/Tokens.cc new file mode 100644 index 0000000..d02df5e --- /dev/null +++ b/backend/src/db/model/Tokens.cc @@ -0,0 +1,631 @@ +/** + * + * Tokens.cc + * DO NOT EDIT. This file is generated by drogon_ctl + * + */ + +#include "Tokens.h" +#include +#include + +using namespace drogon; +using namespace drogon::orm; +using namespace drogon_model::sqlite3; + +const std::string Tokens::Cols::_id = "id"; +const std::string Tokens::Cols::_owner_id = "owner_id"; +const std::string Tokens::Cols::_exp = "exp"; +const std::string Tokens::primaryKeyName = "id"; +const bool Tokens::hasPrimaryKey = true; +const std::string Tokens::tableName = "tokens"; + +const std::vector Tokens::metaData_={ +{"id","uint64_t","integer",8,1,1,1}, +{"owner_id","uint64_t","integer",8,0,0,1}, +{"exp","uint64_t","integer",8,0,0,1} +}; +const std::string &Tokens::getColumnName(size_t index) noexcept(false) +{ + assert(index < metaData_.size()); + return metaData_[index].colName_; +} +Tokens::Tokens(const Row &r, const ssize_t indexOffset) noexcept +{ + if(indexOffset < 0) + { + if(!r["id"].isNull()) + { + id_=std::make_shared(r["id"].as()); + } + if(!r["owner_id"].isNull()) + { + ownerId_=std::make_shared(r["owner_id"].as()); + } + if(!r["exp"].isNull()) + { + exp_=std::make_shared(r["exp"].as()); + } + } + else + { + size_t offset = (size_t)indexOffset; + if(offset + 3 > r.size()) + { + LOG_FATAL << "Invalid SQL result for this model"; + return; + } + size_t index; + index = offset + 0; + if(!r[index].isNull()) + { + id_=std::make_shared(r[index].as()); + } + index = offset + 1; + if(!r[index].isNull()) + { + ownerId_=std::make_shared(r[index].as()); + } + index = offset + 2; + if(!r[index].isNull()) + { + exp_=std::make_shared(r[index].as()); + } + } + +} + +Tokens::Tokens(const Json::Value &pJson, const std::vector &pMasqueradingVector) noexcept(false) +{ + if(pMasqueradingVector.size() != 3) + { + LOG_ERROR << "Bad masquerading vector"; + return; + } + if(!pMasqueradingVector[0].empty() && pJson.isMember(pMasqueradingVector[0])) + { + dirtyFlag_[0] = true; + if(!pJson[pMasqueradingVector[0]].isNull()) + { + id_=std::make_shared((uint64_t)pJson[pMasqueradingVector[0]].asUInt64()); + } + } + if(!pMasqueradingVector[1].empty() && pJson.isMember(pMasqueradingVector[1])) + { + dirtyFlag_[1] = true; + if(!pJson[pMasqueradingVector[1]].isNull()) + { + ownerId_=std::make_shared((uint64_t)pJson[pMasqueradingVector[1]].asUInt64()); + } + } + if(!pMasqueradingVector[2].empty() && pJson.isMember(pMasqueradingVector[2])) + { + dirtyFlag_[2] = true; + if(!pJson[pMasqueradingVector[2]].isNull()) + { + exp_=std::make_shared((uint64_t)pJson[pMasqueradingVector[2]].asUInt64()); + } + } +} + +Tokens::Tokens(const Json::Value &pJson) noexcept(false) +{ + if(pJson.isMember("id")) + { + dirtyFlag_[0]=true; + if(!pJson["id"].isNull()) + { + id_=std::make_shared((uint64_t)pJson["id"].asUInt64()); + } + } + if(pJson.isMember("owner_id")) + { + dirtyFlag_[1]=true; + if(!pJson["owner_id"].isNull()) + { + ownerId_=std::make_shared((uint64_t)pJson["owner_id"].asUInt64()); + } + } + if(pJson.isMember("exp")) + { + dirtyFlag_[2]=true; + if(!pJson["exp"].isNull()) + { + exp_=std::make_shared((uint64_t)pJson["exp"].asUInt64()); + } + } +} + +void Tokens::updateByMasqueradedJson(const Json::Value &pJson, + const std::vector &pMasqueradingVector) noexcept(false) +{ + if(pMasqueradingVector.size() != 3) + { + LOG_ERROR << "Bad masquerading vector"; + return; + } + if(!pMasqueradingVector[0].empty() && pJson.isMember(pMasqueradingVector[0])) + { + if(!pJson[pMasqueradingVector[0]].isNull()) + { + id_=std::make_shared((uint64_t)pJson[pMasqueradingVector[0]].asUInt64()); + } + } + if(!pMasqueradingVector[1].empty() && pJson.isMember(pMasqueradingVector[1])) + { + dirtyFlag_[1] = true; + if(!pJson[pMasqueradingVector[1]].isNull()) + { + ownerId_=std::make_shared((uint64_t)pJson[pMasqueradingVector[1]].asUInt64()); + } + } + if(!pMasqueradingVector[2].empty() && pJson.isMember(pMasqueradingVector[2])) + { + dirtyFlag_[2] = true; + if(!pJson[pMasqueradingVector[2]].isNull()) + { + exp_=std::make_shared((uint64_t)pJson[pMasqueradingVector[2]].asUInt64()); + } + } +} + +void Tokens::updateByJson(const Json::Value &pJson) noexcept(false) +{ + if(pJson.isMember("id")) + { + if(!pJson["id"].isNull()) + { + id_=std::make_shared((uint64_t)pJson["id"].asUInt64()); + } + } + if(pJson.isMember("owner_id")) + { + dirtyFlag_[1] = true; + if(!pJson["owner_id"].isNull()) + { + ownerId_=std::make_shared((uint64_t)pJson["owner_id"].asUInt64()); + } + } + if(pJson.isMember("exp")) + { + dirtyFlag_[2] = true; + if(!pJson["exp"].isNull()) + { + exp_=std::make_shared((uint64_t)pJson["exp"].asUInt64()); + } + } +} + +const uint64_t &Tokens::getValueOfId() const noexcept +{ + const static uint64_t defaultValue = uint64_t(); + if(id_) + return *id_; + return defaultValue; +} +const std::shared_ptr &Tokens::getId() const noexcept +{ + return id_; +} +void Tokens::setId(const uint64_t &pId) noexcept +{ + id_ = std::make_shared(pId); + dirtyFlag_[0] = true; +} +const typename Tokens::PrimaryKeyType & Tokens::getPrimaryKey() const +{ + assert(id_); + return *id_; +} + +const uint64_t &Tokens::getValueOfOwnerId() const noexcept +{ + const static uint64_t defaultValue = uint64_t(); + if(ownerId_) + return *ownerId_; + return defaultValue; +} +const std::shared_ptr &Tokens::getOwnerId() const noexcept +{ + return ownerId_; +} +void Tokens::setOwnerId(const uint64_t &pOwnerId) noexcept +{ + ownerId_ = std::make_shared(pOwnerId); + dirtyFlag_[1] = true; +} + +const uint64_t &Tokens::getValueOfExp() const noexcept +{ + const static uint64_t defaultValue = uint64_t(); + if(exp_) + return *exp_; + return defaultValue; +} +const std::shared_ptr &Tokens::getExp() const noexcept +{ + return exp_; +} +void Tokens::setExp(const uint64_t &pExp) noexcept +{ + exp_ = std::make_shared(pExp); + dirtyFlag_[2] = true; +} + +void Tokens::updateId(const uint64_t id) +{ + id_ = std::make_shared(id); +} + +const std::vector &Tokens::insertColumns() noexcept +{ + static const std::vector inCols={ + "owner_id", + "exp" + }; + return inCols; +} + +void Tokens::outputArgs(drogon::orm::internal::SqlBinder &binder) const +{ + if(dirtyFlag_[1]) + { + if(getOwnerId()) + { + binder << getValueOfOwnerId(); + } + else + { + binder << nullptr; + } + } + if(dirtyFlag_[2]) + { + if(getExp()) + { + binder << getValueOfExp(); + } + else + { + binder << nullptr; + } + } +} + +const std::vector Tokens::updateColumns() const +{ + std::vector ret; + if(dirtyFlag_[1]) + { + ret.push_back(getColumnName(1)); + } + if(dirtyFlag_[2]) + { + ret.push_back(getColumnName(2)); + } + return ret; +} + +void Tokens::updateArgs(drogon::orm::internal::SqlBinder &binder) const +{ + if(dirtyFlag_[1]) + { + if(getOwnerId()) + { + binder << getValueOfOwnerId(); + } + else + { + binder << nullptr; + } + } + if(dirtyFlag_[2]) + { + if(getExp()) + { + binder << getValueOfExp(); + } + else + { + binder << nullptr; + } + } +} +Json::Value Tokens::toJson() const +{ + Json::Value ret; + if(getId()) + { + ret["id"]=(Json::UInt64)getValueOfId(); + } + else + { + ret["id"]=Json::Value(); + } + if(getOwnerId()) + { + ret["owner_id"]=(Json::UInt64)getValueOfOwnerId(); + } + else + { + ret["owner_id"]=Json::Value(); + } + if(getExp()) + { + ret["exp"]=(Json::UInt64)getValueOfExp(); + } + else + { + ret["exp"]=Json::Value(); + } + return ret; +} + +Json::Value Tokens::toMasqueradedJson( + const std::vector &pMasqueradingVector) const +{ + Json::Value ret; + if(pMasqueradingVector.size() == 3) + { + if(!pMasqueradingVector[0].empty()) + { + if(getId()) + { + ret[pMasqueradingVector[0]]=(Json::UInt64)getValueOfId(); + } + else + { + ret[pMasqueradingVector[0]]=Json::Value(); + } + } + if(!pMasqueradingVector[1].empty()) + { + if(getOwnerId()) + { + ret[pMasqueradingVector[1]]=(Json::UInt64)getValueOfOwnerId(); + } + else + { + ret[pMasqueradingVector[1]]=Json::Value(); + } + } + if(!pMasqueradingVector[2].empty()) + { + if(getExp()) + { + ret[pMasqueradingVector[2]]=(Json::UInt64)getValueOfExp(); + } + else + { + ret[pMasqueradingVector[2]]=Json::Value(); + } + } + return ret; + } + LOG_ERROR << "Masquerade failed"; + if(getId()) + { + ret["id"]=(Json::UInt64)getValueOfId(); + } + else + { + ret["id"]=Json::Value(); + } + if(getOwnerId()) + { + ret["owner_id"]=(Json::UInt64)getValueOfOwnerId(); + } + else + { + ret["owner_id"]=Json::Value(); + } + if(getExp()) + { + ret["exp"]=(Json::UInt64)getValueOfExp(); + } + else + { + ret["exp"]=Json::Value(); + } + return ret; +} + +bool Tokens::validateJsonForCreation(const Json::Value &pJson, std::string &err) +{ + if(pJson.isMember("id")) + { + if(!validJsonOfField(0, "id", pJson["id"], err, true)) + return false; + } + if(pJson.isMember("owner_id")) + { + if(!validJsonOfField(1, "owner_id", pJson["owner_id"], err, true)) + return false; + } + else + { + err="The owner_id column cannot be null"; + return false; + } + if(pJson.isMember("exp")) + { + if(!validJsonOfField(2, "exp", pJson["exp"], err, true)) + return false; + } + else + { + err="The exp column cannot be null"; + return false; + } + return true; +} +bool Tokens::validateMasqueradedJsonForCreation(const Json::Value &pJson, + const std::vector &pMasqueradingVector, + std::string &err) +{ + if(pMasqueradingVector.size() != 3) + { + err = "Bad masquerading vector"; + return false; + } + try { + if(!pMasqueradingVector[0].empty()) + { + if(pJson.isMember(pMasqueradingVector[0])) + { + if(!validJsonOfField(0, pMasqueradingVector[0], pJson[pMasqueradingVector[0]], err, true)) + return false; + } + } + if(!pMasqueradingVector[1].empty()) + { + if(pJson.isMember(pMasqueradingVector[1])) + { + if(!validJsonOfField(1, pMasqueradingVector[1], pJson[pMasqueradingVector[1]], err, true)) + return false; + } + else + { + err="The " + pMasqueradingVector[1] + " column cannot be null"; + return false; + } + } + if(!pMasqueradingVector[2].empty()) + { + if(pJson.isMember(pMasqueradingVector[2])) + { + if(!validJsonOfField(2, pMasqueradingVector[2], pJson[pMasqueradingVector[2]], err, true)) + return false; + } + else + { + err="The " + pMasqueradingVector[2] + " column cannot be null"; + return false; + } + } + } + catch(const Json::LogicError &e) + { + err = e.what(); + return false; + } + return true; +} +bool Tokens::validateJsonForUpdate(const Json::Value &pJson, std::string &err) +{ + if(pJson.isMember("id")) + { + if(!validJsonOfField(0, "id", pJson["id"], err, false)) + return false; + } + else + { + err = "The value of primary key must be set in the json object for update"; + return false; + } + if(pJson.isMember("owner_id")) + { + if(!validJsonOfField(1, "owner_id", pJson["owner_id"], err, false)) + return false; + } + if(pJson.isMember("exp")) + { + if(!validJsonOfField(2, "exp", pJson["exp"], err, false)) + return false; + } + return true; +} +bool Tokens::validateMasqueradedJsonForUpdate(const Json::Value &pJson, + const std::vector &pMasqueradingVector, + std::string &err) +{ + if(pMasqueradingVector.size() != 3) + { + err = "Bad masquerading vector"; + return false; + } + try { + if(!pMasqueradingVector[0].empty() && pJson.isMember(pMasqueradingVector[0])) + { + if(!validJsonOfField(0, pMasqueradingVector[0], pJson[pMasqueradingVector[0]], err, false)) + return false; + } + else + { + err = "The value of primary key must be set in the json object for update"; + return false; + } + if(!pMasqueradingVector[1].empty() && pJson.isMember(pMasqueradingVector[1])) + { + if(!validJsonOfField(1, pMasqueradingVector[1], pJson[pMasqueradingVector[1]], err, false)) + return false; + } + if(!pMasqueradingVector[2].empty() && pJson.isMember(pMasqueradingVector[2])) + { + if(!validJsonOfField(2, pMasqueradingVector[2], pJson[pMasqueradingVector[2]], err, false)) + return false; + } + } + catch(const Json::LogicError &e) + { + err = e.what(); + return false; + } + return true; +} +bool Tokens::validJsonOfField(size_t index, + const std::string &fieldName, + const Json::Value &pJson, + std::string &err, + bool isForCreation) +{ + switch(index) + { + case 0: + if(pJson.isNull()) + { + err="The " + fieldName + " column cannot be null"; + return false; + } + if(isForCreation) + { + err="The automatic primary key cannot be set"; + return false; + } + if(!pJson.isUInt64()) + { + err="Type error in the "+fieldName+" field"; + return false; + } + break; + case 1: + if(pJson.isNull()) + { + err="The " + fieldName + " column cannot be null"; + return false; + } + if(!pJson.isUInt64()) + { + err="Type error in the "+fieldName+" field"; + return false; + } + break; + case 2: + if(pJson.isNull()) + { + err="The " + fieldName + " column cannot be null"; + return false; + } + if(!pJson.isUInt64()) + { + err="Type error in the "+fieldName+" field"; + return false; + } + break; + default: + err="Internal error in the server"; + return false; + break; + } + return true; +} diff --git a/backend/src/db/model/Tokens.h b/backend/src/db/model/Tokens.h new file mode 100644 index 0000000..b2fe9e2 --- /dev/null +++ b/backend/src/db/model/Tokens.h @@ -0,0 +1,211 @@ +/** + * + * Tokens.h + * DO NOT EDIT. This file is generated by drogon_ctl + * + */ + +#pragma once +#include +#include +#include +#include +#include +#ifdef __cpp_impl_coroutine +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace drogon +{ +namespace orm +{ +class DbClient; +using DbClientPtr = std::shared_ptr; +} +} +namespace drogon_model +{ +namespace sqlite3 +{ + +class Tokens +{ + public: + struct Cols + { + static const std::string _id; + static const std::string _owner_id; + static const std::string _exp; + }; + + const static int primaryKeyNumber; + const static std::string tableName; + const static bool hasPrimaryKey; + const static std::string primaryKeyName; + using PrimaryKeyType = uint64_t; + const PrimaryKeyType &getPrimaryKey() const; + + /** + * @brief constructor + * @param r One row of records in the SQL query result. + * @param indexOffset Set the offset to -1 to access all columns by column names, + * otherwise access all columns by offsets. + * @note If the SQL is not a style of 'select * from table_name ...' (select all + * columns by an asterisk), please set the offset to -1. + */ + explicit Tokens(const drogon::orm::Row &r, const ssize_t indexOffset = 0) noexcept; + + /** + * @brief constructor + * @param pJson The json object to construct a new instance. + */ + explicit Tokens(const Json::Value &pJson) noexcept(false); + + /** + * @brief constructor + * @param pJson The json object to construct a new instance. + * @param pMasqueradingVector The aliases of table columns. + */ + Tokens(const Json::Value &pJson, const std::vector &pMasqueradingVector) noexcept(false); + + Tokens() = default; + + void updateByJson(const Json::Value &pJson) noexcept(false); + void updateByMasqueradedJson(const Json::Value &pJson, + const std::vector &pMasqueradingVector) noexcept(false); + static bool validateJsonForCreation(const Json::Value &pJson, std::string &err); + static bool validateMasqueradedJsonForCreation(const Json::Value &, + const std::vector &pMasqueradingVector, + std::string &err); + static bool validateJsonForUpdate(const Json::Value &pJson, std::string &err); + static bool validateMasqueradedJsonForUpdate(const Json::Value &, + const std::vector &pMasqueradingVector, + std::string &err); + static bool validJsonOfField(size_t index, + const std::string &fieldName, + const Json::Value &pJson, + std::string &err, + bool isForCreation); + + /** For column id */ + ///Get the value of the column id, returns the default value if the column is null + const uint64_t &getValueOfId() const noexcept; + ///Return a shared_ptr object pointing to the column const value, or an empty shared_ptr object if the column is null + const std::shared_ptr &getId() const noexcept; + ///Set the value of the column id + void setId(const uint64_t &pId) noexcept; + + /** For column owner_id */ + ///Get the value of the column owner_id, returns the default value if the column is null + const uint64_t &getValueOfOwnerId() const noexcept; + ///Return a shared_ptr object pointing to the column const value, or an empty shared_ptr object if the column is null + const std::shared_ptr &getOwnerId() const noexcept; + ///Set the value of the column owner_id + void setOwnerId(const uint64_t &pOwnerId) noexcept; + + /** For column exp */ + ///Get the value of the column exp, returns the default value if the column is null + const uint64_t &getValueOfExp() const noexcept; + ///Return a shared_ptr object pointing to the column const value, or an empty shared_ptr object if the column is null + const std::shared_ptr &getExp() const noexcept; + ///Set the value of the column exp + void setExp(const uint64_t &pExp) noexcept; + + + static size_t getColumnNumber() noexcept { return 3; } + static const std::string &getColumnName(size_t index) noexcept(false); + + Json::Value toJson() const; + Json::Value toMasqueradedJson(const std::vector &pMasqueradingVector) const; + /// Relationship interfaces + private: + friend drogon::orm::Mapper; +#ifdef __cpp_impl_coroutine + friend drogon::orm::CoroMapper; +#endif + static const std::vector &insertColumns() noexcept; + void outputArgs(drogon::orm::internal::SqlBinder &binder) const; + const std::vector updateColumns() const; + void updateArgs(drogon::orm::internal::SqlBinder &binder) const; + ///For mysql or sqlite3 + void updateId(const uint64_t id); + std::shared_ptr id_; + std::shared_ptr ownerId_; + std::shared_ptr exp_; + struct MetaData + { + const std::string colName_; + const std::string colType_; + const std::string colDatabaseType_; + const ssize_t colLength_; + const bool isAutoVal_; + const bool isPrimaryKey_; + const bool notNull_; + }; + static const std::vector metaData_; + bool dirtyFlag_[3]={ false }; + public: + static const std::string &sqlForFindingByPrimaryKey() + { + static const std::string sql="select * from " + tableName + " where id = ?"; + return sql; + } + + static const std::string &sqlForDeletingByPrimaryKey() + { + static const std::string sql="delete from " + tableName + " where id = ?"; + return sql; + } + std::string sqlForInserting(bool &needSelection) const + { + std::string sql="insert into " + tableName + " ("; + size_t parametersCount = 0; + needSelection = false; + if(dirtyFlag_[1]) + { + sql += "owner_id,"; + ++parametersCount; + } + if(dirtyFlag_[2]) + { + sql += "exp,"; + ++parametersCount; + } + if(parametersCount > 0) + { + sql[sql.length()-1]=')'; + sql += " values ("; + } + else + sql += ") values ("; + + if(dirtyFlag_[1]) + { + sql.append("?,"); + + } + if(dirtyFlag_[2]) + { + sql.append("?,"); + + } + if(parametersCount > 0) + { + sql.resize(sql.length() - 1); + } + sql.append(1, ')'); + LOG_TRACE << sql; + return sql; + } +}; +} // namespace sqlite3 +} // namespace drogon_model diff --git a/backend/src/db/model/User.cc b/backend/src/db/model/User.cc new file mode 100644 index 0000000..45e3f9f --- /dev/null +++ b/backend/src/db/model/User.cc @@ -0,0 +1,1762 @@ +/** + * + * User.cc + * DO NOT EDIT. This file is generated by drogon_ctl + * + */ + +#include "User.h" +#include +#include + +using namespace drogon; +using namespace drogon::orm; +using namespace drogon_model::sqlite3; + +const std::string User::Cols::_id = "id"; +const std::string User::Cols::_gitlab = "gitlab"; +const std::string User::Cols::_name = "name"; +const std::string User::Cols::_password = "password"; +const std::string User::Cols::_role = "role"; +const std::string User::Cols::_root_id = "root_id"; +const std::string User::Cols::_tfa_type = "tfa_type"; +const std::string User::Cols::_tfa_secret = "tfa_secret"; +const std::string User::Cols::_gitlab_at = "gitlab_at"; +const std::string User::Cols::_gitlab_rt = "gitlab_rt"; +const std::string User::primaryKeyName = "id"; +const bool User::hasPrimaryKey = true; +const std::string User::tableName = "user"; + +const std::vector User::metaData_={ +{"id","uint64_t","integer",8,1,1,1}, +{"gitlab","uint64_t","integer",8,0,0,1}, +{"name","std::string","text",0,0,0,1}, +{"password","std::string","text",0,0,0,1}, +{"role","uint64_t","integer",8,0,0,1}, +{"root_id","uint64_t","integer",8,0,0,1}, +{"tfa_type","uint64_t","integer",8,0,0,1}, +{"tfa_secret","std::vector","blob",0,0,0,0}, +{"gitlab_at","std::string","text",0,0,0,0}, +{"gitlab_rt","std::string","text",0,0,0,0} +}; +const std::string &User::getColumnName(size_t index) noexcept(false) +{ + assert(index < metaData_.size()); + return metaData_[index].colName_; +} +User::User(const Row &r, const ssize_t indexOffset) noexcept +{ + if(indexOffset < 0) + { + if(!r["id"].isNull()) + { + id_=std::make_shared(r["id"].as()); + } + if(!r["gitlab"].isNull()) + { + gitlab_=std::make_shared(r["gitlab"].as()); + } + if(!r["name"].isNull()) + { + name_=std::make_shared(r["name"].as()); + } + if(!r["password"].isNull()) + { + password_=std::make_shared(r["password"].as()); + } + if(!r["role"].isNull()) + { + role_=std::make_shared(r["role"].as()); + } + if(!r["root_id"].isNull()) + { + rootId_=std::make_shared(r["root_id"].as()); + } + if(!r["tfa_type"].isNull()) + { + tfaType_=std::make_shared(r["tfa_type"].as()); + } + if(!r["tfa_secret"].isNull()) + { + tfaSecret_=std::make_shared>(r["tfa_secret"].as>()); + } + if(!r["gitlab_at"].isNull()) + { + gitlabAt_=std::make_shared(r["gitlab_at"].as()); + } + if(!r["gitlab_rt"].isNull()) + { + gitlabRt_=std::make_shared(r["gitlab_rt"].as()); + } + } + else + { + size_t offset = (size_t)indexOffset; + if(offset + 10 > r.size()) + { + LOG_FATAL << "Invalid SQL result for this model"; + return; + } + size_t index; + index = offset + 0; + if(!r[index].isNull()) + { + id_=std::make_shared(r[index].as()); + } + index = offset + 1; + if(!r[index].isNull()) + { + gitlab_=std::make_shared(r[index].as()); + } + index = offset + 2; + if(!r[index].isNull()) + { + name_=std::make_shared(r[index].as()); + } + index = offset + 3; + if(!r[index].isNull()) + { + password_=std::make_shared(r[index].as()); + } + index = offset + 4; + if(!r[index].isNull()) + { + role_=std::make_shared(r[index].as()); + } + index = offset + 5; + if(!r[index].isNull()) + { + rootId_=std::make_shared(r[index].as()); + } + index = offset + 6; + if(!r[index].isNull()) + { + tfaType_=std::make_shared(r[index].as()); + } + index = offset + 7; + if(!r[index].isNull()) + { + tfaSecret_=std::make_shared>(r[index].as>()); + } + index = offset + 8; + if(!r[index].isNull()) + { + gitlabAt_=std::make_shared(r[index].as()); + } + index = offset + 9; + if(!r[index].isNull()) + { + gitlabRt_=std::make_shared(r[index].as()); + } + } + +} + +User::User(const Json::Value &pJson, const std::vector &pMasqueradingVector) noexcept(false) +{ + if(pMasqueradingVector.size() != 10) + { + LOG_ERROR << "Bad masquerading vector"; + return; + } + if(!pMasqueradingVector[0].empty() && pJson.isMember(pMasqueradingVector[0])) + { + dirtyFlag_[0] = true; + if(!pJson[pMasqueradingVector[0]].isNull()) + { + id_=std::make_shared((uint64_t)pJson[pMasqueradingVector[0]].asUInt64()); + } + } + if(!pMasqueradingVector[1].empty() && pJson.isMember(pMasqueradingVector[1])) + { + dirtyFlag_[1] = true; + if(!pJson[pMasqueradingVector[1]].isNull()) + { + gitlab_=std::make_shared((uint64_t)pJson[pMasqueradingVector[1]].asUInt64()); + } + } + if(!pMasqueradingVector[2].empty() && pJson.isMember(pMasqueradingVector[2])) + { + dirtyFlag_[2] = true; + if(!pJson[pMasqueradingVector[2]].isNull()) + { + name_=std::make_shared(pJson[pMasqueradingVector[2]].asString()); + } + } + if(!pMasqueradingVector[3].empty() && pJson.isMember(pMasqueradingVector[3])) + { + dirtyFlag_[3] = true; + if(!pJson[pMasqueradingVector[3]].isNull()) + { + password_=std::make_shared(pJson[pMasqueradingVector[3]].asString()); + } + } + if(!pMasqueradingVector[4].empty() && pJson.isMember(pMasqueradingVector[4])) + { + dirtyFlag_[4] = true; + if(!pJson[pMasqueradingVector[4]].isNull()) + { + role_=std::make_shared((uint64_t)pJson[pMasqueradingVector[4]].asUInt64()); + } + } + if(!pMasqueradingVector[5].empty() && pJson.isMember(pMasqueradingVector[5])) + { + dirtyFlag_[5] = true; + if(!pJson[pMasqueradingVector[5]].isNull()) + { + rootId_=std::make_shared((uint64_t)pJson[pMasqueradingVector[5]].asUInt64()); + } + } + if(!pMasqueradingVector[6].empty() && pJson.isMember(pMasqueradingVector[6])) + { + dirtyFlag_[6] = true; + if(!pJson[pMasqueradingVector[6]].isNull()) + { + tfaType_=std::make_shared((uint64_t)pJson[pMasqueradingVector[6]].asUInt64()); + } + } + if(!pMasqueradingVector[7].empty() && pJson.isMember(pMasqueradingVector[7])) + { + dirtyFlag_[7] = true; + if(!pJson[pMasqueradingVector[7]].isNull()) + { + auto str = pJson[pMasqueradingVector[7]].asString(); + tfaSecret_=std::make_shared>(drogon::utils::base64DecodeToVector(str)); + } + } + if(!pMasqueradingVector[8].empty() && pJson.isMember(pMasqueradingVector[8])) + { + dirtyFlag_[8] = true; + if(!pJson[pMasqueradingVector[8]].isNull()) + { + gitlabAt_=std::make_shared(pJson[pMasqueradingVector[8]].asString()); + } + } + if(!pMasqueradingVector[9].empty() && pJson.isMember(pMasqueradingVector[9])) + { + dirtyFlag_[9] = true; + if(!pJson[pMasqueradingVector[9]].isNull()) + { + gitlabRt_=std::make_shared(pJson[pMasqueradingVector[9]].asString()); + } + } +} + +User::User(const Json::Value &pJson) noexcept(false) +{ + if(pJson.isMember("id")) + { + dirtyFlag_[0]=true; + if(!pJson["id"].isNull()) + { + id_=std::make_shared((uint64_t)pJson["id"].asUInt64()); + } + } + if(pJson.isMember("gitlab")) + { + dirtyFlag_[1]=true; + if(!pJson["gitlab"].isNull()) + { + gitlab_=std::make_shared((uint64_t)pJson["gitlab"].asUInt64()); + } + } + if(pJson.isMember("name")) + { + dirtyFlag_[2]=true; + if(!pJson["name"].isNull()) + { + name_=std::make_shared(pJson["name"].asString()); + } + } + if(pJson.isMember("password")) + { + dirtyFlag_[3]=true; + if(!pJson["password"].isNull()) + { + password_=std::make_shared(pJson["password"].asString()); + } + } + if(pJson.isMember("role")) + { + dirtyFlag_[4]=true; + if(!pJson["role"].isNull()) + { + role_=std::make_shared((uint64_t)pJson["role"].asUInt64()); + } + } + if(pJson.isMember("root_id")) + { + dirtyFlag_[5]=true; + if(!pJson["root_id"].isNull()) + { + rootId_=std::make_shared((uint64_t)pJson["root_id"].asUInt64()); + } + } + if(pJson.isMember("tfa_type")) + { + dirtyFlag_[6]=true; + if(!pJson["tfa_type"].isNull()) + { + tfaType_=std::make_shared((uint64_t)pJson["tfa_type"].asUInt64()); + } + } + if(pJson.isMember("tfa_secret")) + { + dirtyFlag_[7]=true; + if(!pJson["tfa_secret"].isNull()) + { + auto str = pJson["tfa_secret"].asString(); + tfaSecret_=std::make_shared>(drogon::utils::base64DecodeToVector(str)); + } + } + if(pJson.isMember("gitlab_at")) + { + dirtyFlag_[8]=true; + if(!pJson["gitlab_at"].isNull()) + { + gitlabAt_=std::make_shared(pJson["gitlab_at"].asString()); + } + } + if(pJson.isMember("gitlab_rt")) + { + dirtyFlag_[9]=true; + if(!pJson["gitlab_rt"].isNull()) + { + gitlabRt_=std::make_shared(pJson["gitlab_rt"].asString()); + } + } +} + +void User::updateByMasqueradedJson(const Json::Value &pJson, + const std::vector &pMasqueradingVector) noexcept(false) +{ + if(pMasqueradingVector.size() != 10) + { + LOG_ERROR << "Bad masquerading vector"; + return; + } + if(!pMasqueradingVector[0].empty() && pJson.isMember(pMasqueradingVector[0])) + { + if(!pJson[pMasqueradingVector[0]].isNull()) + { + id_=std::make_shared((uint64_t)pJson[pMasqueradingVector[0]].asUInt64()); + } + } + if(!pMasqueradingVector[1].empty() && pJson.isMember(pMasqueradingVector[1])) + { + dirtyFlag_[1] = true; + if(!pJson[pMasqueradingVector[1]].isNull()) + { + gitlab_=std::make_shared((uint64_t)pJson[pMasqueradingVector[1]].asUInt64()); + } + } + if(!pMasqueradingVector[2].empty() && pJson.isMember(pMasqueradingVector[2])) + { + dirtyFlag_[2] = true; + if(!pJson[pMasqueradingVector[2]].isNull()) + { + name_=std::make_shared(pJson[pMasqueradingVector[2]].asString()); + } + } + if(!pMasqueradingVector[3].empty() && pJson.isMember(pMasqueradingVector[3])) + { + dirtyFlag_[3] = true; + if(!pJson[pMasqueradingVector[3]].isNull()) + { + password_=std::make_shared(pJson[pMasqueradingVector[3]].asString()); + } + } + if(!pMasqueradingVector[4].empty() && pJson.isMember(pMasqueradingVector[4])) + { + dirtyFlag_[4] = true; + if(!pJson[pMasqueradingVector[4]].isNull()) + { + role_=std::make_shared((uint64_t)pJson[pMasqueradingVector[4]].asUInt64()); + } + } + if(!pMasqueradingVector[5].empty() && pJson.isMember(pMasqueradingVector[5])) + { + dirtyFlag_[5] = true; + if(!pJson[pMasqueradingVector[5]].isNull()) + { + rootId_=std::make_shared((uint64_t)pJson[pMasqueradingVector[5]].asUInt64()); + } + } + if(!pMasqueradingVector[6].empty() && pJson.isMember(pMasqueradingVector[6])) + { + dirtyFlag_[6] = true; + if(!pJson[pMasqueradingVector[6]].isNull()) + { + tfaType_=std::make_shared((uint64_t)pJson[pMasqueradingVector[6]].asUInt64()); + } + } + if(!pMasqueradingVector[7].empty() && pJson.isMember(pMasqueradingVector[7])) + { + dirtyFlag_[7] = true; + if(!pJson[pMasqueradingVector[7]].isNull()) + { + auto str = pJson[pMasqueradingVector[7]].asString(); + tfaSecret_=std::make_shared>(drogon::utils::base64DecodeToVector(str)); + } + } + if(!pMasqueradingVector[8].empty() && pJson.isMember(pMasqueradingVector[8])) + { + dirtyFlag_[8] = true; + if(!pJson[pMasqueradingVector[8]].isNull()) + { + gitlabAt_=std::make_shared(pJson[pMasqueradingVector[8]].asString()); + } + } + if(!pMasqueradingVector[9].empty() && pJson.isMember(pMasqueradingVector[9])) + { + dirtyFlag_[9] = true; + if(!pJson[pMasqueradingVector[9]].isNull()) + { + gitlabRt_=std::make_shared(pJson[pMasqueradingVector[9]].asString()); + } + } +} + +void User::updateByJson(const Json::Value &pJson) noexcept(false) +{ + if(pJson.isMember("id")) + { + if(!pJson["id"].isNull()) + { + id_=std::make_shared((uint64_t)pJson["id"].asUInt64()); + } + } + if(pJson.isMember("gitlab")) + { + dirtyFlag_[1] = true; + if(!pJson["gitlab"].isNull()) + { + gitlab_=std::make_shared((uint64_t)pJson["gitlab"].asUInt64()); + } + } + if(pJson.isMember("name")) + { + dirtyFlag_[2] = true; + if(!pJson["name"].isNull()) + { + name_=std::make_shared(pJson["name"].asString()); + } + } + if(pJson.isMember("password")) + { + dirtyFlag_[3] = true; + if(!pJson["password"].isNull()) + { + password_=std::make_shared(pJson["password"].asString()); + } + } + if(pJson.isMember("role")) + { + dirtyFlag_[4] = true; + if(!pJson["role"].isNull()) + { + role_=std::make_shared((uint64_t)pJson["role"].asUInt64()); + } + } + if(pJson.isMember("root_id")) + { + dirtyFlag_[5] = true; + if(!pJson["root_id"].isNull()) + { + rootId_=std::make_shared((uint64_t)pJson["root_id"].asUInt64()); + } + } + if(pJson.isMember("tfa_type")) + { + dirtyFlag_[6] = true; + if(!pJson["tfa_type"].isNull()) + { + tfaType_=std::make_shared((uint64_t)pJson["tfa_type"].asUInt64()); + } + } + if(pJson.isMember("tfa_secret")) + { + dirtyFlag_[7] = true; + if(!pJson["tfa_secret"].isNull()) + { + auto str = pJson["tfa_secret"].asString(); + tfaSecret_=std::make_shared>(drogon::utils::base64DecodeToVector(str)); + } + } + if(pJson.isMember("gitlab_at")) + { + dirtyFlag_[8] = true; + if(!pJson["gitlab_at"].isNull()) + { + gitlabAt_=std::make_shared(pJson["gitlab_at"].asString()); + } + } + if(pJson.isMember("gitlab_rt")) + { + dirtyFlag_[9] = true; + if(!pJson["gitlab_rt"].isNull()) + { + gitlabRt_=std::make_shared(pJson["gitlab_rt"].asString()); + } + } +} + +const uint64_t &User::getValueOfId() const noexcept +{ + const static uint64_t defaultValue = uint64_t(); + if(id_) + return *id_; + return defaultValue; +} +const std::shared_ptr &User::getId() const noexcept +{ + return id_; +} +void User::setId(const uint64_t &pId) noexcept +{ + id_ = std::make_shared(pId); + dirtyFlag_[0] = true; +} +const typename User::PrimaryKeyType & User::getPrimaryKey() const +{ + assert(id_); + return *id_; +} + +const uint64_t &User::getValueOfGitlab() const noexcept +{ + const static uint64_t defaultValue = uint64_t(); + if(gitlab_) + return *gitlab_; + return defaultValue; +} +const std::shared_ptr &User::getGitlab() const noexcept +{ + return gitlab_; +} +void User::setGitlab(const uint64_t &pGitlab) noexcept +{ + gitlab_ = std::make_shared(pGitlab); + dirtyFlag_[1] = true; +} + +const std::string &User::getValueOfName() const noexcept +{ + const static std::string defaultValue = std::string(); + if(name_) + return *name_; + return defaultValue; +} +const std::shared_ptr &User::getName() const noexcept +{ + return name_; +} +void User::setName(const std::string &pName) noexcept +{ + name_ = std::make_shared(pName); + dirtyFlag_[2] = true; +} +void User::setName(std::string &&pName) noexcept +{ + name_ = std::make_shared(std::move(pName)); + dirtyFlag_[2] = true; +} + +const std::string &User::getValueOfPassword() const noexcept +{ + const static std::string defaultValue = std::string(); + if(password_) + return *password_; + return defaultValue; +} +const std::shared_ptr &User::getPassword() const noexcept +{ + return password_; +} +void User::setPassword(const std::string &pPassword) noexcept +{ + password_ = std::make_shared(pPassword); + dirtyFlag_[3] = true; +} +void User::setPassword(std::string &&pPassword) noexcept +{ + password_ = std::make_shared(std::move(pPassword)); + dirtyFlag_[3] = true; +} + +const uint64_t &User::getValueOfRole() const noexcept +{ + const static uint64_t defaultValue = uint64_t(); + if(role_) + return *role_; + return defaultValue; +} +const std::shared_ptr &User::getRole() const noexcept +{ + return role_; +} +void User::setRole(const uint64_t &pRole) noexcept +{ + role_ = std::make_shared(pRole); + dirtyFlag_[4] = true; +} + +const uint64_t &User::getValueOfRootId() const noexcept +{ + const static uint64_t defaultValue = uint64_t(); + if(rootId_) + return *rootId_; + return defaultValue; +} +const std::shared_ptr &User::getRootId() const noexcept +{ + return rootId_; +} +void User::setRootId(const uint64_t &pRootId) noexcept +{ + rootId_ = std::make_shared(pRootId); + dirtyFlag_[5] = true; +} + +const uint64_t &User::getValueOfTfaType() const noexcept +{ + const static uint64_t defaultValue = uint64_t(); + if(tfaType_) + return *tfaType_; + return defaultValue; +} +const std::shared_ptr &User::getTfaType() const noexcept +{ + return tfaType_; +} +void User::setTfaType(const uint64_t &pTfaType) noexcept +{ + tfaType_ = std::make_shared(pTfaType); + dirtyFlag_[6] = true; +} + +const std::vector &User::getValueOfTfaSecret() const noexcept +{ + const static std::vector defaultValue = std::vector(); + if(tfaSecret_) + return *tfaSecret_; + return defaultValue; +} +std::string User::getValueOfTfaSecretAsString() const noexcept +{ + const static std::string defaultValue = std::string(); + if(tfaSecret_) + return std::string(tfaSecret_->data(),tfaSecret_->size()); + return defaultValue; +} +const std::shared_ptr> &User::getTfaSecret() const noexcept +{ + return tfaSecret_; +} +void User::setTfaSecret(const std::vector &pTfaSecret) noexcept +{ + tfaSecret_ = std::make_shared>(pTfaSecret); + dirtyFlag_[7] = true; +} +void User::setTfaSecret(const std::string &pTfaSecret) noexcept +{ + tfaSecret_ = std::make_shared>(pTfaSecret.c_str(),pTfaSecret.c_str()+pTfaSecret.length()); + dirtyFlag_[7] = true; +} +void User::setTfaSecretToNull() noexcept +{ + tfaSecret_.reset(); + dirtyFlag_[7] = true; +} + +const std::string &User::getValueOfGitlabAt() const noexcept +{ + const static std::string defaultValue = std::string(); + if(gitlabAt_) + return *gitlabAt_; + return defaultValue; +} +const std::shared_ptr &User::getGitlabAt() const noexcept +{ + return gitlabAt_; +} +void User::setGitlabAt(const std::string &pGitlabAt) noexcept +{ + gitlabAt_ = std::make_shared(pGitlabAt); + dirtyFlag_[8] = true; +} +void User::setGitlabAt(std::string &&pGitlabAt) noexcept +{ + gitlabAt_ = std::make_shared(std::move(pGitlabAt)); + dirtyFlag_[8] = true; +} +void User::setGitlabAtToNull() noexcept +{ + gitlabAt_.reset(); + dirtyFlag_[8] = true; +} + +const std::string &User::getValueOfGitlabRt() const noexcept +{ + const static std::string defaultValue = std::string(); + if(gitlabRt_) + return *gitlabRt_; + return defaultValue; +} +const std::shared_ptr &User::getGitlabRt() const noexcept +{ + return gitlabRt_; +} +void User::setGitlabRt(const std::string &pGitlabRt) noexcept +{ + gitlabRt_ = std::make_shared(pGitlabRt); + dirtyFlag_[9] = true; +} +void User::setGitlabRt(std::string &&pGitlabRt) noexcept +{ + gitlabRt_ = std::make_shared(std::move(pGitlabRt)); + dirtyFlag_[9] = true; +} +void User::setGitlabRtToNull() noexcept +{ + gitlabRt_.reset(); + dirtyFlag_[9] = true; +} + +void User::updateId(const uint64_t id) +{ + id_ = std::make_shared(id); +} + +const std::vector &User::insertColumns() noexcept +{ + static const std::vector inCols={ + "gitlab", + "name", + "password", + "role", + "root_id", + "tfa_type", + "tfa_secret", + "gitlab_at", + "gitlab_rt" + }; + return inCols; +} + +void User::outputArgs(drogon::orm::internal::SqlBinder &binder) const +{ + if(dirtyFlag_[1]) + { + if(getGitlab()) + { + binder << getValueOfGitlab(); + } + else + { + binder << nullptr; + } + } + if(dirtyFlag_[2]) + { + if(getName()) + { + binder << getValueOfName(); + } + else + { + binder << nullptr; + } + } + if(dirtyFlag_[3]) + { + if(getPassword()) + { + binder << getValueOfPassword(); + } + else + { + binder << nullptr; + } + } + if(dirtyFlag_[4]) + { + if(getRole()) + { + binder << getValueOfRole(); + } + else + { + binder << nullptr; + } + } + if(dirtyFlag_[5]) + { + if(getRootId()) + { + binder << getValueOfRootId(); + } + else + { + binder << nullptr; + } + } + if(dirtyFlag_[6]) + { + if(getTfaType()) + { + binder << getValueOfTfaType(); + } + else + { + binder << nullptr; + } + } + if(dirtyFlag_[7]) + { + if(getTfaSecret()) + { + binder << getValueOfTfaSecret(); + } + else + { + binder << nullptr; + } + } + if(dirtyFlag_[8]) + { + if(getGitlabAt()) + { + binder << getValueOfGitlabAt(); + } + else + { + binder << nullptr; + } + } + if(dirtyFlag_[9]) + { + if(getGitlabRt()) + { + binder << getValueOfGitlabRt(); + } + else + { + binder << nullptr; + } + } +} + +const std::vector User::updateColumns() const +{ + std::vector ret; + if(dirtyFlag_[1]) + { + ret.push_back(getColumnName(1)); + } + if(dirtyFlag_[2]) + { + ret.push_back(getColumnName(2)); + } + if(dirtyFlag_[3]) + { + ret.push_back(getColumnName(3)); + } + if(dirtyFlag_[4]) + { + ret.push_back(getColumnName(4)); + } + if(dirtyFlag_[5]) + { + ret.push_back(getColumnName(5)); + } + if(dirtyFlag_[6]) + { + ret.push_back(getColumnName(6)); + } + if(dirtyFlag_[7]) + { + ret.push_back(getColumnName(7)); + } + if(dirtyFlag_[8]) + { + ret.push_back(getColumnName(8)); + } + if(dirtyFlag_[9]) + { + ret.push_back(getColumnName(9)); + } + return ret; +} + +void User::updateArgs(drogon::orm::internal::SqlBinder &binder) const +{ + if(dirtyFlag_[1]) + { + if(getGitlab()) + { + binder << getValueOfGitlab(); + } + else + { + binder << nullptr; + } + } + if(dirtyFlag_[2]) + { + if(getName()) + { + binder << getValueOfName(); + } + else + { + binder << nullptr; + } + } + if(dirtyFlag_[3]) + { + if(getPassword()) + { + binder << getValueOfPassword(); + } + else + { + binder << nullptr; + } + } + if(dirtyFlag_[4]) + { + if(getRole()) + { + binder << getValueOfRole(); + } + else + { + binder << nullptr; + } + } + if(dirtyFlag_[5]) + { + if(getRootId()) + { + binder << getValueOfRootId(); + } + else + { + binder << nullptr; + } + } + if(dirtyFlag_[6]) + { + if(getTfaType()) + { + binder << getValueOfTfaType(); + } + else + { + binder << nullptr; + } + } + if(dirtyFlag_[7]) + { + if(getTfaSecret()) + { + binder << getValueOfTfaSecret(); + } + else + { + binder << nullptr; + } + } + if(dirtyFlag_[8]) + { + if(getGitlabAt()) + { + binder << getValueOfGitlabAt(); + } + else + { + binder << nullptr; + } + } + if(dirtyFlag_[9]) + { + if(getGitlabRt()) + { + binder << getValueOfGitlabRt(); + } + else + { + binder << nullptr; + } + } +} +Json::Value User::toJson() const +{ + Json::Value ret; + if(getId()) + { + ret["id"]=(Json::UInt64)getValueOfId(); + } + else + { + ret["id"]=Json::Value(); + } + if(getGitlab()) + { + ret["gitlab"]=(Json::UInt64)getValueOfGitlab(); + } + else + { + ret["gitlab"]=Json::Value(); + } + if(getName()) + { + ret["name"]=getValueOfName(); + } + else + { + ret["name"]=Json::Value(); + } + if(getPassword()) + { + ret["password"]=getValueOfPassword(); + } + else + { + ret["password"]=Json::Value(); + } + if(getRole()) + { + ret["role"]=(Json::UInt64)getValueOfRole(); + } + else + { + ret["role"]=Json::Value(); + } + if(getRootId()) + { + ret["root_id"]=(Json::UInt64)getValueOfRootId(); + } + else + { + ret["root_id"]=Json::Value(); + } + if(getTfaType()) + { + ret["tfa_type"]=(Json::UInt64)getValueOfTfaType(); + } + else + { + ret["tfa_type"]=Json::Value(); + } + if(getTfaSecret()) + { + ret["tfa_secret"]=drogon::utils::base64Encode((const unsigned char *)getTfaSecret()->data(),getTfaSecret()->size()); + } + else + { + ret["tfa_secret"]=Json::Value(); + } + if(getGitlabAt()) + { + ret["gitlab_at"]=getValueOfGitlabAt(); + } + else + { + ret["gitlab_at"]=Json::Value(); + } + if(getGitlabRt()) + { + ret["gitlab_rt"]=getValueOfGitlabRt(); + } + else + { + ret["gitlab_rt"]=Json::Value(); + } + return ret; +} + +Json::Value User::toMasqueradedJson( + const std::vector &pMasqueradingVector) const +{ + Json::Value ret; + if(pMasqueradingVector.size() == 10) + { + if(!pMasqueradingVector[0].empty()) + { + if(getId()) + { + ret[pMasqueradingVector[0]]=(Json::UInt64)getValueOfId(); + } + else + { + ret[pMasqueradingVector[0]]=Json::Value(); + } + } + if(!pMasqueradingVector[1].empty()) + { + if(getGitlab()) + { + ret[pMasqueradingVector[1]]=(Json::UInt64)getValueOfGitlab(); + } + else + { + ret[pMasqueradingVector[1]]=Json::Value(); + } + } + if(!pMasqueradingVector[2].empty()) + { + if(getName()) + { + ret[pMasqueradingVector[2]]=getValueOfName(); + } + else + { + ret[pMasqueradingVector[2]]=Json::Value(); + } + } + if(!pMasqueradingVector[3].empty()) + { + if(getPassword()) + { + ret[pMasqueradingVector[3]]=getValueOfPassword(); + } + else + { + ret[pMasqueradingVector[3]]=Json::Value(); + } + } + if(!pMasqueradingVector[4].empty()) + { + if(getRole()) + { + ret[pMasqueradingVector[4]]=(Json::UInt64)getValueOfRole(); + } + else + { + ret[pMasqueradingVector[4]]=Json::Value(); + } + } + if(!pMasqueradingVector[5].empty()) + { + if(getRootId()) + { + ret[pMasqueradingVector[5]]=(Json::UInt64)getValueOfRootId(); + } + else + { + ret[pMasqueradingVector[5]]=Json::Value(); + } + } + if(!pMasqueradingVector[6].empty()) + { + if(getTfaType()) + { + ret[pMasqueradingVector[6]]=(Json::UInt64)getValueOfTfaType(); + } + else + { + ret[pMasqueradingVector[6]]=Json::Value(); + } + } + if(!pMasqueradingVector[7].empty()) + { + if(getTfaSecret()) + { + ret[pMasqueradingVector[7]]=drogon::utils::base64Encode((const unsigned char *)getTfaSecret()->data(),getTfaSecret()->size()); + } + else + { + ret[pMasqueradingVector[7]]=Json::Value(); + } + } + if(!pMasqueradingVector[8].empty()) + { + if(getGitlabAt()) + { + ret[pMasqueradingVector[8]]=getValueOfGitlabAt(); + } + else + { + ret[pMasqueradingVector[8]]=Json::Value(); + } + } + if(!pMasqueradingVector[9].empty()) + { + if(getGitlabRt()) + { + ret[pMasqueradingVector[9]]=getValueOfGitlabRt(); + } + else + { + ret[pMasqueradingVector[9]]=Json::Value(); + } + } + return ret; + } + LOG_ERROR << "Masquerade failed"; + if(getId()) + { + ret["id"]=(Json::UInt64)getValueOfId(); + } + else + { + ret["id"]=Json::Value(); + } + if(getGitlab()) + { + ret["gitlab"]=(Json::UInt64)getValueOfGitlab(); + } + else + { + ret["gitlab"]=Json::Value(); + } + if(getName()) + { + ret["name"]=getValueOfName(); + } + else + { + ret["name"]=Json::Value(); + } + if(getPassword()) + { + ret["password"]=getValueOfPassword(); + } + else + { + ret["password"]=Json::Value(); + } + if(getRole()) + { + ret["role"]=(Json::UInt64)getValueOfRole(); + } + else + { + ret["role"]=Json::Value(); + } + if(getRootId()) + { + ret["root_id"]=(Json::UInt64)getValueOfRootId(); + } + else + { + ret["root_id"]=Json::Value(); + } + if(getTfaType()) + { + ret["tfa_type"]=(Json::UInt64)getValueOfTfaType(); + } + else + { + ret["tfa_type"]=Json::Value(); + } + if(getTfaSecret()) + { + ret["tfa_secret"]=drogon::utils::base64Encode((const unsigned char *)getTfaSecret()->data(),getTfaSecret()->size()); + } + else + { + ret["tfa_secret"]=Json::Value(); + } + if(getGitlabAt()) + { + ret["gitlab_at"]=getValueOfGitlabAt(); + } + else + { + ret["gitlab_at"]=Json::Value(); + } + if(getGitlabRt()) + { + ret["gitlab_rt"]=getValueOfGitlabRt(); + } + else + { + ret["gitlab_rt"]=Json::Value(); + } + return ret; +} + +bool User::validateJsonForCreation(const Json::Value &pJson, std::string &err) +{ + if(pJson.isMember("id")) + { + if(!validJsonOfField(0, "id", pJson["id"], err, true)) + return false; + } + if(pJson.isMember("gitlab")) + { + if(!validJsonOfField(1, "gitlab", pJson["gitlab"], err, true)) + return false; + } + else + { + err="The gitlab column cannot be null"; + return false; + } + if(pJson.isMember("name")) + { + if(!validJsonOfField(2, "name", pJson["name"], err, true)) + return false; + } + else + { + err="The name column cannot be null"; + return false; + } + if(pJson.isMember("password")) + { + if(!validJsonOfField(3, "password", pJson["password"], err, true)) + return false; + } + else + { + err="The password column cannot be null"; + return false; + } + if(pJson.isMember("role")) + { + if(!validJsonOfField(4, "role", pJson["role"], err, true)) + return false; + } + else + { + err="The role column cannot be null"; + return false; + } + if(pJson.isMember("root_id")) + { + if(!validJsonOfField(5, "root_id", pJson["root_id"], err, true)) + return false; + } + else + { + err="The root_id column cannot be null"; + return false; + } + if(pJson.isMember("tfa_type")) + { + if(!validJsonOfField(6, "tfa_type", pJson["tfa_type"], err, true)) + return false; + } + else + { + err="The tfa_type column cannot be null"; + return false; + } + if(pJson.isMember("tfa_secret")) + { + if(!validJsonOfField(7, "tfa_secret", pJson["tfa_secret"], err, true)) + return false; + } + if(pJson.isMember("gitlab_at")) + { + if(!validJsonOfField(8, "gitlab_at", pJson["gitlab_at"], err, true)) + return false; + } + if(pJson.isMember("gitlab_rt")) + { + if(!validJsonOfField(9, "gitlab_rt", pJson["gitlab_rt"], err, true)) + return false; + } + return true; +} +bool User::validateMasqueradedJsonForCreation(const Json::Value &pJson, + const std::vector &pMasqueradingVector, + std::string &err) +{ + if(pMasqueradingVector.size() != 10) + { + err = "Bad masquerading vector"; + return false; + } + try { + if(!pMasqueradingVector[0].empty()) + { + if(pJson.isMember(pMasqueradingVector[0])) + { + if(!validJsonOfField(0, pMasqueradingVector[0], pJson[pMasqueradingVector[0]], err, true)) + return false; + } + } + if(!pMasqueradingVector[1].empty()) + { + if(pJson.isMember(pMasqueradingVector[1])) + { + if(!validJsonOfField(1, pMasqueradingVector[1], pJson[pMasqueradingVector[1]], err, true)) + return false; + } + else + { + err="The " + pMasqueradingVector[1] + " column cannot be null"; + return false; + } + } + if(!pMasqueradingVector[2].empty()) + { + if(pJson.isMember(pMasqueradingVector[2])) + { + if(!validJsonOfField(2, pMasqueradingVector[2], pJson[pMasqueradingVector[2]], err, true)) + return false; + } + else + { + err="The " + pMasqueradingVector[2] + " column cannot be null"; + return false; + } + } + if(!pMasqueradingVector[3].empty()) + { + if(pJson.isMember(pMasqueradingVector[3])) + { + if(!validJsonOfField(3, pMasqueradingVector[3], pJson[pMasqueradingVector[3]], err, true)) + return false; + } + else + { + err="The " + pMasqueradingVector[3] + " column cannot be null"; + return false; + } + } + if(!pMasqueradingVector[4].empty()) + { + if(pJson.isMember(pMasqueradingVector[4])) + { + if(!validJsonOfField(4, pMasqueradingVector[4], pJson[pMasqueradingVector[4]], err, true)) + return false; + } + else + { + err="The " + pMasqueradingVector[4] + " column cannot be null"; + return false; + } + } + if(!pMasqueradingVector[5].empty()) + { + if(pJson.isMember(pMasqueradingVector[5])) + { + if(!validJsonOfField(5, pMasqueradingVector[5], pJson[pMasqueradingVector[5]], err, true)) + return false; + } + else + { + err="The " + pMasqueradingVector[5] + " column cannot be null"; + return false; + } + } + if(!pMasqueradingVector[6].empty()) + { + if(pJson.isMember(pMasqueradingVector[6])) + { + if(!validJsonOfField(6, pMasqueradingVector[6], pJson[pMasqueradingVector[6]], err, true)) + return false; + } + else + { + err="The " + pMasqueradingVector[6] + " column cannot be null"; + return false; + } + } + if(!pMasqueradingVector[7].empty()) + { + if(pJson.isMember(pMasqueradingVector[7])) + { + if(!validJsonOfField(7, pMasqueradingVector[7], pJson[pMasqueradingVector[7]], err, true)) + return false; + } + } + if(!pMasqueradingVector[8].empty()) + { + if(pJson.isMember(pMasqueradingVector[8])) + { + if(!validJsonOfField(8, pMasqueradingVector[8], pJson[pMasqueradingVector[8]], err, true)) + return false; + } + } + if(!pMasqueradingVector[9].empty()) + { + if(pJson.isMember(pMasqueradingVector[9])) + { + if(!validJsonOfField(9, pMasqueradingVector[9], pJson[pMasqueradingVector[9]], err, true)) + return false; + } + } + } + catch(const Json::LogicError &e) + { + err = e.what(); + return false; + } + return true; +} +bool User::validateJsonForUpdate(const Json::Value &pJson, std::string &err) +{ + if(pJson.isMember("id")) + { + if(!validJsonOfField(0, "id", pJson["id"], err, false)) + return false; + } + else + { + err = "The value of primary key must be set in the json object for update"; + return false; + } + if(pJson.isMember("gitlab")) + { + if(!validJsonOfField(1, "gitlab", pJson["gitlab"], err, false)) + return false; + } + if(pJson.isMember("name")) + { + if(!validJsonOfField(2, "name", pJson["name"], err, false)) + return false; + } + if(pJson.isMember("password")) + { + if(!validJsonOfField(3, "password", pJson["password"], err, false)) + return false; + } + if(pJson.isMember("role")) + { + if(!validJsonOfField(4, "role", pJson["role"], err, false)) + return false; + } + if(pJson.isMember("root_id")) + { + if(!validJsonOfField(5, "root_id", pJson["root_id"], err, false)) + return false; + } + if(pJson.isMember("tfa_type")) + { + if(!validJsonOfField(6, "tfa_type", pJson["tfa_type"], err, false)) + return false; + } + if(pJson.isMember("tfa_secret")) + { + if(!validJsonOfField(7, "tfa_secret", pJson["tfa_secret"], err, false)) + return false; + } + if(pJson.isMember("gitlab_at")) + { + if(!validJsonOfField(8, "gitlab_at", pJson["gitlab_at"], err, false)) + return false; + } + if(pJson.isMember("gitlab_rt")) + { + if(!validJsonOfField(9, "gitlab_rt", pJson["gitlab_rt"], err, false)) + return false; + } + return true; +} +bool User::validateMasqueradedJsonForUpdate(const Json::Value &pJson, + const std::vector &pMasqueradingVector, + std::string &err) +{ + if(pMasqueradingVector.size() != 10) + { + err = "Bad masquerading vector"; + return false; + } + try { + if(!pMasqueradingVector[0].empty() && pJson.isMember(pMasqueradingVector[0])) + { + if(!validJsonOfField(0, pMasqueradingVector[0], pJson[pMasqueradingVector[0]], err, false)) + return false; + } + else + { + err = "The value of primary key must be set in the json object for update"; + return false; + } + if(!pMasqueradingVector[1].empty() && pJson.isMember(pMasqueradingVector[1])) + { + if(!validJsonOfField(1, pMasqueradingVector[1], pJson[pMasqueradingVector[1]], err, false)) + return false; + } + if(!pMasqueradingVector[2].empty() && pJson.isMember(pMasqueradingVector[2])) + { + if(!validJsonOfField(2, pMasqueradingVector[2], pJson[pMasqueradingVector[2]], err, false)) + return false; + } + if(!pMasqueradingVector[3].empty() && pJson.isMember(pMasqueradingVector[3])) + { + if(!validJsonOfField(3, pMasqueradingVector[3], pJson[pMasqueradingVector[3]], err, false)) + return false; + } + if(!pMasqueradingVector[4].empty() && pJson.isMember(pMasqueradingVector[4])) + { + if(!validJsonOfField(4, pMasqueradingVector[4], pJson[pMasqueradingVector[4]], err, false)) + return false; + } + if(!pMasqueradingVector[5].empty() && pJson.isMember(pMasqueradingVector[5])) + { + if(!validJsonOfField(5, pMasqueradingVector[5], pJson[pMasqueradingVector[5]], err, false)) + return false; + } + if(!pMasqueradingVector[6].empty() && pJson.isMember(pMasqueradingVector[6])) + { + if(!validJsonOfField(6, pMasqueradingVector[6], pJson[pMasqueradingVector[6]], err, false)) + return false; + } + if(!pMasqueradingVector[7].empty() && pJson.isMember(pMasqueradingVector[7])) + { + if(!validJsonOfField(7, pMasqueradingVector[7], pJson[pMasqueradingVector[7]], err, false)) + return false; + } + if(!pMasqueradingVector[8].empty() && pJson.isMember(pMasqueradingVector[8])) + { + if(!validJsonOfField(8, pMasqueradingVector[8], pJson[pMasqueradingVector[8]], err, false)) + return false; + } + if(!pMasqueradingVector[9].empty() && pJson.isMember(pMasqueradingVector[9])) + { + if(!validJsonOfField(9, pMasqueradingVector[9], pJson[pMasqueradingVector[9]], err, false)) + return false; + } + } + catch(const Json::LogicError &e) + { + err = e.what(); + return false; + } + return true; +} +bool User::validJsonOfField(size_t index, + const std::string &fieldName, + const Json::Value &pJson, + std::string &err, + bool isForCreation) +{ + switch(index) + { + case 0: + if(pJson.isNull()) + { + err="The " + fieldName + " column cannot be null"; + return false; + } + if(isForCreation) + { + err="The automatic primary key cannot be set"; + return false; + } + if(!pJson.isUInt64()) + { + err="Type error in the "+fieldName+" field"; + return false; + } + break; + case 1: + if(pJson.isNull()) + { + err="The " + fieldName + " column cannot be null"; + return false; + } + if(!pJson.isUInt64()) + { + err="Type error in the "+fieldName+" field"; + return false; + } + break; + case 2: + if(pJson.isNull()) + { + err="The " + fieldName + " column cannot be null"; + return false; + } + if(!pJson.isString()) + { + err="Type error in the "+fieldName+" field"; + return false; + } + break; + case 3: + if(pJson.isNull()) + { + err="The " + fieldName + " column cannot be null"; + return false; + } + if(!pJson.isString()) + { + err="Type error in the "+fieldName+" field"; + return false; + } + break; + case 4: + if(pJson.isNull()) + { + err="The " + fieldName + " column cannot be null"; + return false; + } + if(!pJson.isUInt64()) + { + err="Type error in the "+fieldName+" field"; + return false; + } + break; + case 5: + if(pJson.isNull()) + { + err="The " + fieldName + " column cannot be null"; + return false; + } + if(!pJson.isUInt64()) + { + err="Type error in the "+fieldName+" field"; + return false; + } + break; + case 6: + if(pJson.isNull()) + { + err="The " + fieldName + " column cannot be null"; + return false; + } + if(!pJson.isUInt64()) + { + err="Type error in the "+fieldName+" field"; + return false; + } + break; + case 7: + if(pJson.isNull()) + { + return true; + } + if(!pJson.isString()) + { + err="Type error in the "+fieldName+" field"; + return false; + } + break; + case 8: + if(pJson.isNull()) + { + return true; + } + if(!pJson.isString()) + { + err="Type error in the "+fieldName+" field"; + return false; + } + break; + case 9: + if(pJson.isNull()) + { + return true; + } + if(!pJson.isString()) + { + err="Type error in the "+fieldName+" field"; + return false; + } + break; + default: + err="Internal error in the server"; + return false; + break; + } + return true; +} diff --git a/backend/src/db/model/User.h b/backend/src/db/model/User.h new file mode 100644 index 0000000..8f13e8a --- /dev/null +++ b/backend/src/db/model/User.h @@ -0,0 +1,361 @@ +/** + * + * User.h + * DO NOT EDIT. This file is generated by drogon_ctl + * + */ + +#pragma once +#include +#include +#include +#include +#include +#ifdef __cpp_impl_coroutine +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace drogon +{ +namespace orm +{ +class DbClient; +using DbClientPtr = std::shared_ptr; +} +} +namespace drogon_model +{ +namespace sqlite3 +{ + +class User +{ + public: + struct Cols + { + static const std::string _id; + static const std::string _gitlab; + static const std::string _name; + static const std::string _password; + static const std::string _role; + static const std::string _root_id; + static const std::string _tfa_type; + static const std::string _tfa_secret; + static const std::string _gitlab_at; + static const std::string _gitlab_rt; + }; + + const static int primaryKeyNumber; + const static std::string tableName; + const static bool hasPrimaryKey; + const static std::string primaryKeyName; + using PrimaryKeyType = uint64_t; + const PrimaryKeyType &getPrimaryKey() const; + + /** + * @brief constructor + * @param r One row of records in the SQL query result. + * @param indexOffset Set the offset to -1 to access all columns by column names, + * otherwise access all columns by offsets. + * @note If the SQL is not a style of 'select * from table_name ...' (select all + * columns by an asterisk), please set the offset to -1. + */ + explicit User(const drogon::orm::Row &r, const ssize_t indexOffset = 0) noexcept; + + /** + * @brief constructor + * @param pJson The json object to construct a new instance. + */ + explicit User(const Json::Value &pJson) noexcept(false); + + /** + * @brief constructor + * @param pJson The json object to construct a new instance. + * @param pMasqueradingVector The aliases of table columns. + */ + User(const Json::Value &pJson, const std::vector &pMasqueradingVector) noexcept(false); + + User() = default; + + void updateByJson(const Json::Value &pJson) noexcept(false); + void updateByMasqueradedJson(const Json::Value &pJson, + const std::vector &pMasqueradingVector) noexcept(false); + static bool validateJsonForCreation(const Json::Value &pJson, std::string &err); + static bool validateMasqueradedJsonForCreation(const Json::Value &, + const std::vector &pMasqueradingVector, + std::string &err); + static bool validateJsonForUpdate(const Json::Value &pJson, std::string &err); + static bool validateMasqueradedJsonForUpdate(const Json::Value &, + const std::vector &pMasqueradingVector, + std::string &err); + static bool validJsonOfField(size_t index, + const std::string &fieldName, + const Json::Value &pJson, + std::string &err, + bool isForCreation); + + /** For column id */ + ///Get the value of the column id, returns the default value if the column is null + const uint64_t &getValueOfId() const noexcept; + ///Return a shared_ptr object pointing to the column const value, or an empty shared_ptr object if the column is null + const std::shared_ptr &getId() const noexcept; + ///Set the value of the column id + void setId(const uint64_t &pId) noexcept; + + /** For column gitlab */ + ///Get the value of the column gitlab, returns the default value if the column is null + const uint64_t &getValueOfGitlab() const noexcept; + ///Return a shared_ptr object pointing to the column const value, or an empty shared_ptr object if the column is null + const std::shared_ptr &getGitlab() const noexcept; + ///Set the value of the column gitlab + void setGitlab(const uint64_t &pGitlab) noexcept; + + /** For column name */ + ///Get the value of the column name, returns the default value if the column is null + const std::string &getValueOfName() const noexcept; + ///Return a shared_ptr object pointing to the column const value, or an empty shared_ptr object if the column is null + const std::shared_ptr &getName() const noexcept; + ///Set the value of the column name + void setName(const std::string &pName) noexcept; + void setName(std::string &&pName) noexcept; + + /** For column password */ + ///Get the value of the column password, returns the default value if the column is null + const std::string &getValueOfPassword() const noexcept; + ///Return a shared_ptr object pointing to the column const value, or an empty shared_ptr object if the column is null + const std::shared_ptr &getPassword() const noexcept; + ///Set the value of the column password + void setPassword(const std::string &pPassword) noexcept; + void setPassword(std::string &&pPassword) noexcept; + + /** For column role */ + ///Get the value of the column role, returns the default value if the column is null + const uint64_t &getValueOfRole() const noexcept; + ///Return a shared_ptr object pointing to the column const value, or an empty shared_ptr object if the column is null + const std::shared_ptr &getRole() const noexcept; + ///Set the value of the column role + void setRole(const uint64_t &pRole) noexcept; + + /** For column root_id */ + ///Get the value of the column root_id, returns the default value if the column is null + const uint64_t &getValueOfRootId() const noexcept; + ///Return a shared_ptr object pointing to the column const value, or an empty shared_ptr object if the column is null + const std::shared_ptr &getRootId() const noexcept; + ///Set the value of the column root_id + void setRootId(const uint64_t &pRootId) noexcept; + + /** For column tfa_type */ + ///Get the value of the column tfa_type, returns the default value if the column is null + const uint64_t &getValueOfTfaType() const noexcept; + ///Return a shared_ptr object pointing to the column const value, or an empty shared_ptr object if the column is null + const std::shared_ptr &getTfaType() const noexcept; + ///Set the value of the column tfa_type + void setTfaType(const uint64_t &pTfaType) noexcept; + + /** For column tfa_secret */ + ///Get the value of the column tfa_secret, returns the default value if the column is null + const std::vector &getValueOfTfaSecret() const noexcept; + ///Return the column value by std::string with binary data + std::string getValueOfTfaSecretAsString() const noexcept; + ///Return a shared_ptr object pointing to the column const value, or an empty shared_ptr object if the column is null + const std::shared_ptr> &getTfaSecret() const noexcept; + ///Set the value of the column tfa_secret + void setTfaSecret(const std::vector &pTfaSecret) noexcept; + void setTfaSecret(const std::string &pTfaSecret) noexcept; + void setTfaSecretToNull() noexcept; + + /** For column gitlab_at */ + ///Get the value of the column gitlab_at, returns the default value if the column is null + const std::string &getValueOfGitlabAt() const noexcept; + ///Return a shared_ptr object pointing to the column const value, or an empty shared_ptr object if the column is null + const std::shared_ptr &getGitlabAt() const noexcept; + ///Set the value of the column gitlab_at + void setGitlabAt(const std::string &pGitlabAt) noexcept; + void setGitlabAt(std::string &&pGitlabAt) noexcept; + void setGitlabAtToNull() noexcept; + + /** For column gitlab_rt */ + ///Get the value of the column gitlab_rt, returns the default value if the column is null + const std::string &getValueOfGitlabRt() const noexcept; + ///Return a shared_ptr object pointing to the column const value, or an empty shared_ptr object if the column is null + const std::shared_ptr &getGitlabRt() const noexcept; + ///Set the value of the column gitlab_rt + void setGitlabRt(const std::string &pGitlabRt) noexcept; + void setGitlabRt(std::string &&pGitlabRt) noexcept; + void setGitlabRtToNull() noexcept; + + + static size_t getColumnNumber() noexcept { return 10; } + static const std::string &getColumnName(size_t index) noexcept(false); + + Json::Value toJson() const; + Json::Value toMasqueradedJson(const std::vector &pMasqueradingVector) const; + /// Relationship interfaces + private: + friend drogon::orm::Mapper; +#ifdef __cpp_impl_coroutine + friend drogon::orm::CoroMapper; +#endif + static const std::vector &insertColumns() noexcept; + void outputArgs(drogon::orm::internal::SqlBinder &binder) const; + const std::vector updateColumns() const; + void updateArgs(drogon::orm::internal::SqlBinder &binder) const; + ///For mysql or sqlite3 + void updateId(const uint64_t id); + std::shared_ptr id_; + std::shared_ptr gitlab_; + std::shared_ptr name_; + std::shared_ptr password_; + std::shared_ptr role_; + std::shared_ptr rootId_; + std::shared_ptr tfaType_; + std::shared_ptr> tfaSecret_; + std::shared_ptr gitlabAt_; + std::shared_ptr gitlabRt_; + struct MetaData + { + const std::string colName_; + const std::string colType_; + const std::string colDatabaseType_; + const ssize_t colLength_; + const bool isAutoVal_; + const bool isPrimaryKey_; + const bool notNull_; + }; + static const std::vector metaData_; + bool dirtyFlag_[10]={ false }; + public: + static const std::string &sqlForFindingByPrimaryKey() + { + static const std::string sql="select * from " + tableName + " where id = ?"; + return sql; + } + + static const std::string &sqlForDeletingByPrimaryKey() + { + static const std::string sql="delete from " + tableName + " where id = ?"; + return sql; + } + std::string sqlForInserting(bool &needSelection) const + { + std::string sql="insert into " + tableName + " ("; + size_t parametersCount = 0; + needSelection = false; + if(dirtyFlag_[1]) + { + sql += "gitlab,"; + ++parametersCount; + } + if(dirtyFlag_[2]) + { + sql += "name,"; + ++parametersCount; + } + if(dirtyFlag_[3]) + { + sql += "password,"; + ++parametersCount; + } + if(dirtyFlag_[4]) + { + sql += "role,"; + ++parametersCount; + } + if(dirtyFlag_[5]) + { + sql += "root_id,"; + ++parametersCount; + } + if(dirtyFlag_[6]) + { + sql += "tfa_type,"; + ++parametersCount; + } + if(dirtyFlag_[7]) + { + sql += "tfa_secret,"; + ++parametersCount; + } + if(dirtyFlag_[8]) + { + sql += "gitlab_at,"; + ++parametersCount; + } + if(dirtyFlag_[9]) + { + sql += "gitlab_rt,"; + ++parametersCount; + } + if(parametersCount > 0) + { + sql[sql.length()-1]=')'; + sql += " values ("; + } + else + sql += ") values ("; + + if(dirtyFlag_[1]) + { + sql.append("?,"); + + } + if(dirtyFlag_[2]) + { + sql.append("?,"); + + } + if(dirtyFlag_[3]) + { + sql.append("?,"); + + } + if(dirtyFlag_[4]) + { + sql.append("?,"); + + } + if(dirtyFlag_[5]) + { + sql.append("?,"); + + } + if(dirtyFlag_[6]) + { + sql.append("?,"); + + } + if(dirtyFlag_[7]) + { + sql.append("?,"); + + } + if(dirtyFlag_[8]) + { + sql.append("?,"); + + } + if(dirtyFlag_[9]) + { + sql.append("?,"); + + } + if(parametersCount > 0) + { + sql.resize(sql.length() - 1); + } + sql.append(1, ')'); + LOG_TRACE << sql; + return sql; + } +}; +} // namespace sqlite3 +} // namespace drogon_model diff --git a/backend/src/db/model/model.json b/backend/src/db/model/model.json new file mode 100644 index 0000000..1c40e75 --- /dev/null +++ b/backend/src/db/model/model.json @@ -0,0 +1,5 @@ +{ + "rdbms":"sqlite3", + "filename":"run/sqlite.db", + "tables":[] +} \ No newline at end of file diff --git a/backend/src/dto/dto.h b/backend/src/dto/dto.h new file mode 100644 index 0000000..46ea9d9 --- /dev/null +++ b/backend/src/dto/dto.h @@ -0,0 +1,56 @@ +#ifndef BACKEND_DTO_H +#define BACKEND_DTO_H + +#include +#include "db/db.h" + +namespace dto { + template + std::optional json_get(const Json::Value& j, const std::string& key) { + return j.isMember(key) + ? std::make_optional(j[key].as()) + : std::nullopt; + } + + inline db::User get_user(const drogon::HttpRequestPtr& req) { + return req->attributes()->get("user"); + } + + inline db::Token get_token(const drogon::HttpRequestPtr& req) { + return req->attributes()->get("token"); + } + + namespace Responses { + struct GetUsersEntry { + GetUsersEntry(int id, bool gitlab, bool tfa, std::string name, db::UserRole role) + : id(id), gitlab(gitlab), tfa(tfa), name(std::move(name)), role(role) {} + int id; + bool gitlab, tfa; + std::string name; + db::UserRole role; + }; + + drogon::HttpResponsePtr get_error_res(drogon::HttpStatusCode, const std::string &msg); + drogon::HttpResponsePtr get_success_res(); + drogon::HttpResponsePtr get_success_res(Json::Value &); + + inline drogon::HttpResponsePtr get_badreq_res(const std::string &msg) { return get_error_res(drogon::HttpStatusCode::k400BadRequest, msg); } + inline drogon::HttpResponsePtr get_unauth_res(const std::string &msg) { return get_error_res(drogon::HttpStatusCode::k401Unauthorized, msg); } + inline drogon::HttpResponsePtr get_forbdn_res(const std::string &msg) { return get_error_res(drogon::HttpStatusCode::k403Forbidden, msg); } + + drogon::HttpResponsePtr get_login_res(const std::string &jwt); + drogon::HttpResponsePtr get_tfa_setup_res(const std::string& secret, const std::string& qrcode); + + drogon::HttpResponsePtr get_user_info_res(const std::string& name, bool gitlab, bool tfa); + + drogon::HttpResponsePtr get_admin_users_res(const std::vector& users); + + drogon::HttpResponsePtr get_root_res(uint64_t root); + drogon::HttpResponsePtr get_node_folder_res(uint64_t id, const std::string& name, const std::shared_ptr& parent, const std::vector& children); + drogon::HttpResponsePtr get_node_file_res(uint64_t id, const std::string& name, const std::shared_ptr& parent, uint64_t size); + drogon::HttpResponsePtr get_path_res(const std::string& path); + drogon::HttpResponsePtr get_new_node_res(uint64_t id); + } +} + +#endif //BACKEND_DTO_H diff --git a/backend/src/dto/responses.cpp b/backend/src/dto/responses.cpp new file mode 100644 index 0000000..e0abff3 --- /dev/null +++ b/backend/src/dto/responses.cpp @@ -0,0 +1,98 @@ +#include "dto.h" + +namespace dto::Responses { + drogon::HttpResponsePtr get_error_res(drogon::HttpStatusCode code, const std::string& msg) { + Json::Value json; + json["statusCode"] = static_cast(code); + json["message"] = msg; + auto res = drogon::HttpResponse::newHttpJsonResponse(json); + res->setStatusCode(code); + return res; + } + + drogon::HttpResponsePtr get_success_res() { + Json::Value json; + return get_success_res(json); + } + + drogon::HttpResponsePtr get_success_res(Json::Value& json) { + json["statusCode"] = 200; + auto res = drogon::HttpResponse::newHttpJsonResponse(json); + res->setStatusCode(drogon::HttpStatusCode::k200OK); + return res; + } + + drogon::HttpResponsePtr get_login_res(const std::string &jwt) { + Json::Value json; + json["jwt"] = jwt; + return get_success_res(json); + } + + drogon::HttpResponsePtr get_tfa_setup_res(const std::string& secret, const std::string& qrcode) { + Json::Value json; + json["secret"] = secret; + json["qrCode"] = qrcode; + return get_success_res(json); + } + + drogon::HttpResponsePtr get_user_info_res(const std::string &name, bool gitlab, bool tfa) { + Json::Value json; + json["name"] = name; + json["gitlab"] = gitlab; + json["tfaEnabled"] = tfa; + return get_success_res(json); + } + + drogon::HttpResponsePtr get_admin_users_res(const std::vector& users) { + Json::Value json; + for (const GetUsersEntry& user : users) { + Json::Value entry; + entry["id"] = user.id; + entry["gitlab"] = user.gitlab; + entry["name"] = user.name; + entry["role"] = user.role; + entry["tfaEnabled"] = user.tfa; + json["users"].append(entry); + } + return get_success_res(json); + } + + drogon::HttpResponsePtr get_root_res(uint64_t root) { + Json::Value json; + json["rootId"] = root; + return get_success_res(json); + } + + drogon::HttpResponsePtr get_node_folder_res(uint64_t id, const std::string &name, const std::shared_ptr &parent, const std::vector &children) { + Json::Value json; + json["id"] = id; + json["name"] = name; + json["isFile"] = false; + json["parent"] = (parent != nullptr) ? *parent : Json::Value::nullSingleton(); + for (uint64_t child : children) + json["children"].append(child); + return get_success_res(json); + } + + drogon::HttpResponsePtr get_node_file_res(uint64_t id, const std::string &name, const std::shared_ptr &parent, uint64_t size) { + Json::Value json; + json["id"] = id; + json["name"] = name; + json["isFile"] = true; + json["parent"] = (parent != nullptr) ? *parent : Json::Value::nullSingleton(); + json["size"] = size; + return get_success_res(json); + } + + drogon::HttpResponsePtr get_path_res(const std::string& path) { + Json::Value json; + json["path"] = path; + return get_success_res(json); + } + + drogon::HttpResponsePtr get_new_node_res(uint64_t id) { + Json::Value json; + json["id"] = id; + return get_success_res(json); + } +} diff --git a/backend/src/filters/filters.cpp b/backend/src/filters/filters.cpp new file mode 100644 index 0000000..471a36f --- /dev/null +++ b/backend/src/filters/filters.cpp @@ -0,0 +1,82 @@ +#include "filters.h" + +#include +#include +#include +#include "db/db.h" +#include "dto/dto.h" +#include "controllers/controllers.h" + +void cleanup_tokens(db::MapperToken& mapper) { + const uint64_t now = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); + mapper.deleteBy( + db::Criteria(db::Token::Cols::_exp, db::CompareOps::LE, now) + ); +} + +void Login::doFilter(const drogon::HttpRequestPtr& req, drogon::FilterCallback&& cb, drogon::FilterChainCallback&& ccb) { + std::string token_str; + if (req->path() == "/api/fs/download") { + token_str = req->getParameter("jwtToken"); + } else { + std::string auth_header = req->getHeader("Authorization"); + if (auth_header.empty() || (!auth_header.starts_with("Bearer "))) + return cb(dto::Responses::get_unauth_res("Unauthorized")); + token_str = auth_header.substr(7); + } + try { + auto token = jwt::decode(token_str); + jwt::verify() + .allow_algorithm(jwt::algorithm::hs256{jwt_secret}) + .verify(token); + uint64_t token_id = token.get_payload_claim("jti").as_int(); + uint64_t user_id = token.get_payload_claim("sub").as_int(); + + auto db = drogon::app().getDbClient(); + + db::MapperUser user_mapper(db); + db::MapperToken token_mapper(db); + + cleanup_tokens(token_mapper); + + db::Token db_token = token_mapper.findByPrimaryKey(token_id); + db::User db_user = user_mapper.findByPrimaryKey(db_token.getValueOfOwnerId()); + + if (db_user.getValueOfId() != user_id) throw std::exception(); + if (db::User_getEnumRole(db_user) == db::UserRole::DISABLED) throw std::exception(); + + if (db_user.getValueOfGitlab() != 0) { + auto info = api::auth::get_gitlab_user(db_user.getValueOfGitlabAt()); + if (!info.has_value()) { + auto tokens = api::auth::get_gitlab_tokens(req, db_user.getValueOfGitlabRt(), true); + info = api::auth::get_gitlab_user(tokens->at); + if (!tokens.has_value() || !info.has_value()) { + api::auth::revoke_all(db_user); + throw std::exception(); + } + db_user.setGitlabAt(tokens->at); + db_user.setGitlabRt(tokens->rt); + user_mapper.update(db_user); + } + if (info->name != db_user.getValueOfName()) { + api::auth::revoke_all(db_user); + throw std::exception(); + } + } + + req->attributes()->insert("token", db_token); + req->attributes()->insert("user", db_user); + ccb(); + } catch (const std::exception&) { + cb(dto::Responses::get_unauth_res("Unauthorized")); + } +} + +void Admin::doFilter(const drogon::HttpRequestPtr& req, drogon::FilterCallback&& cb, drogon::FilterChainCallback&& ccb) { + db::User user = dto::get_user(req); + + if (db::User_getEnumRole(user) != db::UserRole::ADMIN) + cb(dto::Responses::get_forbdn_res("Forbidden")); + else + ccb(); +} diff --git a/backend/src/filters/filters.h b/backend/src/filters/filters.h new file mode 100644 index 0000000..c6b3c5f --- /dev/null +++ b/backend/src/filters/filters.h @@ -0,0 +1,14 @@ +#ifndef BACKEND_FILTERS_H +#define BACKEND_FILTERS_H + +#include + +struct Login : public drogon::HttpFilter { + void doFilter(const drogon::HttpRequestPtr&, drogon::FilterCallback&&, drogon::FilterChainCallback&&) override; +}; + +struct Admin : public drogon::HttpFilter { + void doFilter(const drogon::HttpRequestPtr&, drogon::FilterCallback&&, drogon::FilterChainCallback&&) override; +}; + +#endif //BACKEND_FILTERS_H diff --git a/backend/src/main.cpp b/backend/src/main.cpp new file mode 100644 index 0000000..c1186a8 --- /dev/null +++ b/backend/src/main.cpp @@ -0,0 +1,112 @@ +#include + +#include +#include + +#include "dto/dto.h" + +void cleanup() { + std::cout << "Stopping..." << std::endl; + drogon::app().quit(); + std::cout << "Cleanup up uploads..."; + std::filesystem::remove_all("uploads"); + std::cout << " [Done]" << std::endl; + std::cout << "Goodbye!" << std::endl; +} + +int main() { + std::cout << "Setting up..." << std::endl; + std::cout << "Initializing curl..." << std::flush; + curl_global_init(CURL_GLOBAL_ALL); + std::cout << " [Done]" << std::endl; + if (!std::filesystem::exists("files")) { + std::cout << "Creating files..." << std::flush; + std::filesystem::create_directory("files"); + std::cout << " [Done]" << std::endl; + } + if (!std::filesystem::exists("logs")) { + std::cout << "Creating logs..." << std::flush; + std::filesystem::create_directory("logs"); + std::cout << " [Done]" << std::endl; + } + + auto* loop = drogon::app().getLoop(); + loop->queueInLoop([]{ + std::cout << "Starting..." << std::endl; + std::cout << "Creating db tables..." << std::flush; + auto db = drogon::app().getDbClient(); + db->execSqlSync("CREATE TABLE IF NOT EXISTS 'tokens' (\n" + " 'id' INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,\n" + " 'owner_id' INTEGER NOT NULL,\n" + " 'exp' INTEGER NOT NULL\n" + ")"); + db->execSqlSync("CREATE TABLE IF NOT EXISTS 'user' (\n" + " 'id' INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,\n" + " 'gitlab' INTEGER NOT NULL,\n" + " 'name' TEXT NOT NULL,\n" + " 'password' TEXT NOT NULL,\n" + " 'role' INTEGER NOT NULL,\n" + " 'root_id' INTEGER NOT NULL,\n" + " 'tfa_type' INTEGER NOT NULL,\n" + " 'tfa_secret' BLOB,\n" + " 'gitlab_at' TEXT,\n" + " 'gitlab_rt' TEXT\n" + ")"); + db->execSqlSync("CREATE TABLE IF NOT EXISTS 'inode' (\n" + " 'id' INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,\n" + " 'is_file' INTEGER NOT NULL,\n" + " 'name' TEXT,\n" + " 'parent_id' INTEGER,\n" + " 'owner_id' INTEGER NOT NULL,\n" + " 'size' INTEGER\n" + ")"); + std::cout << " [Done]" << std::endl; + std::cout << "Started!" << std::endl; + std::cout << "Registered paths: " << std::endl; + auto handlers = drogon::app().getHandlersInfo(); + for (const auto& handler : handlers) { + std::cout << " "; + if (std::get<1>(handler) == drogon::HttpMethod::Post) std::cout << "POST "; + else std::cout << "GET "; + std::string func = std::get<2>(handler).substr(16); + func.resize(30, ' '); + std::cout << '[' << func << "] "; + std::cout << std::get<0>(handler) << std::endl; + } + std::cout << "Listening on:" << std::endl; + auto listeners = drogon::app().getListeners(); + for (const auto& listener : listeners) { + std::cout << " " << listener.toIpPort() << std::endl; + } + }); + + Json::Value access_logger; + access_logger["name"] = "drogon::plugin::AccessLogger"; + + Json::Value config; + config["plugins"].append(access_logger); + + drogon::app() + .setClientMaxBodySize(1024L * 1024L * 1024L * 1024L) // 1 TB + + .loadConfigJson(config) + + .createDbClient("sqlite3", "", 0, "", "", "", 1, "sqlite.db") + + .setCustom404Page(drogon::HttpResponse::newFileResponse("./static/index.html"), false) + .setDocumentRoot("./static") + .setBrStatic(true) + .setStaticFilesCacheTime(0) + + .setLogPath("./logs") + .setLogLevel(trantor::Logger::LogLevel::kDebug) + + .setIntSignalHandler(cleanup) + .setTermSignalHandler(cleanup) + + .addListener("0.0.0.0", 1234) + .setThreadNum(2); + std::cout << "Setup done!" << std::endl; + + drogon::app().run(); +} \ No newline at end of file diff --git a/backend/vcpkg.json b/backend/vcpkg.json new file mode 100644 index 0000000..5027b25 --- /dev/null +++ b/backend/vcpkg.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://raw.githubusercontent.com/microsoft/vcpkg/master/scripts/vcpkg.schema.json", + "name": "backend", + "version-string": "1.0.0", + "dependencies": [ + { + "name": "drogon", + "features": ["orm", "sqlite3"] + }, + "jwt-cpp", + "botan", + "curl", + "pngpp", + "nayuki-qr-code-generator", + "libpng" + ] +} \ No newline at end of file diff --git a/dto/index.ts b/dto/index.ts deleted file mode 100644 index 704c086..0000000 --- a/dto/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -export * as Requests from './requests'; -export * as Responses from './responses'; -export { - UserRole, - validateSync, - validateAsync, - validateAsyncInline -} from './utils'; diff --git a/dto/requests/admin.ts b/dto/requests/admin.ts deleted file mode 100644 index c91071c..0000000 --- a/dto/requests/admin.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { BaseRequest } from './base'; -import { IsEnum, IsNumber } from 'class-validator'; -import { UserRole } from '../utils'; - -class AdminRequest extends BaseRequest { - @IsNumber() - user: number; -} - -export class SetUserRole extends AdminRequest { - @IsEnum(UserRole) - role: UserRole; -} - -export class LogoutAll extends AdminRequest {} -export class DeleteUser extends AdminRequest {} -export class DisableTfa extends AdminRequest {} diff --git a/dto/requests/auth.ts b/dto/requests/auth.ts deleted file mode 100644 index 50ed258..0000000 --- a/dto/requests/auth.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { BaseRequest } from './base'; -import { - IsBoolean, - IsEmail, - IsNotEmpty, - IsOptional, - IsString -} from 'class-validator'; - -export class SignUpRequest extends BaseRequest { - @IsEmail() - username: string; - - @IsNotEmpty() - @IsString() - password: string; -} - -export class LoginRequest extends SignUpRequest { - @IsOptional() - @IsNotEmpty() - @IsString() - otp?: string; -} - -export class TfaSetup extends BaseRequest { - @IsNotEmpty() - @IsBoolean() - mail: boolean; -} - -export class TfaComplete extends BaseRequest { - @IsNotEmpty() - @IsBoolean() - mail: boolean; - - @IsNotEmpty() - @IsString() - code: string; -} - -export class ChangePasswordRequest extends BaseRequest { - @IsNotEmpty() - @IsString() - oldPassword: string; - - @IsNotEmpty() - @IsString() - newPassword: string; -} diff --git a/dto/requests/fs.ts b/dto/requests/fs.ts deleted file mode 100644 index 08ca1ba..0000000 --- a/dto/requests/fs.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { BaseRequest } from './base'; -import { IsInt, IsNotEmpty, IsString, Min } from 'class-validator'; - -export class CreateFolderRequest extends BaseRequest { - @IsInt() - @Min(1) - parent: number; - - @IsNotEmpty() - @IsString() - name: string; -} - -export class DeleteRequest extends BaseRequest { - @IsInt() - @Min(1) - node: number; -} - -export class CreateFileRequest extends CreateFolderRequest {} diff --git a/dto/requests/index.ts b/dto/requests/index.ts deleted file mode 100644 index 684e96f..0000000 --- a/dto/requests/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from './base'; -export * as Auth from './auth'; -export * as FS from './fs'; -export * as Admin from './admin'; diff --git a/dto/responses/admin.ts b/dto/responses/admin.ts deleted file mode 100644 index f62183b..0000000 --- a/dto/responses/admin.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { SuccessResponse } from './base'; -import { - IsArray, - IsBoolean, - IsEnum, - IsNotEmpty, - IsNumber, - IsString, - ValidateNested -} from 'class-validator'; -import { UserRole, ValidateConstructor } from '../utils'; - -@ValidateConstructor -export class GetUsersEntry { - constructor( - id: number, - gitlab: boolean, - name: string, - role: UserRole, - tfaEnabled: boolean - ) { - this.id = id; - this.gitlab = gitlab; - this.name = name; - this.role = role; - this.tfaEnabled = tfaEnabled; - } - - @IsNumber() - id: number; - - @IsBoolean() - gitlab: boolean; - - @IsString() - @IsNotEmpty() - name: string; - - @IsEnum(UserRole) - role: UserRole; - - @IsBoolean() - tfaEnabled: boolean; -} - -@ValidateConstructor -export class GetUsers extends SuccessResponse { - constructor(users: GetUsersEntry[]) { - super(); - this.users = users; - } - - @IsArray() - @ValidateNested({ each: true }) - users: GetUsersEntry[]; -} - -export class LogoutAllUser extends SuccessResponse {} -export class DeleteUser extends SuccessResponse {} -export class SetUserRole extends SuccessResponse {} -export class DisableTfa extends SuccessResponse {} diff --git a/dto/responses/base.ts b/dto/responses/base.ts deleted file mode 100644 index 7667e40..0000000 --- a/dto/responses/base.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { IsNumber, Max, Min } from 'class-validator'; - -export class BaseResponse { - constructor(statusCode: number) { - this.statusCode = statusCode; - } - - @IsNumber() - @Min(100) - @Max(599) - statusCode: number; -} - -export class SuccessResponse extends BaseResponse { - constructor() { - super(200); - } - - declare statusCode: 200; -} - -export class ErrorResponse extends BaseResponse { - declare statusCode: 400 | 401 | 403; - message?: string; -} diff --git a/dto/responses/fs.ts b/dto/responses/fs.ts deleted file mode 100644 index 2ecb48c..0000000 --- a/dto/responses/fs.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { SuccessResponse } from './base'; -import { - IsBoolean, - IsInt, - IsNotEmpty, - IsOptional, - IsString, - Min -} from 'class-validator'; -import { ValidateConstructor } from '../utils'; - -@ValidateConstructor -export class GetRootResponse extends SuccessResponse { - constructor(rootId: number) { - super(); - this.rootId = rootId; - } - @IsInt() - @Min(1) - rootId: number; -} - -export class GetNodeResponse extends SuccessResponse { - constructor( - id: number, - name: string, - isFile: boolean, - parent: number | null - ) { - super(); - this.id = id; - this.name = name; - this.isFile = isFile; - this.parent = parent; - } - - @IsInt() - @Min(1) - id: number; - - @IsString() - name: string; - - @IsBoolean() - isFile: boolean; - - @IsOptional() - @IsInt() - @Min(1) - parent: number | null; - - @IsOptional() - @IsInt({ each: true }) - @Min(1, { each: true }) - children?: number[]; - - @IsOptional() - @IsInt() - @Min(0) - size?: number; -} - -@ValidateConstructor -export class GetPathResponse extends SuccessResponse { - constructor(path: string) { - super(); - this.path = path; - } - - @IsNotEmpty() - @IsString() - path: string; -} - -@ValidateConstructor -export class CreateFolderResponse extends SuccessResponse { - constructor(id: number) { - super(); - this.id = id; - } - - @IsInt() - @Min(1) - id: number; -} - -export class UploadFileResponse extends SuccessResponse {} -export class DeleteResponse extends SuccessResponse {} -export class CreateFileResponse extends CreateFolderResponse {} diff --git a/dto/responses/index.ts b/dto/responses/index.ts deleted file mode 100644 index 0c84bc4..0000000 --- a/dto/responses/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export * from './base'; -export * as Auth from './auth'; -export * as FS from './fs'; -export * as User from './user'; -export * as Admin from './admin'; diff --git a/dto/responses/user.ts b/dto/responses/user.ts deleted file mode 100644 index 706526b..0000000 --- a/dto/responses/user.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { SuccessResponse } from './base'; -import { ValidateConstructor } from '../utils'; -import { IsBoolean, IsNotEmpty, IsString } from 'class-validator'; - -@ValidateConstructor -export class UserInfoResponse extends SuccessResponse { - constructor(name: string, gitlab: boolean, tfaEnabled: boolean) { - super(); - this.name = name; - this.gitlab = gitlab; - this.tfaEnabled = tfaEnabled; - } - - @IsNotEmpty() - @IsString() - name: string; - - @IsBoolean() - gitlab: boolean; - - @IsBoolean() - tfaEnabled: boolean; -} - -export class DeleteUserResponse extends SuccessResponse {} -export class ChangePasswordResponse extends SuccessResponse {} -export class LogoutAllResponse extends SuccessResponse {} diff --git a/dto/utils.ts b/dto/utils.ts deleted file mode 100644 index 3551fbc..0000000 --- a/dto/utils.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { validate, validateSync as _validateSync } from 'class-validator'; - -export enum UserRole { - ADMIN = 2, - USER = 1, - DISABLED = 0 -} - -export function validateSync(data: T): void { - const errors = _validateSync(data); - if (errors.length > 0) { - console.error('Validation failed, errors: ', errors); - throw new Error('Validation failed'); - } -} - -export async function validateAsync(data: T): Promise { - const errors = await validate(data); - if (errors.length > 0) { - console.error('Validation failed, errors: ', errors); - throw new Error('Validation failed'); - } -} - -export async function validateAsyncInline( - data: T -): Promise { - await validateAsync(data); - return data; -} - -export function ValidateConstructor( - constr: T -) { - return class extends constr { - constructor(...args: any[]) { - super(...args); - validateSync(this); - } - }; -} diff --git a/frontend/babel.config.js b/frontend/babel.config.js index 1f4c9ae..162a3ea 100644 --- a/frontend/babel.config.js +++ b/frontend/babel.config.js @@ -1,3 +1,3 @@ module.exports = { - presets: ['@vue/cli-plugin-babel/preset'] + presets: ["@vue/cli-plugin-babel/preset"], }; diff --git a/frontend/package.json b/frontend/package.json index 8afc629..72570a1 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -9,6 +9,8 @@ }, "dependencies": { "axios": "^0.27.2", + "class-transformer": "^0.5.1", + "class-validator": "^0.13.2", "core-js": "^3.8.3", "filesize": "^9.0.11", "jwt-decode": "^3.1.2", @@ -27,8 +29,6 @@ "@vue/cli-plugin-typescript": "~5.0.0", "@vue/cli-service": "~5.0.0", "@vue/eslint-config-typescript": "^9.1.0", - "class-transformer": "^0.5.1", - "class-validator": "^0.13.2", "eslint": "^7.32.0", "eslint-config-prettier": "^8.3.0", "eslint-plugin-prettier": "^4.0.0", diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 089e1c2..ade3bb9 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -1,62 +1,62 @@ diff --git a/frontend/src/AppAsyncWrapper.vue b/frontend/src/AppAsyncWrapper.vue index c223354..9442630 100644 --- a/frontend/src/AppAsyncWrapper.vue +++ b/frontend/src/AppAsyncWrapper.vue @@ -1,12 +1,12 @@ diff --git a/frontend/src/api/admin.ts b/frontend/src/api/admin.ts index 76f2299..fb7aad7 100644 --- a/frontend/src/api/admin.ts +++ b/frontend/src/api/admin.ts @@ -1,54 +1,54 @@ -import { Requests, Responses, UserRole, get_token, post_token } from './base'; +import { Requests, Responses, UserRole, get_token, post_token } from "./base"; export const get_users = (token: string): Promise => - get_token('/api/admin/users', token); + get_token("/api/admin/users", token); export const set_role = ( - user: number, - role: UserRole, - token: string + user: number, + role: UserRole, + token: string ): Promise => - post_token( - '/api/admin/set_role', - { - user, - role - }, - token - ); + post_token( + "/api/admin/set_role", + { + user, + role, + }, + token + ); export const logout = ( - user: number, - token: string + user: number, + token: string ): Promise => - post_token( - '/api/admin/logout', - { - user - }, - token - ); + post_token( + "/api/admin/logout", + { + user, + }, + token + ); export const delete_user = ( - user: number, - token: string + user: number, + token: string ): Promise => - post_token( - '/api/admin/delete', - { - user - }, - token - ); + post_token( + "/api/admin/delete", + { + user, + }, + token + ); export const disable_tfa = ( - user: number, - token: string + user: number, + token: string ): Promise => - post_token( - '/api/admin/disable_2fa', - { - user - }, - token - ); + post_token( + "/api/admin/disable_2fa", + { + user, + }, + token + ); diff --git a/frontend/src/api/auth.ts b/frontend/src/api/auth.ts index c4d9afd..c1f3b1b 100644 --- a/frontend/src/api/auth.ts +++ b/frontend/src/api/auth.ts @@ -1,93 +1,93 @@ -import { Responses, Requests, post, post_token } from './base'; +import { Responses, Requests, post, post_token } from "./base"; export const auth_login = ( - username: string, - password: string, - otp?: string + username: string, + password: string, + otp?: string ): Promise< - | Responses.Auth.LoginResponse - | Responses.Auth.TfaRequiredResponse - | Responses.ErrorResponse + | Responses.Auth.LoginResponse + | Responses.Auth.TfaRequiredResponse + | Responses.ErrorResponse > => - post('/api/auth/login', { - username: username, - password: password, - otp: otp - }); + post("/api/auth/login", { + username: username, + password: password, + otp: otp, + }); export const auth_signup = ( - username: string, - password: string + username: string, + password: string ): Promise => - post('/api/auth/signup', { - username: username, - password: password - }); + post("/api/auth/signup", { + username: username, + password: password, + }); export const refresh_token = ( - token: string + token: string ): Promise => - post_token('/api/auth/refresh', {}, token); + post_token("/api/auth/refresh", {}, token); export const change_password = ( - oldPw: string, - newPw: string, - token: string + oldPw: string, + newPw: string, + token: string ): Promise => - post_token( - '/api/auth/change_password', - { - oldPassword: oldPw, - newPassword: newPw - }, - token - ); + post_token( + "/api/auth/change_password", + { + oldPassword: oldPw, + newPassword: newPw, + }, + token + ); export const logout_all = ( - token: string + token: string ): Promise => - post_token('/api/auth/logout_all', {}, token); + post_token("/api/auth/logout_all", {}, token); export function tfa_setup( - mail: false, - token: string + mail: false, + token: string ): Promise; export function tfa_setup( - mail: true, - token: string + mail: true, + token: string ): Promise; export function tfa_setup( - mail: boolean, - token: string + mail: boolean, + token: string ): Promise< - | Responses.Auth.RequestEmailTfaResponse - | Responses.Auth.RequestTotpTfaResponse - | Responses.ErrorResponse + | Responses.Auth.RequestEmailTfaResponse + | Responses.Auth.RequestTotpTfaResponse + | Responses.ErrorResponse > { - return post_token( - '/api/auth/2fa/setup', - { - mail - }, - token - ); + return post_token( + "/api/auth/2fa/setup", + { + mail, + }, + token + ); } export const tfa_complete = ( - mail: boolean, - code: string, - token: string + mail: boolean, + code: string, + token: string ): Promise => - post_token( - '/api/auth/2fa/complete', - { - mail, - code - }, - token - ); + post_token( + "/api/auth/2fa/complete", + { + mail, + code, + }, + token + ); export const tfa_disable = ( - token: string + token: string ): Promise => - post_token('/api/auth/2fa/disable', {}, token); + post_token("/api/auth/2fa/disable", {}, token); diff --git a/frontend/src/api/base.ts b/frontend/src/api/base.ts index 7a528f8..54d91d9 100644 --- a/frontend/src/api/base.ts +++ b/frontend/src/api/base.ts @@ -1,62 +1,62 @@ -import axios from 'axios'; -import { Requests, Responses, UserRole } from '../../../dto'; +import axios from "axios"; +import { Requests, Responses, UserRole } from "../dto"; export { Requests, Responses, UserRole }; export const post = (url: string, data: T) => - axios - .post(url, data, { - headers: { 'Content-type': 'application/json' } - }) - .then((res) => res.data) - .catch((err) => err.response.data); + axios + .post(url, data, { + headers: { "Content-type": "application/json" }, + }) + .then((res) => res.data) + .catch((err) => err.response.data); export const post_token = ( - url: string, - data: T, - token: string + url: string, + data: T, + token: string ) => - axios - .post(url, data, { - headers: { - Authorization: 'Bearer ' + token, - 'Content-type': 'application/json' - } - }) - .then((res) => res.data) - .catch((err) => err.response.data); + axios + .post(url, data, { + headers: { + Authorization: "Bearer " + token, + "Content-type": "application/json", + }, + }) + .then((res) => res.data) + .catch((err) => err.response.data); export const post_token_form = ( - url: string, - data: FormData, - token: string, - onProgress: (progressEvent: ProgressEvent) => void + url: string, + data: FormData, + token: string, + onProgress: (progressEvent: ProgressEvent) => void ) => - axios - .post(url, data, { - headers: { - Authorization: 'Bearer ' + token, - 'Content-type': 'multipart/form-data' - }, - onUploadProgress: onProgress - }) - .then((res) => res.data) - .catch((err) => err.response.data); + axios + .post(url, data, { + headers: { + Authorization: "Bearer " + token, + "Content-type": "multipart/form-data", + }, + onUploadProgress: onProgress, + }) + .then((res) => res.data) + .catch((err) => err.response.data); // eslint-disable-next-line @typescript-eslint/no-unused-vars export const get = (url: string) => - axios - .get(url) - .then((res) => res.data) - .catch((err) => err.response.data); + axios + .get(url) + .then((res) => res.data) + .catch((err) => err.response.data); export const get_token = (url: string, token: string) => - axios - .get(url, { - headers: { Authorization: 'Bearer ' + token } - }) - .then((res) => res.data) - .catch((err) => err.response.data); + axios + .get(url, { + headers: { Authorization: "Bearer " + token }, + }) + .then((res) => res.data) + .catch((err) => err.response.data); export const isErrorResponse = ( - res: Responses.BaseResponse + res: Responses.BaseResponse ): res is Responses.ErrorResponse => res.statusCode != 200; diff --git a/frontend/src/api/fs.ts b/frontend/src/api/fs.ts index 8f989e0..9c16066 100644 --- a/frontend/src/api/fs.ts +++ b/frontend/src/api/fs.ts @@ -1,95 +1,84 @@ import { - Responses, - Requests, - get_token, - post_token, - post_token_form, - isErrorResponse -} from './base'; + Responses, + Requests, + get_token, + post_token, + post_token_form, + isErrorResponse, +} from "./base"; export const get_root = ( - token: string + token: string ): Promise => - get_token('/api/fs/root', token); + get_token("/api/fs/root", token); export const get_node = ( - token: string, - node: number + token: string, + node: number ): Promise => - get_token(`/api/fs/node/${node}`, token); + get_token(`/api/fs/node/${node}`, token); export const get_path = ( - token: string, - node: number + token: string, + node: number ): Promise => - get_token(`/api/fs/path/${node}`, token); + get_token(`/api/fs/path/${node}`, token); export const create_folder = ( - token: string, - parent: number, - name: string + token: string, + parent: number, + name: string ): Promise => - post_token( - '/api/fs/createFolder', - { - parent: parent, - name: name - }, - token - ); + post_token( + "/api/fs/createFolder", + { + parent: parent, + name: name, + }, + token + ); export const create_file = ( - token: string, - parent: number, - name: string + token: string, + parent: number, + name: string ): Promise => - post_token( - '/api/fs/createFile', - { - parent: parent, - name: name - }, - token - ); + post_token( + "/api/fs/createFile", + { + parent: parent, + name: name, + }, + token + ); export const delete_node = ( - token: string, - node: number + token: string, + node: number ): Promise => - post_token( - '/api/fs/delete', - { - node: node - }, - token - ); + post_token(`/api/fs/delete/${node}`, {}, token); export const upload_file = async ( - token: string, - parent: number, - file: File, - onProgress: (progressEvent: ProgressEvent) => void + token: string, + parent: number, + file: File, + onProgress: (progressEvent: ProgressEvent) => void ): Promise => { - const node = await create_file(token, parent, file.name); - if (isErrorResponse(node)) return node; + const node = await create_file(token, parent, file.name); + if (isErrorResponse(node)) return node; - const form = new FormData(); - form.set('file', file); - return post_token_form( - `/api/fs/upload/${node.id}`, - form, - token, - onProgress - ); + const form = new FormData(); + form.set("file", file); + return post_token_form(`/api/fs/upload/${node.id}`, form, token, onProgress); }; export function download_file(token: string, id: number) { - const form = document.createElement('form'); - form.method = 'post'; - form.target = '_blank'; - form.action = '/api/fs/download'; - form.innerHTML = ``; - document.body.appendChild(form); - form.submit(); - document.body.removeChild(form); + const form = document.createElement("form"); + form.method = "post"; + form.target = "_blank"; + form.action = "/api/fs/download"; + form.innerHTML = ``; + document.body.appendChild(form); + form.submit(); + document.body.removeChild(form); } diff --git a/frontend/src/api/index.ts b/frontend/src/api/index.ts index 576da46..b54dd28 100644 --- a/frontend/src/api/index.ts +++ b/frontend/src/api/index.ts @@ -1,6 +1,6 @@ -export { Requests, Responses, UserRole, isErrorResponse } from './base'; -export * as Auth from './auth'; -export * as FS from './fs'; -export * as User from './user'; -export * as Admin from './admin'; -export * from './util'; +export { Requests, Responses, UserRole, isErrorResponse } from "./base"; +export * as Auth from "./auth"; +export * as FS from "./fs"; +export * as User from "./user"; +export * as Admin from "./admin"; +export * from "./util"; diff --git a/frontend/src/api/user.ts b/frontend/src/api/user.ts index 13e2d89..670e55f 100644 --- a/frontend/src/api/user.ts +++ b/frontend/src/api/user.ts @@ -1,11 +1,11 @@ -import { Responses, get_token, post_token } from '@/api/base'; +import { Responses, get_token, post_token } from "@/api/base"; export const get_user_info = ( - token: string + token: string ): Promise => - get_token('/api/user/info', token); + get_token("/api/user/info", token); export const delete_user = ( - token: string + token: string ): Promise => - post_token('/api/user/delete', {}, token); + post_token("/api/user/delete", {}, token); diff --git a/frontend/src/api/util.ts b/frontend/src/api/util.ts index 905d4aa..72bfd63 100644 --- a/frontend/src/api/util.ts +++ b/frontend/src/api/util.ts @@ -1,25 +1,25 @@ -import jwtDecode, { JwtPayload } from 'jwt-decode'; -import { Ref, UnwrapRef } from 'vue'; -import { isErrorResponse } from './base'; -import { refresh_token } from './auth'; +import jwtDecode, { JwtPayload } from "jwt-decode"; +import { Ref, UnwrapRef } from "vue"; +import { isErrorResponse } from "./base"; +import { refresh_token } from "./auth"; export async function check_token( - token: TokenInjectType + token: TokenInjectType ): Promise { - if (!token.jwt.value) return token.logout(); - const payload = jwtDecode(token.jwt.value); - if (!payload) return token.logout(); - // Expires in more than 60 Minute - if (payload.exp && payload.exp > Math.floor(Date.now() / 1000 + 60 * 60)) - return token.jwt.value; - const new_token = await refresh_token(token.jwt.value); - if (isErrorResponse(new_token)) return token.logout(); - token.setToken(new_token.jwt); - return new_token.jwt; + if (!token.jwt.value) return token.logout(); + const payload = jwtDecode(token.jwt.value); + if (!payload) return token.logout(); + // Expires in more than 60 Minute + if (payload.exp && payload.exp > Math.floor(Date.now() / 1000 + 60 * 60)) + return token.jwt.value; + const new_token = await refresh_token(token.jwt.value); + if (isErrorResponse(new_token)) return token.logout(); + token.setToken(new_token.jwt); + return new_token.jwt; } export type TokenInjectType = { - jwt: Ref>; - setToken: (token: string) => void; - logout: () => void; + jwt: Ref>; + setToken: (token: string) => void; + logout: () => void; }; diff --git a/frontend/src/components/FSView/DirEntry.vue b/frontend/src/components/FSView/DirEntry.vue index 548e3f8..10c4290 100644 --- a/frontend/src/components/FSView/DirEntry.vue +++ b/frontend/src/components/FSView/DirEntry.vue @@ -1,40 +1,40 @@ diff --git a/frontend/src/components/FSView/DirViewer.vue b/frontend/src/components/FSView/DirViewer.vue index d77fc14..fc1fcf0 100644 --- a/frontend/src/components/FSView/DirViewer.vue +++ b/frontend/src/components/FSView/DirViewer.vue @@ -1,108 +1,101 @@ diff --git a/frontend/src/components/FSView/FileViewer.vue b/frontend/src/components/FSView/FileViewer.vue index 9bda494..9cec46c 100644 --- a/frontend/src/components/FSView/FileViewer.vue +++ b/frontend/src/components/FSView/FileViewer.vue @@ -1,38 +1,38 @@ diff --git a/frontend/src/components/HelloWorld.vue b/frontend/src/components/HelloWorld.vue index 775d75f..2fb8b10 100644 --- a/frontend/src/components/HelloWorld.vue +++ b/frontend/src/components/HelloWorld.vue @@ -1,156 +1,140 @@ diff --git a/frontend/src/components/UploadDialog/UploadEntry.vue b/frontend/src/components/UploadDialog/UploadEntry.vue index 392e0e9..1479bdf 100644 --- a/frontend/src/components/UploadDialog/UploadEntry.vue +++ b/frontend/src/components/UploadDialog/UploadEntry.vue @@ -1,51 +1,51 @@ diff --git a/frontend/src/components/UploadDialog/UploadFileDialog.vue b/frontend/src/components/UploadDialog/UploadFileDialog.vue index d830a5d..4dcc9ac 100644 --- a/frontend/src/components/UploadDialog/UploadFileDialog.vue +++ b/frontend/src/components/UploadDialog/UploadFileDialog.vue @@ -1,10 +1,10 @@ diff --git a/frontend/src/dto/index.ts b/frontend/src/dto/index.ts new file mode 100644 index 0000000..9fa4ceb --- /dev/null +++ b/frontend/src/dto/index.ts @@ -0,0 +1,8 @@ +export * as Requests from "./requests"; +export * as Responses from "./responses"; +export { + UserRole, + validateSync, + validateAsync, + validateAsyncInline, +} from "./utils"; diff --git a/frontend/src/dto/requests/admin.ts b/frontend/src/dto/requests/admin.ts new file mode 100644 index 0000000..3b33f4b --- /dev/null +++ b/frontend/src/dto/requests/admin.ts @@ -0,0 +1,17 @@ +import { BaseRequest } from "./base"; +import { IsEnum, IsNumber } from "class-validator"; +import { UserRole } from "../utils"; + +export class AdminRequest extends BaseRequest { + @IsNumber() + user: number; +} + +export class SetUserRole extends AdminRequest { + @IsEnum(UserRole) + role: UserRole; +} + +export class LogoutAll extends AdminRequest {} +export class DeleteUser extends AdminRequest {} +export class DisableTfa extends AdminRequest {} diff --git a/frontend/src/dto/requests/auth.ts b/frontend/src/dto/requests/auth.ts new file mode 100644 index 0000000..ae30c14 --- /dev/null +++ b/frontend/src/dto/requests/auth.ts @@ -0,0 +1,50 @@ +import { BaseRequest } from "./base"; +import { + IsBoolean, + IsEmail, + IsNotEmpty, + IsOptional, + IsString, +} from "class-validator"; + +export class SignUpRequest extends BaseRequest { + @IsEmail() + username: string; + + @IsNotEmpty() + @IsString() + password: string; +} + +export class LoginRequest extends SignUpRequest { + @IsOptional() + @IsNotEmpty() + @IsString() + otp?: string; +} + +export class TfaSetup extends BaseRequest { + @IsNotEmpty() + @IsBoolean() + mail: boolean; +} + +export class TfaComplete extends BaseRequest { + @IsNotEmpty() + @IsBoolean() + mail: boolean; + + @IsNotEmpty() + @IsString() + code: string; +} + +export class ChangePasswordRequest extends BaseRequest { + @IsNotEmpty() + @IsString() + oldPassword: string; + + @IsNotEmpty() + @IsString() + newPassword: string; +} diff --git a/dto/requests/base.ts b/frontend/src/dto/requests/base.ts similarity index 100% rename from dto/requests/base.ts rename to frontend/src/dto/requests/base.ts diff --git a/frontend/src/dto/requests/fs.ts b/frontend/src/dto/requests/fs.ts new file mode 100644 index 0000000..a26cdd5 --- /dev/null +++ b/frontend/src/dto/requests/fs.ts @@ -0,0 +1,14 @@ +import { BaseRequest } from "./base"; +import { IsInt, IsNotEmpty, IsString, Min } from "class-validator"; + +export class CreateFolderRequest extends BaseRequest { + @IsInt() + @Min(1) + parent: number; + + @IsNotEmpty() + @IsString() + name: string; +} + +export class CreateFileRequest extends CreateFolderRequest {} diff --git a/frontend/src/dto/requests/index.ts b/frontend/src/dto/requests/index.ts new file mode 100644 index 0000000..3f4cf66 --- /dev/null +++ b/frontend/src/dto/requests/index.ts @@ -0,0 +1,4 @@ +export * from "./base"; +export * as Auth from "./auth"; +export * as FS from "./fs"; +export * as Admin from "./admin"; diff --git a/frontend/src/dto/responses/admin.ts b/frontend/src/dto/responses/admin.ts new file mode 100644 index 0000000..b09564e --- /dev/null +++ b/frontend/src/dto/responses/admin.ts @@ -0,0 +1,61 @@ +import { SuccessResponse } from "./base"; +import { + IsArray, + IsBoolean, + IsEnum, + IsNotEmpty, + IsNumber, + IsString, + ValidateNested, +} from "class-validator"; +import { UserRole, ValidateConstructor } from "../utils"; + +@ValidateConstructor +export class GetUsersEntry { + constructor( + id: number, + gitlab: boolean, + name: string, + role: UserRole, + tfaEnabled: boolean + ) { + this.id = id; + this.gitlab = gitlab; + this.name = name; + this.role = role; + this.tfaEnabled = tfaEnabled; + } + + @IsNumber() + id: number; + + @IsBoolean() + gitlab: boolean; + + @IsString() + @IsNotEmpty() + name: string; + + @IsEnum(UserRole) + role: UserRole; + + @IsBoolean() + tfaEnabled: boolean; +} + +@ValidateConstructor +export class GetUsers extends SuccessResponse { + constructor(users: GetUsersEntry[]) { + super(); + this.users = users; + } + + @IsArray() + @ValidateNested({ each: true }) + users: GetUsersEntry[]; +} + +export class LogoutAllUser extends SuccessResponse {} +export class DeleteUser extends SuccessResponse {} +export class SetUserRole extends SuccessResponse {} +export class DisableTfa extends SuccessResponse {} diff --git a/dto/responses/auth.ts b/frontend/src/dto/responses/auth.ts similarity index 58% rename from dto/responses/auth.ts rename to frontend/src/dto/responses/auth.ts index 76de70b..e4c1359 100644 --- a/dto/responses/auth.ts +++ b/frontend/src/dto/responses/auth.ts @@ -1,33 +1,33 @@ -import { SuccessResponse } from './base'; -import { IsBase32, IsJWT, IsNotEmpty } from 'class-validator'; -import { ValidateConstructor } from '../utils'; +import { SuccessResponse } from "./base"; +import { IsBase32, IsJWT, IsNotEmpty } from "class-validator"; +import { ValidateConstructor } from "../utils"; @ValidateConstructor export class LoginResponse extends SuccessResponse { - constructor(jwt: string) { - super(); - this.jwt = jwt; - } + constructor(jwt: string) { + super(); + this.jwt = jwt; + } - @IsNotEmpty() - @IsJWT() - jwt: string; + @IsNotEmpty() + @IsJWT() + jwt: string; } @ValidateConstructor export class RequestTotpTfaResponse extends SuccessResponse { - constructor(qrCode: string, secret: string) { - super(); - this.qrCode = qrCode; - this.secret = secret; - } + constructor(qrCode: string, secret: string) { + super(); + this.qrCode = qrCode; + this.secret = secret; + } - @IsNotEmpty() - qrCode: string; + @IsNotEmpty() + qrCode: string; - @IsNotEmpty() - @IsBase32() - secret: string; + @IsNotEmpty() + @IsBase32() + secret: string; } export class TfaRequiredResponse extends SuccessResponse {} diff --git a/frontend/src/dto/responses/base.ts b/frontend/src/dto/responses/base.ts new file mode 100644 index 0000000..d17e033 --- /dev/null +++ b/frontend/src/dto/responses/base.ts @@ -0,0 +1,25 @@ +import { IsNumber, Max, Min } from "class-validator"; + +export class BaseResponse { + constructor(statusCode: number) { + this.statusCode = statusCode; + } + + @IsNumber() + @Min(100) + @Max(599) + statusCode: number; +} + +export class SuccessResponse extends BaseResponse { + constructor() { + super(200); + } + + declare statusCode: 200; +} + +export class ErrorResponse extends BaseResponse { + declare statusCode: 400 | 401 | 403; + message?: string; +} diff --git a/frontend/src/dto/responses/fs.ts b/frontend/src/dto/responses/fs.ts new file mode 100644 index 0000000..d87c9e8 --- /dev/null +++ b/frontend/src/dto/responses/fs.ts @@ -0,0 +1,89 @@ +import { SuccessResponse } from "./base"; +import { + IsBoolean, + IsInt, + IsNotEmpty, + IsOptional, + IsString, + Min, +} from "class-validator"; +import { ValidateConstructor } from "../utils"; + +@ValidateConstructor +export class GetRootResponse extends SuccessResponse { + constructor(rootId: number) { + super(); + this.rootId = rootId; + } + @IsInt() + @Min(1) + rootId: number; +} + +export class GetNodeResponse extends SuccessResponse { + constructor( + id: number, + name: string, + isFile: boolean, + parent: number | null + ) { + super(); + this.id = id; + this.name = name; + this.isFile = isFile; + this.parent = parent; + } + + @IsInt() + @Min(1) + id: number; + + @IsString() + name: string; + + @IsBoolean() + isFile: boolean; + + @IsOptional() + @IsInt() + @Min(1) + parent: number | null; + + @IsOptional() + @IsInt({ each: true }) + @Min(1, { each: true }) + children?: number[]; + + @IsOptional() + @IsInt() + @Min(0) + size?: number; +} + +@ValidateConstructor +export class GetPathResponse extends SuccessResponse { + constructor(path: string) { + super(); + this.path = path; + } + + @IsNotEmpty() + @IsString() + path: string; +} + +@ValidateConstructor +export class CreateFolderResponse extends SuccessResponse { + constructor(id: number) { + super(); + this.id = id; + } + + @IsInt() + @Min(1) + id: number; +} + +export class UploadFileResponse extends SuccessResponse {} +export class DeleteResponse extends SuccessResponse {} +export class CreateFileResponse extends CreateFolderResponse {} diff --git a/frontend/src/dto/responses/index.ts b/frontend/src/dto/responses/index.ts new file mode 100644 index 0000000..d985eea --- /dev/null +++ b/frontend/src/dto/responses/index.ts @@ -0,0 +1,5 @@ +export * from "./base"; +export * as Auth from "./auth"; +export * as FS from "./fs"; +export * as User from "./user"; +export * as Admin from "./admin"; diff --git a/frontend/src/dto/responses/user.ts b/frontend/src/dto/responses/user.ts new file mode 100644 index 0000000..6d44861 --- /dev/null +++ b/frontend/src/dto/responses/user.ts @@ -0,0 +1,27 @@ +import { SuccessResponse } from "./base"; +import { ValidateConstructor } from "../utils"; +import { IsBoolean, IsNotEmpty, IsString } from "class-validator"; + +@ValidateConstructor +export class UserInfoResponse extends SuccessResponse { + constructor(name: string, gitlab: boolean, tfaEnabled: boolean) { + super(); + this.name = name; + this.gitlab = gitlab; + this.tfaEnabled = tfaEnabled; + } + + @IsNotEmpty() + @IsString() + name: string; + + @IsBoolean() + gitlab: boolean; + + @IsBoolean() + tfaEnabled: boolean; +} + +export class DeleteUserResponse extends SuccessResponse {} +export class ChangePasswordResponse extends SuccessResponse {} +export class LogoutAllResponse extends SuccessResponse {} diff --git a/frontend/src/dto/utils.ts b/frontend/src/dto/utils.ts new file mode 100644 index 0000000..229da51 --- /dev/null +++ b/frontend/src/dto/utils.ts @@ -0,0 +1,41 @@ +import { validate, validateSync as _validateSync } from "class-validator"; + +export enum UserRole { + ADMIN = 2, + USER = 1, + DISABLED = 0, +} + +export function validateSync(data: T): void { + const errors = _validateSync(data); + if (errors.length > 0) { + console.error("Validation failed, errors: ", errors); + throw new Error("Validation failed"); + } +} + +export async function validateAsync(data: T): Promise { + const errors = await validate(data); + if (errors.length > 0) { + console.error("Validation failed, errors: ", errors); + throw new Error("Validation failed"); + } +} + +export async function validateAsyncInline( + data: T +): Promise { + await validateAsync(data); + return data; +} + +export function ValidateConstructor( + constr: T +) { + return class extends constr { + constructor(...args: any[]) { + super(...args); + validateSync(this); + } + }; +} diff --git a/frontend/src/main.ts b/frontend/src/main.ts index 61a7273..8e69ff4 100644 --- a/frontend/src/main.ts +++ b/frontend/src/main.ts @@ -1,8 +1,8 @@ -import { createApp } from 'vue'; -import router from './router'; -import AppAsyncWrapper from './AppAsyncWrapper.vue'; +import { createApp } from "vue"; +import router from "./router"; +import AppAsyncWrapper from "./AppAsyncWrapper.vue"; const app = createApp(AppAsyncWrapper); app.use(router); app.config.unwrapInjectedRef = true; -app.mount('#app'); +app.mount("#app"); diff --git a/frontend/src/router/index.ts b/frontend/src/router/index.ts index b045c4c..8547abd 100644 --- a/frontend/src/router/index.ts +++ b/frontend/src/router/index.ts @@ -1,63 +1,63 @@ -import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router'; -import LoginView from '@/views/LoginView.vue'; -import SignupView from '@/views/SignupView.vue'; -import HomeView from '@/views/HomeView.vue'; -import AboutView from '@/views/AboutView.vue'; -import FSView from '@/views/FSView.vue'; -import SetTokenView from '@/views/SetTokenView.vue'; -import ProfileView from '@/views/ProfileView.vue'; -import TFAView from '@/views/TFAView.vue'; -import AdminView from '@/views/AdminView.vue'; +import { createRouter, createWebHistory, RouteRecordRaw } from "vue-router"; +import LoginView from "@/views/LoginView.vue"; +import SignupView from "@/views/SignupView.vue"; +import HomeView from "@/views/HomeView.vue"; +import AboutView from "@/views/AboutView.vue"; +import FSView from "@/views/FSView.vue"; +import SetTokenView from "@/views/SetTokenView.vue"; +import ProfileView from "@/views/ProfileView.vue"; +import TFAView from "@/views/TFAView.vue"; +import AdminView from "@/views/AdminView.vue"; const routes: Array = [ - { - path: '/', - name: 'home', - component: HomeView - }, - { - path: '/profile', - name: 'profile', - component: ProfileView - }, - { - path: '/profile/2fa-enable', - name: '2fa', - component: TFAView - }, - { - path: '/admin', - component: AdminView - }, - { - path: '/about', - component: AboutView - }, - { - path: '/login', - name: 'login', - component: LoginView - }, - { - path: '/signup', - name: 'signup', - component: SignupView - }, - { - path: '/fs/:node_id', - name: 'fs', - component: FSView - }, + { + path: "/", + name: "home", + component: HomeView, + }, + { + path: "/profile", + name: "profile", + component: ProfileView, + }, + { + path: "/profile/2fa-enable", + name: "2fa", + component: TFAView, + }, + { + path: "/admin", + component: AdminView, + }, + { + path: "/about", + component: AboutView, + }, + { + path: "/login", + name: "login", + component: LoginView, + }, + { + path: "/signup", + name: "signup", + component: SignupView, + }, + { + path: "/fs/:node_id", + name: "fs", + component: FSView, + }, - { - path: '/set_token', - component: SetTokenView - } + { + path: "/set_token", + component: SetTokenView, + }, ]; const router = createRouter({ - history: createWebHistory(process.env.BASE_URL), - routes + history: createWebHistory(process.env.BASE_URL), + routes, }); export default router; diff --git a/frontend/src/views/AboutView.vue b/frontend/src/views/AboutView.vue index 7054f59..3fa2807 100644 --- a/frontend/src/views/AboutView.vue +++ b/frontend/src/views/AboutView.vue @@ -1,5 +1,5 @@ diff --git a/frontend/src/views/AdminView.vue b/frontend/src/views/AdminView.vue index fc715ee..cf5eeff 100644 --- a/frontend/src/views/AdminView.vue +++ b/frontend/src/views/AdminView.vue @@ -1,109 +1,109 @@ diff --git a/frontend/src/views/FSView.vue b/frontend/src/views/FSView.vue index 82f3bf5..3325a6e 100644 --- a/frontend/src/views/FSView.vue +++ b/frontend/src/views/FSView.vue @@ -1,70 +1,70 @@ diff --git a/frontend/src/views/HomeView.vue b/frontend/src/views/HomeView.vue index 0140b62..2d36d45 100644 --- a/frontend/src/views/HomeView.vue +++ b/frontend/src/views/HomeView.vue @@ -1,28 +1,28 @@ diff --git a/frontend/src/views/LoginView.vue b/frontend/src/views/LoginView.vue index be6a3d0..54f4f09 100644 --- a/frontend/src/views/LoginView.vue +++ b/frontend/src/views/LoginView.vue @@ -1,61 +1,61 @@ diff --git a/frontend/src/views/ProfileView.vue b/frontend/src/views/ProfileView.vue index f4cb406..5346fc0 100644 --- a/frontend/src/views/ProfileView.vue +++ b/frontend/src/views/ProfileView.vue @@ -1,124 +1,112 @@ diff --git a/frontend/src/views/SetTokenView.vue b/frontend/src/views/SetTokenView.vue index d15660e..4198c98 100644 --- a/frontend/src/views/SetTokenView.vue +++ b/frontend/src/views/SetTokenView.vue @@ -1,19 +1,19 @@ diff --git a/frontend/src/views/SignupView.vue b/frontend/src/views/SignupView.vue index 34491f9..541ace7 100644 --- a/frontend/src/views/SignupView.vue +++ b/frontend/src/views/SignupView.vue @@ -1,35 +1,35 @@ diff --git a/frontend/src/views/TFAView.vue b/frontend/src/views/TFAView.vue index cf7582b..cc9d7d5 100644 --- a/frontend/src/views/TFAView.vue +++ b/frontend/src/views/TFAView.vue @@ -1,89 +1,89 @@ diff --git a/frontend/vue.config.js b/frontend/vue.config.js index aa99dc3..bd9c9cd 100644 --- a/frontend/vue.config.js +++ b/frontend/vue.config.js @@ -1,12 +1,12 @@ -const { defineConfig } = require('@vue/cli-service'); +const { defineConfig } = require("@vue/cli-service"); module.exports = defineConfig({ - transpileDependencies: true, - configureWebpack: { - resolve: { - fallback: { - crypto: false, - stream: require.resolve('stream-browserify') - } - } - } + transpileDependencies: true, + configureWebpack: { + resolve: { + fallback: { + crypto: false, + stream: require.resolve("stream-browserify"), + }, + }, + }, }); diff --git a/old_backend/.eslintrc.js b/old_backend/.eslintrc.js new file mode 100644 index 0000000..9989762 --- /dev/null +++ b/old_backend/.eslintrc.js @@ -0,0 +1,29 @@ +module.exports = { + parser: '@typescript-eslint/parser', + parserOptions: { + project: 'tsconfig.json', + tsconfigRootDir: __dirname, + sourceType: 'module', + }, + plugins: ['@typescript-eslint/eslint-plugin', 'no-relative-import-paths'], + extends: [ + 'plugin:@typescript-eslint/recommended', + 'plugin:prettier/recommended', + ], + root: true, + env: { + node: true, + jest: true, + }, + ignorePatterns: ['.eslintrc.js'], + rules: { + '@typescript-eslint/interface-name-prefix': 'off', + '@typescript-eslint/explicit-function-return-type': 'off', + '@typescript-eslint/explicit-module-boundary-types': 'off', + '@typescript-eslint/no-explicit-any': 'off', + 'no-relative-import-paths/no-relative-import-paths': [ + 'error', + { 'allowSameFolder': true, 'rootDir': 'src' } + ] + }, +}; diff --git a/old_backend/.gitignore b/old_backend/.gitignore new file mode 100644 index 0000000..257f64e --- /dev/null +++ b/old_backend/.gitignore @@ -0,0 +1,401 @@ +# Created by .ignore support plugin (hsz.mobi) +### JetBrains template +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff: +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/dictionaries + +# Sensitive or high-churn files: +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.xml +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml + +# Gradle: +.idea/**/gradle.xml +.idea/**/libraries + +# CMake +cmake-build-debug/ + +# Mongo Explorer plugin: +.idea/**/mongoSettings.xml + +## File-based project format: +*.iws + +## Plugin-specific files: + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties +### VisualStudio template +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ +**/Properties/launchSettings.json + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Typescript v1 declaration files +typings/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json + +# CodeRush +.cr/ + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ +coverage/ + +### macOS template +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +======= +# Local +.env +dist + +files +sqlite.db \ No newline at end of file diff --git a/old_backend/.gitlab-ci.yml b/old_backend/.gitlab-ci.yml new file mode 100644 index 0000000..80ab095 --- /dev/null +++ b/old_backend/.gitlab-ci.yml @@ -0,0 +1,114 @@ +image: node:latest + +stages: + - setup + - test + - build + - package + +cache: &global_cache + paths: + - .yarn + - node_modules + - frontend/.yarn + - frontend/node_modules + policy: pull + +before_script: + - yarn install --cache-folder .yarn --frozen-lockfile + - cd frontend + - yarn install --cache-folder .yarn --frozen-lockfile + - cd .. + +.dto_artifacts_need: &dto_artifacts_need + job: test_build_dto + artifacts: true + +test_build_dto: + stage: setup + cache: + <<: *global_cache + policy: pull-push + before_script: [] + script: + - cd dto + - yarn install --frozen-lockfile + - yarn lint + - yarn build + - cd .. + - yarn install --cache-folder .yarn --frozen-lockfile + - yarn add ./dto + - cd frontend + - yarn install --cache-folder .yarn --frozen-lockfile + - yarn add ../dto + artifacts: + paths: + - dto/lib/ + + +test_backend: + needs: + - *dto_artifacts_need + stage: test + script: + - yarn lint + +test_frontend: + needs: + - *dto_artifacts_need + stage: test + script: + - cd frontend + - yarn lint + +build_backend: + stage: build + needs: + - *dto_artifacts_need + - job: test_backend + artifacts: false + script: + - echo This has to work till I rewrite the backend + - false && echo + - yarn webpack + artifacts: + paths: + - dist/ + expire_in: 1h + +build_frontend: + stage: build + needs: + - *dto_artifacts_need + - job: test_frontend + artifacts: false + script: + - cd frontend + - yarn build + artifacts: + paths: + - frontend/dist/ + expire_in: 1h + +package_server: + stage: package + cache: [] + before_script: [] + needs: + - job: build_backend + artifacts: true + - job: build_frontend + artifacts: true + script: + - TMP=$(mktemp -d) + - mv dist/* "$TMP" + - mkdir "$TMP/frontend" + - mv frontend/dist/* "$TMP/frontend" + - rm -r * + - rm -r .* || true + - mv "$TMP/"* . + artifacts: + paths: + - package.json + - server.js + - frontend/ diff --git a/old_backend/.prettierrc b/old_backend/.prettierrc new file mode 100644 index 0000000..9145d2d --- /dev/null +++ b/old_backend/.prettierrc @@ -0,0 +1,7 @@ +{ + "tabWidth": 4, + "useTabs": true, + "singleQuote": true, + "trailingComma": "none", + "endOfLine": "lf" +} diff --git a/old_backend/README.md b/old_backend/README.md new file mode 100644 index 0000000..c8a4e92 --- /dev/null +++ b/old_backend/README.md @@ -0,0 +1,19 @@ +# Mutzi's fileserver + +## Description +The most crackhead fileserver you will find on the market + +## Installation +```bash +npm install +cd frontend && npm install +``` + +## Running the app +```bash +npm run start:dev +``` +Run in parallel for building the frontend: +````bash +cd frontend && npm run serve +```` \ No newline at end of file diff --git a/old_backend/nest-cli.json b/old_backend/nest-cli.json new file mode 100644 index 0000000..78c45d4 --- /dev/null +++ b/old_backend/nest-cli.json @@ -0,0 +1,9 @@ +{ + "$schema": "https://json.schemastore.org/nest-cli", + "collection": "@nestjs/schematics", + "monorepo": true, + "sourceRoot": "src", + "compilerOptions": { + "tsConfigPath": "tsconfig.json" + } +} diff --git a/old_backend/package.json b/old_backend/package.json new file mode 100644 index 0000000..f8c3e00 --- /dev/null +++ b/old_backend/package.json @@ -0,0 +1,122 @@ +{ + "name": "fileserver", + "private": true, + "version": "1.0.0", + "description": "Crackhead fileserver", + "license": "MIT", + "scripts": { + "prebuild": "rimraf dist", + "build": "nest build", + "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", + "start": "nest start", + "start:dev": "nest start --watch", + "lint": "eslint \"src/**/*.ts\"", + "lint-fix": "eslint \"src/**/*.ts\" --fix", + "test": "jest", + "test:watch": "jest --watch", + "test:cov": "jest --coverage", + "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", + "test:e2e": "jest --config ./test/jest-e2e.json", + "genapi": "ts-node tools/apigen.ts", + "updateDto": "cd dto && yarn build && cd .. && yarn add ./dto && cd frontend && yarn add ../dto", + "lint-fix-all": "yarn lint-fix && cd dto && yarn lint-fix && cd ../frontend && yarn lint --fix" + }, + "dependencies": { + "@fastify/multipart": "^7.1.0", + "@fastify/static": "^6.5.0", + "@nestjs/common": "^9.0.8", + "@nestjs/core": "^9.0.8", + "@nestjs/jwt": "^9.0.0", + "@nestjs/passport": "^9.0.0", + "@nestjs/platform-fastify": "^9.0.8", + "@nestjs/serve-static": "^3.0.0", + "@nestjs/typeorm": "^9.0.0", + "argon2": "^0.28.7", + "axios": "^0.27.2", + "class-transformer": "^0.5.1", + "class-validator": "^0.13.2", + "jsonwebtoken": "^8.5.1", + "nodemailer": "^6.7.8", + "notp": "^2.0.3", + "passport": "^0.6.0", + "passport-jwt": "^4.0.0", + "passport-local": "^1.0.0", + "qrcode": "^1.5.1", + "reflect-metadata": "^0.1.13", + "rxjs": "^7.5.6", + "sqlite3": "^5.0.11", + "thirty-two": "^1.0.2", + "typeorm": "^0.3.7" + }, + "runtimeDependencies": [ + "@fastify/multipart", + "@fastify/static", + "@nestjs/common", + "@nestjs/core", + "@nestjs/platform-fastify", + "@nestjs/serve-static", + "argon2", + "class-transformer", + "class-validator", + "reflect-metadata", + "rxjs", + "sqlite3", + "typeorm" + ], + "devDependencies": { + "@nestjs/cli": "^9.0.0", + "@nestjs/schematics": "^9.0.1", + "@nestjs/testing": "^9.0.8", + "@types/express": "^4.17.13", + "@types/jest": "^28.1.6", + "@types/jsonwebtoken": "^8.5.8", + "@types/node": "^18.6.5", + "@types/nodemailer": "^6.4.5", + "@types/notp": "^2.0.2", + "@types/passport-jwt": "^3.0.6", + "@types/passport-local": "^1.0.34", + "@types/qrcode": "^1.5.0", + "@types/supertest": "^2.0.12", + "@types/webpack": "^5.28.0", + "@types/webpack-node-externals": "^2.5.3", + "@typescript-eslint/eslint-plugin": "^5.33.0", + "@typescript-eslint/parser": "^5.33.0", + "@typescript-eslint/typescript-estree": "^5.33.0", + "copy-webpack-plugin": "^11.0.0", + "eslint": "^8.21.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-no-relative-import-paths": "^1.4.0", + "eslint-plugin-prettier": "^4.2.1", + "jest": "^28.1.3", + "prettier": "^2.7.1", + "rimraf": "^3.0.2", + "source-map-support": "^0.5.21", + "supertest": "^6.2.4", + "ts-jest": "^28.0.7", + "ts-loader": "^9.3.1", + "ts-node": "^10.9.1", + "tsconfig-paths": "^4.1.0", + "tsconfig-paths-webpack-plugin": "^4.0.0", + "typescript": "^4.7.4", + "webpack": "^5.74.0", + "webpack-cli": "^4.10.0", + "webpack-node-externals": "^3.0.0" + }, + "jest": { + "moduleFileExtensions": [ + "js", + "json", + "ts" + ], + "rootDir": "src", + "testRegex": ".*\\.spec\\.ts$", + "transform": { + "^.+\\.(t|j)s$": "ts-jest" + }, + "collectCoverageFrom": [ + "**/*.(t|j)s" + ], + "coverageDirectory": "../coverage", + "testEnvironment": "node" + } +} diff --git a/old_backend/requests.http b/old_backend/requests.http new file mode 100644 index 0000000..ea97db6 --- /dev/null +++ b/old_backend/requests.http @@ -0,0 +1,36 @@ +### Create account +POST http://127.0.0.1:8080/api/auth/signup +Content-Type: application/json + +{"username": "root@mattv.de", "password": "123"} + +### Wrong authenctication +POST http://127.0.0.1:8080/api/auth/login +Content-Type: application/json + +{"username": "root@mattv.de", "password": "this is not correct"} + +### Correct authentication +POST http://127.0.0.1:8080/api/auth/login +Content-Type: application/json + +{"username": "root@mattv.de", "password": "123"} + +> {% client.global.set("auth_token", response.body.jwt); %} + +### Check if authenticated with admin perms +GET http://127.0.0.1:8080/test/hello2 +Authorization: Bearer {{auth_token}} + + +### Refresh token +POST http://127.0.0.1:8080/api/auth/refresh +Authorization: Bearer {{auth_token}} + +### A +POST https://ssh.gitlab.mattv.de/oauth/token +?redirect_uri=http%3A//127.0.0.1%3A1234/api/auth/gitlab_callback +&client_id=98bcbad78cb1f880d1d1de62291d70a791251a7bea077bfe7df111ef3c115760 +&client_secret=7ee01d2b204aff3a05f9d028f004d169b6d381ec873e195f314b3935fa150959 +&code=b96f91b171cf23245ea08c6f35c3831698e8683c6d0306de1396507f0f51d4c7 +&grant_type=authorization_code \ No newline at end of file diff --git a/old_backend/src/controller/filesystem.ts b/old_backend/src/controller/filesystem.ts new file mode 100644 index 0000000..8b179c5 --- /dev/null +++ b/old_backend/src/controller/filesystem.ts @@ -0,0 +1,28 @@ +import { + Body, + Controller, + Get, + Param, + ParseIntPipe, + Post, + Request, + StreamableFile, + ValidationPipe +} from '@nestjs/common'; +import { Responses, Requests, validateAsyncInline, UserRole } from '../../dto'; +import FileSystemService from 'services/filesystem'; +import { Role } from 'authguards'; + +@Controller('api/fs') +export default class FileSystemController { + constructor(private fsService: FileSystemService) {} + + @Post('download') + @Role(UserRole.USER) + async download( + @Request() req, + @Body('id', ParseIntPipe) id + ): Promise { + return this.fsService.downloadFile(id, req.user); + } +} diff --git a/old_backend/src/services/filesystem.ts b/old_backend/src/services/filesystem.ts new file mode 100644 index 0000000..8aec418 --- /dev/null +++ b/old_backend/src/services/filesystem.ts @@ -0,0 +1,32 @@ +import { + BadRequestException, + Injectable, + NotImplementedException, + StreamableFile, + UnauthorizedException +} from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { INode, User } from 'entities'; +import { Repository } from 'typeorm'; +import { Multipart } from '@fastify/multipart'; +import { pipeline } from 'stream/promises'; +import { createReadStream, createWriteStream, statSync, unlink } from 'fs'; +import { Writable } from 'stream'; + +@Injectable() +export default class FileSystemService { + constructor( + @InjectRepository(INode) + private inodeRepo: Repository + ) {} + + async downloadFile(id: number, user: User): Promise { + const node = await this.getNodeAndValidate(id, user); + if (!node.isFile) throw new NotImplementedException(); + const stats = statSync(`files/${node.id}`); + return new StreamableFile(createReadStream(`files/${node.id}`), { + disposition: `attachment; filename="${node.name}"`, + length: stats.size + }); + } +} diff --git a/tools/apigen.ts b/old_backend/tools/apigen.ts similarity index 65% rename from tools/apigen.ts rename to old_backend/tools/apigen.ts index 44f5efa..56f3134 100644 --- a/tools/apigen.ts +++ b/old_backend/tools/apigen.ts @@ -35,10 +35,16 @@ class BetterWritable { this.indent--; this.write(data); } + writeDecInc(data: string) { + this.indent--; + this.write(data); + this.indent++; + } } interface Outputable { write(s: BetterWritable); + writeJsonAs(ns: string, s: BetterWritable); } class CppProp { @@ -48,23 +54,55 @@ class CppProp { entry: string; } +// template <> inline dto::Requests::Auth::LoginRequest Json::Value::as() const { return asFloat(); } + class CppClass implements Outputable { constructor(name: string) { this.name = name; } + type = 'class' as const; name: string; sub: string[] = []; entries: CppProp[] = []; write(s: BetterWritable) { let name = `struct ${this.name}`; - if (this.sub.length > 0) name += ' : ' + this.sub.join(', '); - if (this.entries.length == 0) s.write(`${name} {}`); - else { - s.writeInc(`${name} {`); - this.entries.forEach((e) => s.write(`${e.entry};`)); - s.writeDec('};'); + if (this.sub.length > 0) + name += ' : public ' + this.sub.join(', public '); + s.writeInc(`${name} {`); + if (this.sub.length == 0) { + s.write(`${this.name}() = default;`); + s.writeInc(`explicit ${this.name}(const Json::Value& j) {`); + } else { + s.writeInc(`${this.name}() :`); + this.sub.forEach((sub) => { + s.write(`${sub}()`); + }); + s.writeDec('{}'); + s.writeInc(`explicit ${this.name}(const Json::Value& j) :`); + this.sub.forEach((sub) => { + s.write(`${sub}(j)`); + }); + s.writeDecInc('{'); } + this.entries.forEach((e) => { + const [type, name] = e.entry.split(' '); + const opt_match = /std::optional<([a-z:<>]+)>/.exec(type); + if (opt_match !== null) + s.write( + `this->${name} = json_get_optional<${opt_match[1]}>(j, "${name}");` + ); + else s.write(`this->${name} = j["${name}"].as<${type}>();`); + }); + s.writeDec('}'); + this.entries.forEach((e) => s.write(`${e.entry};`)); + s.writeDec('};'); + } + + writeJsonAs(ns: string, s: BetterWritable) { + s.write( + `template <> inline ${ns}${this.name} Json::Value::as() const { return ${ns}${this.name}(*this); }` + ); } } @@ -72,22 +110,32 @@ class CppEnum implements Outputable { constructor(name: string) { this.name = name; } + type = 'enum' as const; name: string; entries: CppProp[] = []; write(s: BetterWritable) { - s.writeInc(`enum ${this.name} {`); + return; + s.writeInc(`enum ${this.name} : int {`); this.entries.forEach((e, idx, arr) => s.write(`${e.entry}${idx === arr.length - 1 ? '' : ','}`) ); s.writeDec('};'); } + + writeJsonAs(ns: string, s: BetterWritable) { + return; + s.write( + `template <> inline ${ns}${this.name} Json::Value::as() const { return (${ns}${this.name})(asInt()); }` + ); + } } class CppNamespace implements Outputable { constructor(name: string) { this.name = name; } + type = 'ns' as const; name: string; body: (CppNamespace | CppClass | CppEnum)[] = []; @@ -96,56 +144,57 @@ class CppNamespace implements Outputable { this.body.forEach((b) => b.write(s)); s.writeDec('}'); } + + writeJsonAs(ns: string, s: BetterWritable) { + ns += `${this.name}::`; + this.body.forEach((b) => b.writeJsonAs(ns, s)); + } } function _getCppType( t: TypeNode -): string | ((opt: boolean, name: string) => string) { +): null | string | ((opt: boolean, name: string) => string) { switch (t.type) { case AST_NODE_TYPES.TSStringKeyword: return 'std::string'; case AST_NODE_TYPES.TSBooleanKeyword: return 'bool'; case AST_NODE_TYPES.TSNumberKeyword: - return 'long'; + return 'int'; case AST_NODE_TYPES.TSTypeReference: if (t.typeName.type != AST_NODE_TYPES.Identifier) throw new Err(t); return t.typeName.name; case AST_NODE_TYPES.TSLiteralType: - if (t.literal.type != AST_NODE_TYPES.Literal) throw new Err(t); - return (opt, name) => `${name} = ${(t.literal as a.Literal).raw}`; + return null; case AST_NODE_TYPES.TSUnionType: return _getCppType(t.types[0]); case AST_NODE_TYPES.TSArrayType: - return (opt, name) => - opt - ? `std::optional<${_getCppType(t.elementType)}[]> ${name}` - : `${getCppType(false, name, t.elementType)}[]`; + return `std::vector<${_getCppType(t.elementType)}>`; default: throw new Err(t); } } -function getCppType(opt: boolean, name: string, t: TypeNode): string { +function getCppType(opt: boolean, name: string, t: TypeNode): null | string { let ret = _getCppType(t); + if (typeof ret === 'function') return `${ret(opt, name)}`; if (typeof ret === 'string') { if (opt) ret = `std::optional<${ret}>`; return `${ret} ${name}`; - } else return `${ret(opt, name)}`; + } else return ret; } function handleClassProperty( prop: a.PropertyDefinitionComputedName | a.PropertyDefinitionNonComputedName -): CppProp { +): CppProp | null { if (prop.key.type != AST_NODE_TYPES.Identifier) throw new Err(prop); if (!prop.typeAnnotation) throw new Err(prop); - return new CppProp( - getCppType( - prop.optional && prop.optional, - prop.key.name, - prop.typeAnnotation.typeAnnotation - ) + const type = getCppType( + prop.optional && prop.optional, + prop.key.name, + prop.typeAnnotation.typeAnnotation ); + return type === null ? null : new CppProp(type); } function handleClass( @@ -160,13 +209,14 @@ function handleClass( } dec.body.body.forEach((inner) => { if (inner.type == AST_NODE_TYPES.PropertyDefinition) { - cls.entries.push(handleClassProperty(inner)); + const prop = handleClassProperty(inner); + if (prop) cls.entries.push(prop); } else if ( inner.type == AST_NODE_TYPES.MethodDefinition && inner.key.type == AST_NODE_TYPES.Identifier && inner.key.name === 'constructor' ) - console.warn('Handle constructors?'); + return; else throw new Err(inner); }); return cls; @@ -240,8 +290,17 @@ function parseFile(ns: CppNamespace, file: string) { } const globalNamespace = new CppNamespace('dto'); -parseFile(globalNamespace, 'dto/index.ts'); +parseFile(globalNamespace, '../dto/index.ts'); -const output_stream = fs.createWriteStream('dto.h'); -output_stream.write('#include \n#include \n\n'); -globalNamespace.write(new BetterWritable(output_stream)); +const output_stream = fs.createWriteStream('../backend/src/dto.h'); +output_stream.write( + '#pragma once\n\n' + + '#include \n' + + '#include \n' + + '#include \n' + + '#include \n' + + '#include "dto_extras.h"\n\n' +); +const output = new BetterWritable(output_stream); +globalNamespace.write(output); +globalNamespace.writeJsonAs('', output); diff --git a/old_backend/tsconfig.json b/old_backend/tsconfig.json new file mode 100644 index 0000000..08f305b --- /dev/null +++ b/old_backend/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "module": "commonjs", + "declaration": false, + "removeComments": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "allowSyntheticDefaultImports": true, + "target": "es2017", + "sourceMap": true, + "outDir": "./dist", + "baseUrl": "./src", + "incremental": true, + "skipLibCheck": true, + "resolveJsonModule": true, + "strictPropertyInitialization": false + }, + "exclude": ["node_modules", "dist", "test", "**/*spec.ts", "frontend"] +} diff --git a/old_backend/yarn.lock b/old_backend/yarn.lock new file mode 100644 index 0000000..87c2af0 --- /dev/null +++ b/old_backend/yarn.lock @@ -0,0 +1,6014 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@ampproject/remapping@^2.1.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" + integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== + dependencies: + "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@angular-devkit/core@14.0.5": + version "14.0.5" + resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-14.0.5.tgz#19f5940b53aeb0ce56479c44670d3bc3b2df92b1" + integrity sha512-/CUGi6QLwh79FvsOY7M+1LQL3asZsbQW/WBd5f1iu5y7TLNqCwo+wOb0ZXLDNPw45vYBxFajtt3ob3U7qx3jNg== + dependencies: + ajv "8.11.0" + ajv-formats "2.1.1" + jsonc-parser "3.0.0" + rxjs "6.6.7" + source-map "0.7.3" + +"@angular-devkit/schematics-cli@14.0.5": + version "14.0.5" + resolved "https://registry.yarnpkg.com/@angular-devkit/schematics-cli/-/schematics-cli-14.0.5.tgz#a1ec438cca8814650bf7ecbcbb7c182e69437669" + integrity sha512-S+u0KjglyI3jEZWwIuBvFjEwY3Zk5lCWfhet+95sFKJEjEYgF4Fuk8Mau/9cr55hIcpZqTQUvyxnS/VDoj4WLg== + dependencies: + "@angular-devkit/core" "14.0.5" + "@angular-devkit/schematics" "14.0.5" + ansi-colors "4.1.1" + inquirer "8.2.4" + symbol-observable "4.0.0" + yargs-parser "21.0.1" + +"@angular-devkit/schematics@14.0.5": + version "14.0.5" + resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-14.0.5.tgz#01777d2ad473d35bdfdbbb751521c43421ad9772" + integrity sha512-sufxITBkn2MvgEREt9JQ3QCKHS+sue1WsVzLE+TWqG5MC/RPk0f9tQ5VoHk6ZTzDKUvOtSoc7G+n0RscQsyp5g== + dependencies: + "@angular-devkit/core" "14.0.5" + jsonc-parser "3.0.0" + magic-string "0.26.1" + ora "5.4.1" + rxjs "6.6.7" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" + integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== + dependencies: + "@babel/highlight" "^7.18.6" + +"@babel/compat-data@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.18.6.tgz#8b37d24e88e8e21c499d4328db80577d8882fa53" + integrity sha512-tzulrgDT0QD6U7BJ4TKVk2SDDg7wlP39P9yAx1RfLy7vP/7rsDRlWVfbWxElslu56+r7QOhB2NSDsabYYruoZQ== + +"@babel/core@^7.11.6", "@babel/core@^7.12.3": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.6.tgz#54a107a3c298aee3fe5e1947a6464b9b6faca03d" + integrity sha512-cQbWBpxcbbs/IUredIPkHiAGULLV8iwgNRMFzvbhEXISp4f3rUUXE5+TIw6KwUWUR3DwyI6gmBRnmAtYaWehwQ== + dependencies: + "@ampproject/remapping" "^2.1.0" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.18.6" + "@babel/helper-compilation-targets" "^7.18.6" + "@babel/helper-module-transforms" "^7.18.6" + "@babel/helpers" "^7.18.6" + "@babel/parser" "^7.18.6" + "@babel/template" "^7.18.6" + "@babel/traverse" "^7.18.6" + "@babel/types" "^7.18.6" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.1" + semver "^6.3.0" + +"@babel/generator@^7.18.6", "@babel/generator@^7.7.2": + version "7.18.7" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.7.tgz#2aa78da3c05aadfc82dbac16c99552fc802284bd" + integrity sha512-shck+7VLlY72a2w9c3zYWuE1pwOKEiQHV7GTUbSnhyl5eu3i04t30tBY82ZRWrDfo3gkakCFtevExnxbkf2a3A== + dependencies: + "@babel/types" "^7.18.7" + "@jridgewell/gen-mapping" "^0.3.2" + jsesc "^2.5.1" + +"@babel/helper-compilation-targets@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.6.tgz#18d35bfb9f83b1293c22c55b3d576c1315b6ed96" + integrity sha512-vFjbfhNCzqdeAtZflUFrG5YIFqGTqsctrtkZ1D/NB0mDW9TwW3GmmUepYY4G9wCET5rY5ugz4OGTcLd614IzQg== + dependencies: + "@babel/compat-data" "^7.18.6" + "@babel/helper-validator-option" "^7.18.6" + browserslist "^4.20.2" + semver "^6.3.0" + +"@babel/helper-environment-visitor@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.6.tgz#b7eee2b5b9d70602e59d1a6cad7dd24de7ca6cd7" + integrity sha512-8n6gSfn2baOY+qlp+VSzsosjCVGFqWKmDF0cCWOybh52Dw3SEyoWR1KrhMJASjLwIEkkAufZ0xvr+SxLHSpy2Q== + +"@babel/helper-function-name@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.18.6.tgz#8334fecb0afba66e6d87a7e8c6bb7fed79926b83" + integrity sha512-0mWMxV1aC97dhjCah5U5Ua7668r5ZmSC2DLfH2EZnf9c3/dHZKiFa5pRLMH5tjSl471tY6496ZWk/kjNONBxhw== + dependencies: + "@babel/template" "^7.18.6" + "@babel/types" "^7.18.6" + +"@babel/helper-hoist-variables@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" + integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-module-imports@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" + integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-module-transforms@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.18.6.tgz#57e3ca669e273d55c3cda55e6ebf552f37f483c8" + integrity sha512-L//phhB4al5uucwzlimruukHB3jRd5JGClwRMD/ROrVjXfLqovYnvQrK/JK36WYyVwGGO7OD3kMyVTjx+WVPhw== + dependencies: + "@babel/helper-environment-visitor" "^7.18.6" + "@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.6" + "@babel/types" "^7.18.6" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.8.0": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.6.tgz#9448974dd4fb1d80fefe72e8a0af37809cd30d6d" + integrity sha512-gvZnm1YAAxh13eJdkb9EWHBnF3eAub3XTLCZEehHT2kWxiKVRL64+ae5Y6Ivne0mVHmMYKT+xWgZO+gQhuLUBg== + +"@babel/helper-simple-access@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz#d6d8f51f4ac2978068df934b569f08f29788c7ea" + integrity sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-split-export-declaration@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" + integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-validator-identifier@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076" + integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g== + +"@babel/helper-validator-option@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" + integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== + +"@babel/helpers@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.18.6.tgz#4c966140eaa1fcaa3d5a8c09d7db61077d4debfd" + integrity sha512-vzSiiqbQOghPngUYt/zWGvK3LAsPhz55vc9XNN0xAl2gV4ieShI2OQli5duxWHD+72PZPTKAcfcZDE1Cwc5zsQ== + dependencies: + "@babel/template" "^7.18.6" + "@babel/traverse" "^7.18.6" + "@babel/types" "^7.18.6" + +"@babel/highlight@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== + dependencies: + "@babel/helper-validator-identifier" "^7.18.6" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.6.tgz#845338edecad65ebffef058d3be851f1d28a63bc" + integrity sha512-uQVSa9jJUe/G/304lXspfWVpKpK4euFLgGiMQFOCpM/bgcAdeoHwi/OQz23O9GK2osz26ZiXRRV9aV+Yl1O8tw== + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-bigint@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.8.3": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-import-meta@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.7.2": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz#1c09cd25795c7c2b8a4ba9ae49394576d4133285" + integrity sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/template@^7.18.6", "@babel/template@^7.3.3": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.6.tgz#1283f4993e00b929d6e2d3c72fdc9168a2977a31" + integrity sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.18.6" + "@babel/types" "^7.18.6" + +"@babel/traverse@^7.18.6", "@babel/traverse@^7.7.2": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.6.tgz#a228562d2f46e89258efa4ddd0416942e2fd671d" + integrity sha512-zS/OKyqmD7lslOtFqbscH6gMLFYOfG1YPqCKfAW5KrTeolKqvB8UelR49Fpr6y93kYkW2Ik00mT1LOGiAGvizw== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.18.6" + "@babel/helper-environment-visitor" "^7.18.6" + "@babel/helper-function-name" "^7.18.6" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.18.6" + "@babel/types" "^7.18.6" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.18.6", "@babel/types@^7.18.7", "@babel/types@^7.3.0", "@babel/types@^7.3.3": + version "7.18.7" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.7.tgz#a4a2c910c15040ea52cdd1ddb1614a65c8041726" + integrity sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ== + dependencies: + "@babel/helper-validator-identifier" "^7.18.6" + to-fast-properties "^2.0.0" + +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== + +"@colors/colors@1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" + integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== + +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + +"@discoveryjs/json-ext@^0.5.0": + version "0.5.7" + resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" + integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== + +"@eslint/eslintrc@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.0.tgz#29f92c30bb3e771e4a2048c95fa6855392dfac4f" + integrity sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.3.2" + globals "^13.15.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@fastify/accept-negotiator@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@fastify/accept-negotiator/-/accept-negotiator-1.0.0.tgz#f0e73a3f8c6ba739d66a629b386c838889ec7a23" + integrity sha512-4R/N2KfYeld7A5LGkai+iUFMahXcxxYbDp+XS2B1yuL3cdmZLJ9TlCnNzT3q5xFTqsYm0GPpinLUwfSwjcVjyA== + +"@fastify/ajv-compiler@^3.1.1": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@fastify/ajv-compiler/-/ajv-compiler-3.1.2.tgz#9b3c4ae0f5feeb2a90ee797cff6dc26e1831795b" + integrity sha512-m2nzzQJeuVmeGOB9rnII9sZiY8AZ02a9WMQfMBfK1jxdFnxm3FPYKGbYpPjODj4halNogwpolyugbTNpnDCi0A== + dependencies: + ajv "^8.10.0" + ajv-formats "^2.1.1" + fast-uri "^2.0.0" + +"@fastify/busboy@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-1.1.0.tgz#4472f856e2bb5a9ee34ad64b93891b73b73537ca" + integrity sha512-Fv854f94v0CzIDllbY3i/0NJPNBRNLDawf3BTYVGCe9VrIIs3Wi7AFx24F9NzCxdf0wyx/x0Q9kEVnvDOPnlxA== + dependencies: + text-decoding "^1.0.0" + +"@fastify/cors@8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@fastify/cors/-/cors-8.1.0.tgz#af29ddb32675310dfcbbe3aa0af4b7ed29fdb956" + integrity sha512-1OmjwyxQZ8GePxa5t1Rpsn2qS56+1ouKMvZufpgJWhXtoCeM/ffA+PsNW8pyslPr4W0E27gVoFqtvHwhXW1U2w== + dependencies: + fastify-plugin "^4.0.0" + mnemonist "0.39.2" + +"@fastify/deepmerge@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@fastify/deepmerge/-/deepmerge-1.1.0.tgz#91f0a5a27034ff76b7bece63a5906894940ace82" + integrity sha512-E8Hfdvs1bG6u0N4vN5Nty6JONUfTdOciyD5rn8KnEsLKIenvOVcr210BQR9t34PRkNyjqnMLGk3e0BsaxRdL+g== + +"@fastify/error@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@fastify/error/-/error-3.0.0.tgz#bfcb7b33cec0196413083a91ef2edc7b2c88455b" + integrity sha512-dPRyT40GiHRzSCll3/Jn2nPe25+E1VXc9tDwRAIKwFCxd5Np5wzgz1tmooWG3sV0qKgrBibihVoCna2ru4SEFg== + +"@fastify/fast-json-stringify-compiler@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-4.0.0.tgz#444139d0a12b3e3a8fcdda29da7e9a6c72c8e404" + integrity sha512-9pCi6c6tmGt/qfuf2koZQuSIG6ckP9q3mz+JoMmAq9eQ4EtA92sWoK7E0LJUn2FFTS/hp5kag+4+dWsV5ZfcXg== + dependencies: + fast-json-stringify "^5.0.0" + +"@fastify/formbody@7.0.1": + version "7.0.1" + resolved "https://registry.yarnpkg.com/@fastify/formbody/-/formbody-7.0.1.tgz#247a4a2c930d7cf97c912fbd228340cc85484dec" + integrity sha512-CY6IfzdtidHbZezyyXv7u9dzmb2Lv92HyOZDqANuFb++5ojsqoqIb8bJz11bSgPK0MDoqww/dH6DxZDMM8N4ng== + dependencies: + fastify-plugin "^3.0.0" + +"@fastify/middie@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@fastify/middie/-/middie-8.0.0.tgz#78fe18e948e03de0c7453d0f813d198acac233ca" + integrity sha512-SsZUzJwRV2IBhko8TNI5gGzUdUp2Xd0XCrU+pBTfsMN8LYGsksDI/Hb3qcUZ2/Kfg6ecbFEeRO4nZmHeFCDpHQ== + dependencies: + fastify-plugin "^3.0.0" + path-to-regexp "^6.1.0" + reusify "^1.0.4" + +"@fastify/multipart@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@fastify/multipart/-/multipart-7.1.0.tgz#baf7ec032e4c849c89ddcdc2365c78fc8a12a661" + integrity sha512-EemYz5DLA7zWtelnNeN5Nj3b3zpN98kGv4sT+DvB7rWxoOz1XwhTnb2mnbwp08tEadMTevSmGdjJLc6sreMgyg== + dependencies: + "@fastify/busboy" "^1.0.0" + "@fastify/error" "^3.0.0" + deepmerge "^4.2.2" + end-of-stream "^1.4.4" + fastify-plugin "^3.0.0" + hexoid "^1.0.0" + secure-json-parse "^2.4.0" + stream-wormhole "^1.1.0" + +"@fastify/static@^6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@fastify/static/-/static-6.5.0.tgz#004fdb487ddf0ee5fdf7541e56bfcb493d7a1060" + integrity sha512-WEk6iqgejA6ivjkvbJ47A+uMci225z5lZwLXCXZS3ZYR/kYje1gzzarkKKGL6TWpBw6smkOzxA7dfEoY0347Nw== + dependencies: + "@fastify/accept-negotiator" "^1.0.0" + content-disposition "^0.5.3" + fastify-plugin "^4.0.0" + glob "^8.0.1" + p-limit "^3.1.0" + readable-stream "^4.0.0" + send "^0.18.0" + +"@gar/promisify@^1.0.1": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" + integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== + +"@humanwhocodes/config-array@^0.10.4": + version "0.10.4" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.10.4.tgz#01e7366e57d2ad104feea63e72248f22015c520c" + integrity sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.4" + +"@humanwhocodes/gitignore-to-minimatch@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz#316b0a63b91c10e53f242efb4ace5c3b34e8728d" + integrity sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA== + +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + 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" + +"@istanbuljs/schema@^0.1.2": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jest/console@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-28.1.3.tgz#2030606ec03a18c31803b8a36382762e447655df" + integrity sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw== + dependencies: + "@jest/types" "^28.1.3" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^28.1.3" + jest-util "^28.1.3" + slash "^3.0.0" + +"@jest/core@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-28.1.3.tgz#0ebf2bd39840f1233cd5f2d1e6fc8b71bd5a1ac7" + integrity sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA== + dependencies: + "@jest/console" "^28.1.3" + "@jest/reporters" "^28.1.3" + "@jest/test-result" "^28.1.3" + "@jest/transform" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + ci-info "^3.2.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-changed-files "^28.1.3" + jest-config "^28.1.3" + jest-haste-map "^28.1.3" + jest-message-util "^28.1.3" + jest-regex-util "^28.0.2" + jest-resolve "^28.1.3" + jest-resolve-dependencies "^28.1.3" + jest-runner "^28.1.3" + jest-runtime "^28.1.3" + jest-snapshot "^28.1.3" + jest-util "^28.1.3" + jest-validate "^28.1.3" + jest-watcher "^28.1.3" + micromatch "^4.0.4" + pretty-format "^28.1.3" + rimraf "^3.0.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/environment@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-28.1.3.tgz#abed43a6b040a4c24fdcb69eab1f97589b2d663e" + integrity sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA== + dependencies: + "@jest/fake-timers" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/node" "*" + jest-mock "^28.1.3" + +"@jest/expect-utils@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-28.1.3.tgz#58561ce5db7cd253a7edddbc051fb39dda50f525" + integrity sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA== + dependencies: + jest-get-type "^28.0.2" + +"@jest/expect@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-28.1.3.tgz#9ac57e1d4491baca550f6bdbd232487177ad6a72" + integrity sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw== + dependencies: + expect "^28.1.3" + jest-snapshot "^28.1.3" + +"@jest/fake-timers@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-28.1.3.tgz#230255b3ad0a3d4978f1d06f70685baea91c640e" + integrity sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw== + dependencies: + "@jest/types" "^28.1.3" + "@sinonjs/fake-timers" "^9.1.2" + "@types/node" "*" + jest-message-util "^28.1.3" + jest-mock "^28.1.3" + jest-util "^28.1.3" + +"@jest/globals@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-28.1.3.tgz#a601d78ddc5fdef542728309894895b4a42dc333" + integrity sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA== + dependencies: + "@jest/environment" "^28.1.3" + "@jest/expect" "^28.1.3" + "@jest/types" "^28.1.3" + +"@jest/reporters@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-28.1.3.tgz#9adf6d265edafc5fc4a434cfb31e2df5a67a369a" + integrity sha512-JuAy7wkxQZVNU/V6g9xKzCGC5LVXx9FDcABKsSXp5MiKPEE2144a/vXTEDoyzjUpZKfVwp08Wqg5A4WfTMAzjg== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^28.1.3" + "@jest/test-result" "^28.1.3" + "@jest/transform" "^28.1.3" + "@jest/types" "^28.1.3" + "@jridgewell/trace-mapping" "^0.3.13" + "@types/node" "*" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^5.1.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.1.3" + jest-message-util "^28.1.3" + jest-util "^28.1.3" + jest-worker "^28.1.3" + slash "^3.0.0" + string-length "^4.0.1" + strip-ansi "^6.0.0" + terminal-link "^2.0.0" + v8-to-istanbul "^9.0.1" + +"@jest/schemas@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-28.1.3.tgz#ad8b86a66f11f33619e3d7e1dcddd7f2d40ff905" + integrity sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg== + dependencies: + "@sinclair/typebox" "^0.24.1" + +"@jest/source-map@^28.1.2": + version "28.1.2" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-28.1.2.tgz#7fe832b172b497d6663cdff6c13b0a920e139e24" + integrity sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww== + dependencies: + "@jridgewell/trace-mapping" "^0.3.13" + callsites "^3.0.0" + graceful-fs "^4.2.9" + +"@jest/test-result@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-28.1.3.tgz#5eae945fd9f4b8fcfce74d239e6f725b6bf076c5" + integrity sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg== + dependencies: + "@jest/console" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-28.1.3.tgz#9d0c283d906ac599c74bde464bc0d7e6a82886c3" + integrity sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw== + dependencies: + "@jest/test-result" "^28.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^28.1.3" + slash "^3.0.0" + +"@jest/transform@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-28.1.3.tgz#59d8098e50ab07950e0f2fc0fc7ec462371281b0" + integrity sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA== + dependencies: + "@babel/core" "^7.11.6" + "@jest/types" "^28.1.3" + "@jridgewell/trace-mapping" "^0.3.13" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^28.1.3" + jest-regex-util "^28.0.2" + jest-util "^28.1.3" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + write-file-atomic "^4.0.1" + +"@jest/types@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-28.1.3.tgz#b05de80996ff12512bc5ceb1d208285a7d11748b" + integrity sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ== + dependencies: + "@jest/schemas" "^28.1.3" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + +"@jridgewell/gen-mapping@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" + integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== + dependencies: + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@^3.0.3": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/source-map@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" + integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.14" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.13", "@jridgewell/trace-mapping@^0.3.7", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.14" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz#b231a081d8f66796e475ad588a1ef473112701ed" + integrity sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@mapbox/node-pre-gyp@^1.0.0", "@mapbox/node-pre-gyp@^1.0.9": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.9.tgz#09a8781a3a036151cdebbe8719d6f8b25d4058bc" + integrity sha512-aDF3S3rK9Q2gey/WAttUlISduDItz5BU3306M9Eyv6/oS40aMprnopshtlKTykxRNIBEZuRMaZAnbrQ4QtKGyw== + dependencies: + detect-libc "^2.0.0" + https-proxy-agent "^5.0.0" + make-dir "^3.1.0" + node-fetch "^2.6.7" + nopt "^5.0.0" + npmlog "^5.0.1" + rimraf "^3.0.2" + semver "^7.3.5" + tar "^6.1.11" + +"@nestjs/cli@^9.0.0": + version "9.0.0" + resolved "https://registry.yarnpkg.com/@nestjs/cli/-/cli-9.0.0.tgz#f9ab4c33cfbc9ee54d792fe29e0f582e0bf04b06" + integrity sha512-xT5uOoIEcaB/Fn6UeF7atfKqKiEEsTeRKPiM55p+e5H9WVw8FC2r4ceZgaINJbsw0QWskVj/ZQadMo6dA6hXxw== + dependencies: + "@angular-devkit/core" "14.0.5" + "@angular-devkit/schematics" "14.0.5" + "@angular-devkit/schematics-cli" "14.0.5" + "@nestjs/schematics" "^9.0.0" + chalk "3.0.0" + chokidar "3.5.3" + cli-table3 "0.6.2" + commander "4.1.1" + fork-ts-checker-webpack-plugin "7.2.11" + inquirer "7.3.3" + node-emoji "1.11.0" + ora "5.4.1" + os-name "4.0.1" + rimraf "3.0.2" + shelljs "0.8.5" + source-map-support "0.5.21" + tree-kill "1.2.2" + tsconfig-paths "3.14.1" + tsconfig-paths-webpack-plugin "3.5.2" + typescript "4.7.4" + webpack "5.73.0" + webpack-node-externals "3.0.0" + +"@nestjs/common@^9.0.8": + version "9.0.11" + resolved "https://registry.yarnpkg.com/@nestjs/common/-/common-9.0.11.tgz#5747cfbb5d94d909bc2894bf2a5bec83fca809c5" + integrity sha512-oYLIcOal3QOwcqt6goXovRNg8ZkalyOMjH0oYYzfJLrait6P7c6nAeWHu4qFDThY7GoZHEanLgji1qlqVEW09g== + dependencies: + iterare "1.2.1" + tslib "2.4.0" + uuid "8.3.2" + +"@nestjs/core@^9.0.8": + version "9.0.11" + resolved "https://registry.yarnpkg.com/@nestjs/core/-/core-9.0.11.tgz#1bed969d81685f17d4a01f854c43a222dd3e13ce" + integrity sha512-DYyoiWSGebDAG8WSfG/ue88HBU39kAJTi2YXftWdVSl1LFveV+pwKY83P2qX0ND38TS8WktFYpaMkXslf97BBQ== + dependencies: + "@nuxtjs/opencollective" "0.3.2" + fast-safe-stringify "2.1.1" + iterare "1.2.1" + object-hash "3.0.0" + path-to-regexp "3.2.0" + tslib "2.4.0" + uuid "8.3.2" + +"@nestjs/jwt@^9.0.0": + version "9.0.0" + resolved "https://registry.yarnpkg.com/@nestjs/jwt/-/jwt-9.0.0.tgz#73e01338d2853a55033528b540cfd92c7996bae9" + integrity sha512-ZsXGY/wMYKzEhymw2+dxiwrHTRKIKrGszx6r2EjQqNLypdXMQu0QrujwZJ8k3+XQV4snmuJwwNakQoA2ILfq8w== + dependencies: + "@types/jsonwebtoken" "8.5.8" + jsonwebtoken "8.5.1" + +"@nestjs/passport@^9.0.0": + version "9.0.0" + resolved "https://registry.yarnpkg.com/@nestjs/passport/-/passport-9.0.0.tgz#0571bb08f8043456bc6df44cd4f59ca5f10c9b9f" + integrity sha512-Gnh8n1wzFPOLSS/94X1sUP4IRAoXTgG4odl7/AO5h+uwscEGXxJFercrZfqdAwkWhqkKWbsntM3j5mRy/6ZQDA== + +"@nestjs/platform-fastify@^9.0.8": + version "9.0.11" + resolved "https://registry.yarnpkg.com/@nestjs/platform-fastify/-/platform-fastify-9.0.11.tgz#b45df7263270695a69cd140d9c5a065ee8dc3a0a" + integrity sha512-xmm+7vIb5Is+V/YfRhabZEq9A6s4jxHB1g61RtBiLhLRfG6H+4KBfSFxCdbu5wPoPSPljzlNzmdE11h+jY5vHA== + dependencies: + "@fastify/cors" "8.1.0" + "@fastify/formbody" "7.0.1" + "@fastify/middie" "8.0.0" + fastify "4.4.0" + light-my-request "5.4.0" + path-to-regexp "3.2.0" + tslib "2.4.0" + +"@nestjs/schematics@^9.0.0", "@nestjs/schematics@^9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@nestjs/schematics/-/schematics-9.0.1.tgz#2ec1b3fc4cd2c44310d4d7d1f5f276a18d24964b" + integrity sha512-QU7GbnQvADFXdumcdADmv4vil3bhnYl2IFHWKieRt0MgIhghgBxIB7kDKWhswcuZ0kZztVbyYjo9aCrlf62fcw== + dependencies: + "@angular-devkit/core" "14.0.5" + "@angular-devkit/schematics" "14.0.5" + fs-extra "10.1.0" + jsonc-parser "3.0.0" + pluralize "8.0.0" + +"@nestjs/serve-static@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@nestjs/serve-static/-/serve-static-3.0.0.tgz#085e7ebbb3c6d6e35b227ea57c8e988c87847309" + integrity sha512-TpXjgs4136dQqWUjEcONqppqXDsrJhRkmKWzuBMOUAnP4HjHpNmlycvkHnDnWSoG2YD4a7Enh4ViYGWqCfHStA== + dependencies: + path-to-regexp "0.2.5" + +"@nestjs/testing@^9.0.8": + version "9.0.11" + resolved "https://registry.yarnpkg.com/@nestjs/testing/-/testing-9.0.11.tgz#8e60107a7aaf9fc7b2bf29d473c2bdb1887de017" + integrity sha512-tT+yj3av7ZJb9Cy09C4+FoUULvzUntf81g5eK5shRVeQ35RWqr7E5Uq77B7ePUF2Er/TictVZk43d7rKq1ClNA== + dependencies: + tslib "2.4.0" + +"@nestjs/typeorm@^9.0.0": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@nestjs/typeorm/-/typeorm-9.0.1.tgz#f78bfc00e71731ea860288e4a03830107daf3d9c" + integrity sha512-A2BgLIPsMtmMI0bPKEf4bmzgFPsnvHqNBx3KkvaJ7hJrBQy0OqYOb+Rr06ifblKWDWS2tUPNrAFQbZjtk3PI+g== + dependencies: + uuid "8.3.2" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@npmcli/fs@^1.0.0": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-1.1.1.tgz#72f719fe935e687c56a4faecf3c03d06ba593257" + integrity sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ== + dependencies: + "@gar/promisify" "^1.0.1" + semver "^7.3.5" + +"@npmcli/move-file@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674" + integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg== + dependencies: + mkdirp "^1.0.4" + rimraf "^3.0.2" + +"@nuxtjs/opencollective@0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@nuxtjs/opencollective/-/opencollective-0.3.2.tgz#620ce1044f7ac77185e825e1936115bb38e2681c" + integrity sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA== + dependencies: + chalk "^4.1.0" + consola "^2.15.0" + node-fetch "^2.6.1" + +"@phc/format@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@phc/format/-/format-1.0.0.tgz#b5627003b3216dc4362125b13f48a4daa76680e4" + integrity sha512-m7X9U6BG2+J+R1lSOdCiITLLrxm+cWlNI3HUFA92oLO77ObGNzaKdh8pMLqdZcshtkKuV84olNNXDfMc4FezBQ== + +"@sinclair/typebox@^0.24.1": + version "0.24.28" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.28.tgz#15aa0b416f82c268b1573ab653e4413c965fe794" + integrity sha512-dgJd3HLOkLmz4Bw50eZx/zJwtBq65nms3N9VBYu5LTjJ883oBFkTyXRlCB/ZGGwqYpJJHA5zW2Ibhl5ngITfow== + +"@sinonjs/commons@^1.7.0": + version "1.8.3" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" + integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^9.1.2": + version "9.1.2" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz#4eaab737fab77332ab132d396a3c0d364bd0ea8c" + integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw== + dependencies: + "@sinonjs/commons" "^1.7.0" + +"@sqltools/formatter@^1.2.2": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@sqltools/formatter/-/formatter-1.2.3.tgz#1185726610acc37317ddab11c3c7f9066966bd20" + integrity sha512-O3uyB/JbkAEMZaP3YqyHH7TMnex7tWyCbCI4EfJdOCoN6HIhqdJBWTM6aCCiWQ/5f5wxjgU735QAIpJbjDvmzg== + +"@tootallnate/once@1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" + integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== + +"@tsconfig/node10@^1.0.7": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" + integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" + integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== + +"@types/babel__core@^7.1.14": + version "7.1.19" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.19.tgz#7b497495b7d1b4812bdb9d02804d0576f43ee460" + integrity sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.4" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" + integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" + integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.17.1" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.17.1.tgz#1a0e73e8c28c7e832656db372b779bfd2ef37314" + integrity sha512-kVzjari1s2YVi77D3w1yuvohV2idweYXMCDzqBiVNN63TcDWrIlTVOYpqVrvbbyOE/IyzBoTKF0fdnLPEORFxA== + dependencies: + "@babel/types" "^7.3.0" + +"@types/body-parser@*": + version "1.19.1" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.1.tgz#0c0174c42a7d017b818303d4b5d969cb0b75929c" + integrity sha512-a6bTJ21vFOGIkwM0kzh9Yr89ziVxq4vYH2fQ6N8AeipEzai/cFK6aGMArIkUeIdRIgpwQa+2bXiLuUJCpSf2Cg== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.35" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" + integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + dependencies: + "@types/node" "*" + +"@types/cookiejar@*": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@types/cookiejar/-/cookiejar-2.1.2.tgz#66ad9331f63fe8a3d3d9d8c6e3906dd10f6446e8" + integrity sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog== + +"@types/eslint-scope@^3.7.3": + version "3.7.4" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16" + integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*": + version "8.4.5" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.5.tgz#acdfb7dd36b91cc5d812d7c093811a8f3d9b31e4" + integrity sha512-dhsC09y1gpJWnK+Ff4SGvCuSnk9DaU0BJZSzOwa6GVSg65XtTugLBITDAAzRU5duGBoXBHpdR/9jHGxJjNflJQ== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*", "@types/estree@^0.0.51": + version "0.0.51" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" + integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== + +"@types/express-serve-static-core@^4.17.18": + version "4.17.23" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.23.tgz#721c371fc53fe7b3ea40d8977b209b90cb275f58" + integrity sha512-WYqTtTPTJn9kXMdnAH5HPPb7ctXvBpP4PfuOb8MV4OHPQWHhDZixGlhgR159lJPpKm23WOdoCkt2//cCEaOJkw== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + +"@types/express@*", "@types/express@^4.17.13": + version "4.17.13" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.13.tgz#a76e2995728999bab51a33fabce1d705a3709034" + integrity sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.18" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/graceful-fs@^4.1.3": + version "4.1.5" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" + integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== + dependencies: + "@types/node" "*" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" + integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== + +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" + integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/jest@^28.1.6": + version "28.1.7" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-28.1.7.tgz#a680c5d05b69634c2d54a63cb106d7fb1adaba16" + integrity sha512-acDN4VHD40V24tgu0iC44jchXavRNVFXQ/E6Z5XNsswgoSO/4NgsXoEYmPUGookKldlZQyIpmrEXsHI9cA3ZTA== + dependencies: + expect "^28.0.0" + pretty-format "^28.0.0" + +"@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + version "7.0.11" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" + integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + +"@types/jsonwebtoken@*", "@types/jsonwebtoken@8.5.8", "@types/jsonwebtoken@^8.5.8": + version "8.5.8" + resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-8.5.8.tgz#01b39711eb844777b7af1d1f2b4cf22fda1c0c44" + integrity sha512-zm6xBQpFDIDM6o9r6HSgDeIcLy82TKWctCXEPbJJcXb5AKmi5BNNdLXneixK4lplX3PqIVcwLBCGE/kAGnlD4A== + dependencies: + "@types/node" "*" + +"@types/mime@^1": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" + integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== + +"@types/node@*", "@types/node@^18.6.5": + version "18.7.11" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.7.11.tgz#486e72cfccde88da24e1f23ff1b7d8bfb64e6250" + integrity sha512-KZhFpSLlmK/sdocfSAjqPETTMd0ug6HIMIAwkwUpU79olnZdQtMxpQP+G1wDzCH7na+FltSIhbaZuKdwZ8RDrw== + +"@types/nodemailer@^6.4.5": + version "6.4.5" + resolved "https://registry.yarnpkg.com/@types/nodemailer/-/nodemailer-6.4.5.tgz#09011ac73259245475d1688e4ba101860567dc39" + integrity sha512-zuP3nBRQHI6M2PkXnGGy1Ww4VB+MyYHGgnfV2T+JR9KLkeWqPJuyVUgLpKXuFnA/b7pZaIDFh2sV4759B7jK1g== + dependencies: + "@types/node" "*" + +"@types/notp@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@types/notp/-/notp-2.0.2.tgz#7283f4918b2770555e0f2df72acc9f46ebd41ae9" + integrity sha512-JUcVYN9Tmw0AjoAfvjslS4hbv39fPBbZdftBK3b50g5z/DmhLsu6cd0UOEBiQuMwy2FirshF2Gk9gAvfWjshMw== + dependencies: + "@types/node" "*" + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + +"@types/passport-jwt@^3.0.6": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@types/passport-jwt/-/passport-jwt-3.0.6.tgz#41cc8b5803d5f5f06eb33e19c453b42716def4f1" + integrity sha512-cmAAMIRTaEwpqxlrZyiEY9kdibk94gP5KTF8AT1Ra4rWNZYHNMreqhKUEeC5WJtuN5SJZjPQmV+XO2P5PlnvNQ== + dependencies: + "@types/express" "*" + "@types/jsonwebtoken" "*" + "@types/passport-strategy" "*" + +"@types/passport-local@^1.0.34": + version "1.0.34" + resolved "https://registry.yarnpkg.com/@types/passport-local/-/passport-local-1.0.34.tgz#84d3b35b2fd4d36295039ded17fe5f3eaa62f4f6" + integrity sha512-PSc07UdYx+jhadySxxIYWuv6sAnY5e+gesn/5lkPKfBeGuIYn9OPR+AAEDq73VRUh6NBTpvE/iPE62rzZUslog== + dependencies: + "@types/express" "*" + "@types/passport" "*" + "@types/passport-strategy" "*" + +"@types/passport-strategy@*": + version "0.2.35" + resolved "https://registry.yarnpkg.com/@types/passport-strategy/-/passport-strategy-0.2.35.tgz#e52f5212279ea73f02d9b06af67efe9cefce2d0c" + integrity sha512-o5D19Jy2XPFoX2rKApykY15et3Apgax00RRLf0RUotPDUsYrQa7x4howLYr9El2mlUApHmCMv5CZ1IXqKFQ2+g== + dependencies: + "@types/express" "*" + "@types/passport" "*" + +"@types/passport@*": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@types/passport/-/passport-1.0.9.tgz#b32fa8f7485dace77a9b58e82d0c92908f6e8387" + integrity sha512-9+ilzUhmZQR4JP49GdC2O4UdDE3POPLwpmaTC/iLkW7l0TZCXOo1zsTnnlXPq6rP1UsUZPfbAV4IUdiwiXyC7g== + dependencies: + "@types/express" "*" + +"@types/prettier@^2.1.5": + version "2.7.0" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.0.tgz#ea03e9f0376a4446f44797ca19d9c46c36e352dc" + integrity sha512-RI1L7N4JnW5gQw2spvL7Sllfuf1SaHdrZpCHiBlCXjIlufi1SMNnbu2teze3/QE67Fg2tBlH7W+mi4hVNk4p0A== + +"@types/qrcode@^1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@types/qrcode/-/qrcode-1.5.0.tgz#6a98fe9a9a7b2a9a3167b6dde17eff999eabe40b" + integrity sha512-x5ilHXRxUPIMfjtM+1vf/GPTRWZ81nqscursm5gMznJeK9M0YnZ1c3bEvRLQ0zSSgedLx1J6MGL231ObQGGhaA== + dependencies: + "@types/node" "*" + +"@types/qs@*": + version "6.9.6" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.6.tgz#df9c3c8b31a247ec315e6996566be3171df4b3b1" + integrity sha512-0/HnwIfW4ki2D8L8c9GVcG5I72s9jP5GSLVF0VIXDW00kmIpA6O33G7a8n59Tmh7Nz0WUC3rSb7PTY/sdW2JzA== + +"@types/range-parser@*": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c" + integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA== + +"@types/serve-static@*": + version "1.13.10" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.10.tgz#f5e0ce8797d2d7cc5ebeda48a52c96c4fa47a8d9" + integrity sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + +"@types/stack-utils@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" + integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== + +"@types/superagent@*": + version "4.1.15" + resolved "https://registry.yarnpkg.com/@types/superagent/-/superagent-4.1.15.tgz#63297de457eba5e2bc502a7609426c4cceab434a" + integrity sha512-mu/N4uvfDN2zVQQ5AYJI/g4qxn2bHB6521t1UuH09ShNWjebTqN0ZFuYK9uYjcgmI0dTQEs+Owi1EO6U0OkOZQ== + dependencies: + "@types/cookiejar" "*" + "@types/node" "*" + +"@types/supertest@^2.0.12": + version "2.0.12" + resolved "https://registry.yarnpkg.com/@types/supertest/-/supertest-2.0.12.tgz#ddb4a0568597c9aadff8dbec5b2e8fddbe8692fc" + integrity sha512-X3HPWTwXRerBZS7Mo1k6vMVR1Z6zmJcDVn5O/31whe0tnjE4te6ZJSJGq1RiqHPjzPdMTfjCFogDJmwng9xHaQ== + dependencies: + "@types/superagent" "*" + +"@types/webpack-node-externals@^2.5.3": + version "2.5.3" + resolved "https://registry.yarnpkg.com/@types/webpack-node-externals/-/webpack-node-externals-2.5.3.tgz#921783aadda1fe686db0a70e20e4b9548b5a3cef" + integrity sha512-A9JxaR8QXoYT95egET4AmCFuChyTlP8d18ZAnmSHuIMsFdS7QlCQQ8pmN/+FHgLIkm+ViE/VngltT5avLACY9A== + dependencies: + "@types/node" "*" + webpack "^5" + +"@types/webpack@^5.28.0": + version "5.28.0" + resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-5.28.0.tgz#78dde06212f038d77e54116cfe69e88ae9ed2c03" + integrity sha512-8cP0CzcxUiFuA9xGJkfeVpqmWTk9nx6CWwamRGCj95ph1SmlRRk9KlCZ6avhCbZd4L68LvYT6l1kpdEnQXrF8w== + dependencies: + "@types/node" "*" + tapable "^2.2.0" + webpack "^5" + +"@types/yargs-parser@*": + version "21.0.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" + integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== + +"@types/yargs@^17.0.8": + version "17.0.11" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.11.tgz#5e10ca33e219807c0eee0f08b5efcba9b6a42c06" + integrity sha512-aB4y9UDUXTSMxmM4MH+YnuR0g5Cph3FLQBoWoMB21DSvFVAxRVEHEMx3TLh+zUZYMCQtKiqazz0Q4Rre31f/OA== + dependencies: + "@types/yargs-parser" "*" + +"@typescript-eslint/eslint-plugin@^5.33.0": + version "5.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.34.0.tgz#d690f60e335596f38b01792e8f4b361d9bd0cb35" + integrity sha512-eRfPPcasO39iwjlUAMtjeueRGuIrW3TQ9WseIDl7i5UWuFbf83yYaU7YPs4j8+4CxUMIsj1k+4kV+E+G+6ypDQ== + dependencies: + "@typescript-eslint/scope-manager" "5.34.0" + "@typescript-eslint/type-utils" "5.34.0" + "@typescript-eslint/utils" "5.34.0" + debug "^4.3.4" + functional-red-black-tree "^1.0.1" + ignore "^5.2.0" + regexpp "^3.2.0" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/parser@^5.33.0": + version "5.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.34.0.tgz#ca710858ea85dbfd30c9b416a335dc49e82dbc07" + integrity sha512-SZ3NEnK4usd2CXkoV3jPa/vo1mWX1fqRyIVUQZR4As1vyp4fneknBNJj+OFtV8WAVgGf+rOHMSqQbs2Qn3nFZQ== + dependencies: + "@typescript-eslint/scope-manager" "5.34.0" + "@typescript-eslint/types" "5.34.0" + "@typescript-eslint/typescript-estree" "5.34.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@5.34.0": + version "5.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.34.0.tgz#14efd13dc57602937e25f188fd911f118781e527" + integrity sha512-HNvASMQlah5RsBW6L6c7IJ0vsm+8Sope/wu5sEAf7joJYWNb1LDbJipzmdhdUOnfrDFE6LR1j57x1EYVxrY4ow== + dependencies: + "@typescript-eslint/types" "5.34.0" + "@typescript-eslint/visitor-keys" "5.34.0" + +"@typescript-eslint/type-utils@5.34.0": + version "5.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.34.0.tgz#7a324ab9ddd102cd5e1beefc94eea6f3eb32d32d" + integrity sha512-Pxlno9bjsQ7hs1pdWRUv9aJijGYPYsHpwMeCQ/Inavhym3/XaKt1ZKAA8FIw4odTBfowBdZJDMxf2aavyMDkLg== + dependencies: + "@typescript-eslint/utils" "5.34.0" + debug "^4.3.4" + tsutils "^3.21.0" + +"@typescript-eslint/types@5.34.0": + version "5.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.34.0.tgz#217bf08049e9e7b86694d982e88a2c1566330c78" + integrity sha512-49fm3xbbUPuzBIOcy2CDpYWqy/X7VBkxVN+DC21e0zIm3+61Z0NZi6J9mqPmSW1BDVk9FIOvuCFyUPjXz93sjA== + +"@typescript-eslint/typescript-estree@5.34.0", "@typescript-eslint/typescript-estree@^5.33.0": + version "5.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.34.0.tgz#ba7b83f4bf8ccbabf074bbf1baca7a58de3ccb9a" + integrity sha512-mXHAqapJJDVzxauEkfJI96j3D10sd567LlqroyCeJaHnu42sDbjxotGb3XFtGPYKPD9IyLjhsoULML1oI3M86A== + dependencies: + "@typescript-eslint/types" "5.34.0" + "@typescript-eslint/visitor-keys" "5.34.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/utils@5.34.0": + version "5.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.34.0.tgz#0cae98f48d8f9e292e5caa9343611b6faf49e743" + integrity sha512-kWRYybU4Rn++7lm9yu8pbuydRyQsHRoBDIo11k7eqBWTldN4xUdVUMCsHBiE7aoEkFzrUEaZy3iH477vr4xHAQ== + dependencies: + "@types/json-schema" "^7.0.9" + "@typescript-eslint/scope-manager" "5.34.0" + "@typescript-eslint/types" "5.34.0" + "@typescript-eslint/typescript-estree" "5.34.0" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + +"@typescript-eslint/visitor-keys@5.34.0": + version "5.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.34.0.tgz#d0fb3e31033e82ddd5de048371ad39eb342b2d40" + integrity sha512-O1moYjOSrab0a2fUvFpsJe0QHtvTC+cR+ovYpgKrAVXzqQyc74mv76TgY6z+aEtjQE2vgZux3CQVtGryqdcOAw== + dependencies: + "@typescript-eslint/types" "5.34.0" + eslint-visitor-keys "^3.3.0" + +"@webassemblyjs/ast@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" + integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + +"@webassemblyjs/floating-point-hex-parser@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" + integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== + +"@webassemblyjs/helper-api-error@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" + integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== + +"@webassemblyjs/helper-buffer@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" + integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== + +"@webassemblyjs/helper-numbers@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" + integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" + integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== + +"@webassemblyjs/helper-wasm-section@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" + integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== + 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" + +"@webassemblyjs/ieee754@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" + integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" + integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" + integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== + +"@webassemblyjs/wasm-edit@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" + integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== + 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" + +"@webassemblyjs/wasm-gen@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" + integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== + 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" + +"@webassemblyjs/wasm-opt@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" + integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== + dependencies: + "@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@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" + integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== + 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" + +"@webassemblyjs/wast-printer@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" + integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webpack-cli/configtest@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.2.0.tgz#7b20ce1c12533912c3b217ea68262365fa29a6f5" + integrity sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg== + +"@webpack-cli/info@^1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.5.0.tgz#6c78c13c5874852d6e2dd17f08a41f3fe4c261b1" + integrity sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ== + dependencies: + envinfo "^7.7.3" + +"@webpack-cli/serve@^1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.7.0.tgz#e1993689ac42d2b16e9194376cfb6753f6254db1" + integrity sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q== + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + +abstract-logging@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/abstract-logging/-/abstract-logging-2.0.1.tgz#6b0c371df212db7129b57d2e7fcf282b8bf1c839" + integrity sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA== + +acorn-import-assertions@^1.7.6: + version "1.8.0" + resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" + integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn-walk@^8.1.1: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0: + version "8.8.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8" + integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== + +agent-base@6, agent-base@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +agentkeepalive@^4.1.3: + version "4.2.1" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.2.1.tgz#a7975cbb9f83b367f06c90cc51ff28fe7d499717" + integrity sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA== + dependencies: + debug "^4.1.0" + depd "^1.1.2" + humanize-ms "^1.2.1" + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv-formats@2.1.1, ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + +ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv-keywords@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" + integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== + dependencies: + fast-deep-equal "^3.1.3" + +ajv@8.11.0, ajv@^8.0.0, ajv@^8.10.0, ajv@^8.8.0: + version "8.11.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" + integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ajv@^6.10.0, ajv@^6.12.4, ajv@^6.12.5: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + 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" + +ansi-colors@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +ansi-escapes@^4.2.1: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== + +anymatch@^3.0.3, anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +app-root-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-3.0.0.tgz#210b6f43873227e18a4b810a032283311555d5ad" + integrity sha512-qMcx+Gy2UZynHjOHOIXPNvpf+9cjvk3cWrBBK7zg4gH9+clobJRb9NGzcT7mQTcV/6Gm/1WelUtqxVXnNlrwcw== + +"aproba@^1.0.3 || ^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" + integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== + +archy@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" + integrity sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw== + +are-we-there-yet@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz#372e0e7bd279d8e94c653aaa1f67200884bf3e1c" + integrity sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw== + dependencies: + delegates "^1.0.0" + readable-stream "^3.6.0" + +are-we-there-yet@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz#679df222b278c64f2cdba1175cdc00b0d96164bd" + integrity sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg== + dependencies: + delegates "^1.0.0" + readable-stream "^3.6.0" + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +argon2@^0.28.7: + version "0.28.7" + resolved "https://registry.yarnpkg.com/argon2/-/argon2-0.28.7.tgz#f6cc1f1c9e3ef5455d2186d4ec5b27cfeda41591" + integrity sha512-pvsScM3Fq7b+jolXkZHh8nRQx0uD/WeelnwYPMRpn4pAydoa1gqeL/KRdWAag4Hnu1TJNBTAfqyTjV+ZHwNnYA== + dependencies: + "@mapbox/node-pre-gyp" "^1.0.9" + "@phc/format" "^1.0.0" + node-addon-api "^5.0.0" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +asap@^2.0.0: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +atomic-sleep@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b" + integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ== + +avvio@^8.1.3: + version "8.2.0" + resolved "https://registry.yarnpkg.com/avvio/-/avvio-8.2.0.tgz#aff28b0266617bf07ffc1c2d5f4220c3663ce1c2" + integrity sha512-bbCQdg7bpEv6kGH41RO/3B2/GMMmJSo2iBK+X8AWN9mujtfUipMDfIjsgHCfpnKqoGEQrrmCDKSa5OQ19+fDmg== + dependencies: + archy "^1.0.0" + debug "^4.0.0" + fastq "^1.6.1" + +axios@^0.27.2: + version "0.27.2" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972" + integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ== + dependencies: + follow-redirects "^1.14.9" + form-data "^4.0.0" + +babel-jest@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-28.1.3.tgz#c1187258197c099072156a0a121c11ee1e3917d5" + integrity sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q== + dependencies: + "@jest/transform" "^28.1.3" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^28.1.3" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + +babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== + 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" + +babel-plugin-jest-hoist@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.1.3.tgz#1952c4d0ea50f2d6d794353762278d1d8cca3fbe" + integrity sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.1.14" + "@types/babel__traverse" "^7.0.6" + +babel-preset-current-node-syntax@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" + integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.8.3" + "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + +babel-preset-jest@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-28.1.3.tgz#5dfc20b99abed5db994406c2b9ab94c73aaa419d" + integrity sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A== + dependencies: + babel-plugin-jest-hoist "^28.1.3" + babel-preset-current-node-syntax "^1.0.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +bl@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browserslist@^4.14.5, browserslist@^4.20.2: + version "4.21.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.1.tgz#c9b9b0a54c7607e8dc3e01a0d311727188011a00" + integrity sha512-Nq8MFCSrnJXSc88yliwlzQe3qNe3VntIjhsArW9IJOEPSHNx23FalwApUVbzAWABLhYJJ7y8AynWI/XM8OdfjQ== + dependencies: + caniuse-lite "^1.0.30001359" + electron-to-chromium "^1.4.172" + node-releases "^2.0.5" + update-browserslist-db "^1.0.4" + +bs-logger@0.x: + version "0.2.6" + resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" + integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== + dependencies: + fast-json-stable-stringify "2.x" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +buffer-equal-constant-time@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" + integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + +cacache@^15.2.0: + version "15.3.0" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb" + integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ== + 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" + +call-bind@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^5.0.0, camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-lite@^1.0.30001359: + version "1.0.30001363" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001363.tgz#26bec2d606924ba318235944e1193304ea7c4f15" + integrity sha512-HpQhpzTGGPVMnCjIomjt+jvyUu8vNFo3TaDiZ/RcoTrlOq/5+tC8zHdsbgFB6MxmaY+jCpsH09aD80Bb4Ow3Sg== + +chalk@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^2.0.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +chokidar@3.5.3, chokidar@^3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + 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" + optionalDependencies: + fsevents "~2.3.2" + +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + +chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + +ci-info@^3.2.0: + version "3.3.2" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.2.tgz#6d2967ffa407466481c6c90b6e16b3098f080128" + integrity sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg== + +cjs-module-lexer@^1.0.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" + integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== + +class-transformer@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/class-transformer/-/class-transformer-0.5.1.tgz#24147d5dffd2a6cea930a3250a677addf96ab336" + integrity sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw== + +class-validator@^0.13.2: + version "0.13.2" + resolved "https://registry.yarnpkg.com/class-validator/-/class-validator-0.13.2.tgz#64b031e9f3f81a1e1dcd04a5d604734608b24143" + integrity sha512-yBUcQy07FPlGzUjoLuUfIOXzgynnQPPruyK1Ge2B74k9ROwnle1E+NxLWnUv5OLU8hA/qL5leAE9XnXq3byaBw== + dependencies: + libphonenumber-js "^1.9.43" + validator "^13.7.0" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-highlight@^2.1.11: + version "2.1.11" + resolved "https://registry.yarnpkg.com/cli-highlight/-/cli-highlight-2.1.11.tgz#49736fa452f0aaf4fae580e30acb26828d2dc1bf" + integrity sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg== + dependencies: + chalk "^4.0.0" + highlight.js "^10.7.1" + mz "^2.4.0" + parse5 "^5.1.1" + parse5-htmlparser2-tree-adapter "^6.0.0" + yargs "^16.0.0" + +cli-spinners@^2.5.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d" + integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g== + +cli-table3@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.2.tgz#aaf5df9d8b5bf12634dc8b3040806a0c07120d2a" + integrity sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw== + dependencies: + string-width "^4.2.0" + optionalDependencies: + "@colors/colors" "1.5.0" + +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== + +cliui@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^6.2.0" + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== + +collect-v8-coverage@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" + integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-support@^1.1.2, color-support@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== + +colorette@^2.0.14: + version "2.0.19" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" + integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +component-emitter@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +consola@^2.15.0: + version "2.15.3" + resolved "https://registry.yarnpkg.com/consola/-/consola-2.15.3.tgz#2e11f98d6a4be71ff72e0bdf07bd23e12cb61550" + integrity sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw== + +console-control-strings@^1.0.0, console-control-strings@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== + +content-disposition@^0.5.3: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" + integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== + dependencies: + safe-buffer "~5.1.1" + +cookie@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + +cookiejar@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.3.tgz#fc7a6216e408e74414b90230050842dacda75acc" + integrity sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ== + +copy-webpack-plugin@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz#96d4dbdb5f73d02dd72d0528d1958721ab72e04a" + integrity sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ== + dependencies: + fast-glob "^3.2.11" + glob-parent "^6.0.1" + globby "^13.1.1" + normalize-path "^3.0.0" + schema-utils "^4.0.0" + serialize-javascript "^6.0.0" + +cosmiconfig@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" + integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== + 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" + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +date-fns@^2.28.0: + version "2.29.1" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.29.1.tgz#9667c2615525e552b5135a3116b95b1961456e60" + integrity sha512-dlLD5rKaKxpFdnjrs+5azHDFOPEu4ANy/LTh04A1DTzMM7qoajmKCBc8pkKRFT41CNzw+4gQh79X5C+Jq27HAw== + +debug@2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== + +dedent@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +deepmerge@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" + integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + +defaults@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + integrity sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA== + dependencies: + clone "^1.0.2" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +depd@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +detect-libc@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.1.tgz#e1897aa88fa6ad197862937fbc0441ef352ee0cd" + integrity sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w== + +detect-newline@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + +dezalgo@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456" + integrity sha512-K7i4zNfT2kgQz3GylDw40ot9GAE47sFZ9EXHFSPP6zONLgH6kWXE0KWJchkbQJLBkRazq4APwZ4OwiFFlT95OQ== + dependencies: + asap "^2.0.0" + wrappy "1" + +diff-sequences@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-28.1.1.tgz#9989dc731266dc2903457a70e996f3a041913ac6" + integrity sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw== + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +dijkstrajs@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/dijkstrajs/-/dijkstrajs-1.0.2.tgz#2e48c0d3b825462afe75ab4ad5e829c8ece36257" + integrity sha512-QV6PMaHTCNmKSeP6QoXhVTw9snc9VD8MulTT0Bd99Pacp4SS1cjcrYPgBPmibqKVtMJJfqC6XvOXgPMEEPH/fg== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dotenv@^16.0.0: + version "16.0.1" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.1.tgz#8f8f9d94876c35dac989876a5d3a82a267fdce1d" + integrity sha512-1K6hR6wtk2FviQ4kEiSjFiH5rpzEVi8WW0x96aztHVMhEspNpc4DVOUTEHtEva5VThQ8IaBX1Pe4gSzpVVUsKQ== + +ecdsa-sig-formatter@1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" + integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== + dependencies: + safe-buffer "^5.0.1" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +electron-to-chromium@^1.4.172: + version "1.4.184" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.184.tgz#381d4d111fc82d3376ed690dfb621e675f9078a9" + integrity sha512-IADi390FRdvxWfVX3hjzfTDNVHiTqVo9ar53/7em/SfhUG9YcjVhyQecY/XwmBHRKden/wFud7RWOUH7+7LFng== + +emittery@^0.10.2: + version "0.10.2" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.10.2.tgz#902eec8aedb8c41938c46e9385e9db7e03182933" + integrity sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +encode-utf8@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/encode-utf8/-/encode-utf8-1.0.3.tgz#f30fdd31da07fb596f281beb2f6b027851994cda" + integrity sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +encoding@^0.1.12: + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + dependencies: + iconv-lite "^0.6.2" + +end-of-stream@^1.1.0, end-of-stream@^1.4.4: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enhanced-resolve@^5.0.0, enhanced-resolve@^5.10.0, enhanced-resolve@^5.7.0, enhanced-resolve@^5.9.3: + version "5.10.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz#0dc579c3bb2a1032e357ac45b8f3a6f3ad4fb1e6" + integrity sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +env-paths@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + +envinfo@^7.7.3: + version "7.8.1" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" + integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== + +err-code@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" + integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-module-lexer@^0.9.0: + version "0.9.3" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" + integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-config-prettier@^8.5.0: + version "8.5.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz#5a81680ec934beca02c7b1a61cf8ca34b66feab1" + integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== + +eslint-plugin-no-relative-import-paths@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-no-relative-import-paths/-/eslint-plugin-no-relative-import-paths-1.4.0.tgz#59489ebc19688d1398bfe53d3ad320b3ed42ca17" + integrity sha512-J/ok26KqJM+20VsxNEcHc9kyW0dcFHBlihOO5FFv/GQqwcW+G1UngbHLpnPAdOQ1dJg5Ljk/40csqfZ3mnneUw== + +eslint-plugin-prettier@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz#651cbb88b1dab98bfd42f017a12fa6b2d993f94b" + integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ== + dependencies: + prettier-linter-helpers "^1.0.0" + +eslint-scope@5.1.1, eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-scope@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" + integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== + dependencies: + eslint-visitor-keys "^2.0.0" + +eslint-visitor-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint-visitor-keys@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" + integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== + +eslint@^8.21.0: + version "8.22.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.22.0.tgz#78fcb044196dfa7eef30a9d65944f6f980402c48" + integrity sha512-ci4t0sz6vSRKdmkOGmprBo6fmI4PrphDFMy5JEq/fNS0gQkJM3rLmrqcp8ipMcdobH3KtUP40KniAE9W19S4wA== + dependencies: + "@eslint/eslintrc" "^1.3.0" + "@humanwhocodes/config-array" "^0.10.4" + "@humanwhocodes/gitignore-to-minimatch" "^1.0.2" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.1.1" + eslint-utils "^3.0.0" + eslint-visitor-keys "^3.3.0" + espree "^9.3.3" + esquery "^1.4.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + functional-red-black-tree "^1.0.1" + glob-parent "^6.0.1" + globals "^13.15.0" + globby "^11.1.0" + grapheme-splitter "^1.0.4" + ignore "^5.2.0" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.1" + regexpp "^3.2.0" + strip-ansi "^6.0.1" + strip-json-comments "^3.1.0" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^9.3.2, espree@^9.3.3: + version "9.3.3" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.3.tgz#2dd37c4162bb05f433ad3c1a52ddf8a49dc08e9d" + integrity sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng== + dependencies: + acorn "^8.8.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.3.0" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +event-target-shim@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + +events@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +execa@^4.0.2: + version "4.1.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" + integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + 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" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== + +expect@^28.0.0, expect@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/expect/-/expect-28.1.3.tgz#90a7c1a124f1824133dd4533cce2d2bdcb6603ec" + integrity sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g== + dependencies: + "@jest/expect-utils" "^28.1.3" + jest-get-type "^28.0.2" + jest-matcher-utils "^28.1.3" + jest-message-util "^28.1.3" + jest-util "^28.1.3" + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-diff@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" + integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== + +fast-glob@^3.2.11, fast-glob@^3.2.9: + version "3.2.11" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" + integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== + 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" + +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-json-stringify@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stringify/-/fast-json-stringify-5.1.0.tgz#dc184049d7eed4f61e34f65e97c0763fd043977f" + integrity sha512-IybGfbUc1DQgyrp9Myhwlr1Z5vjV37mBkdgcbuvsvUxv5fayG+cHlTQQpXH9nMwUPgp+5Y3RT7QDgx5zJ9NS3A== + dependencies: + "@fastify/deepmerge" "^1.0.0" + ajv "^8.10.0" + ajv-formats "^2.1.1" + fast-uri "^2.1.0" + rfdc "^1.2.0" + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fast-redact@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-3.1.2.tgz#d58e69e9084ce9fa4c1a6fa98a3e1ecf5d7839aa" + integrity sha512-+0em+Iya9fKGfEQGcd62Yv6onjBmmhV1uh86XVfOU8VwAe6kaFdQCWI9s0/Nnugx5Vd9tdbZ7e6gE2tR9dzXdw== + +fast-safe-stringify@2.1.1, fast-safe-stringify@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" + integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== + +fast-uri@^2.0.0, fast-uri@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-2.1.0.tgz#9279432d6b53675c90116b947ed2bbba582d6fb5" + integrity sha512-qKRta6N7BWEFVlyonVY/V+BMLgFqktCUV0QjT259ekAIlbVrMaFnFLxJ4s/JPl4tou56S1BzPufI60bLe29fHA== + +fastest-levenshtein@^1.0.12: + version "1.0.16" + resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" + integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== + +fastify-plugin@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/fastify-plugin/-/fastify-plugin-3.0.1.tgz#79e84c29f401020f38b524f59f2402103fd21ed2" + integrity sha512-qKcDXmuZadJqdTm6vlCqioEbyewF60b/0LOFCcYN1B6BIZGlYJumWWOYs70SFYLDAH4YqdE1cxH/RKMG7rFxgA== + +fastify-plugin@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/fastify-plugin/-/fastify-plugin-4.1.0.tgz#d22972e16e46f7af0957e5123748abfd8c030854" + integrity sha512-Mf6lkbxHtFgI4sVaC0P/7sqlBvdpoyEUaOCD0cyKpqxjsdN+3EdD/FfSHByb7uXqxYu/DilH9Lb6mTCumN9TQQ== + +fastify@4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/fastify/-/fastify-4.4.0.tgz#0543aa039c70d49df4ddcca796679f305f10d2ae" + integrity sha512-ePI4g9vPJXIBF4YlVcDSLxjvtdTrlM8QzdgYAPFGdCH+rot+4MXoFFAUb10fGrIcRRjaq6CvcbIzxiWQzMMHkw== + dependencies: + "@fastify/ajv-compiler" "^3.1.1" + "@fastify/error" "^3.0.0" + "@fastify/fast-json-stringify-compiler" "^4.0.0" + abstract-logging "^2.0.1" + avvio "^8.1.3" + find-my-way "^7.0.0" + light-my-request "^5.0.0" + pino "^8.0.0" + process-warning "^2.0.0" + proxy-addr "^2.0.7" + rfdc "^1.3.0" + secure-json-parse "^2.4.0" + semver "^7.3.7" + tiny-lru "^8.0.2" + +fastq@^1.6.0, fastq@^1.6.1: + version "1.13.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + dependencies: + reusify "^1.0.4" + +fb-watchman@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" + integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== + dependencies: + bser "2.1.1" + +figures@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-my-way@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/find-my-way/-/find-my-way-7.0.1.tgz#079d6a8b474754e073c75778da678f59dedd620f" + integrity sha512-w05SaOPg54KqBof/RDA+75n1R48V7ZZNPL3nR17jJJs5dgZpR3ivfrMWOyx7BVFQgCLhYRG05hfgFCohYvSUXA== + dependencies: + fast-deep-equal "^3.1.3" + safe-regex2 "^2.0.0" + +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatted@^3.1.0: + version "3.2.7" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" + integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== + +follow-redirects@^1.14.9: + version "1.15.1" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5" + integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA== + +fork-ts-checker-webpack-plugin@7.2.11: + version "7.2.11" + resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-7.2.11.tgz#aff3febbc11544ba3ad0ae4d5aa4055bd15cd26d" + integrity sha512-2e5+NyTUTE1Xq4fWo7KFEQblCaIvvINQwUX3jRmEGlgCTc1Ecqw/975EfQrQ0GEraxJTnp8KB9d/c8hlCHUMJA== + dependencies: + "@babel/code-frame" "^7.16.7" + chalk "^4.1.2" + chokidar "^3.5.3" + cosmiconfig "^7.0.1" + deepmerge "^4.2.2" + fs-extra "^10.0.0" + memfs "^3.4.1" + minimatch "^3.0.4" + schema-utils "^3.1.1" + semver "^7.3.5" + tapable "^2.2.1" + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +formidable@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/formidable/-/formidable-2.0.1.tgz#4310bc7965d185536f9565184dee74fbb75557ff" + integrity sha512-rjTMNbp2BpfQShhFbR3Ruk3qk2y9jKpvMW78nJgx8QKtxjDVrwbZG+wvDOmVbifHyOUOQJXxqEy6r0faRrPzTQ== + dependencies: + dezalgo "1.0.3" + hexoid "1.0.0" + once "1.4.0" + qs "6.9.3" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +fs-extra@10.1.0, fs-extra@^10.0.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + +fs-monkey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" + integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@^2.3.2, fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== + +gauge@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-3.0.2.tgz#03bf4441c044383908bcfa0656ad91803259b395" + integrity sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q== + dependencies: + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.2" + console-control-strings "^1.0.0" + has-unicode "^2.0.1" + object-assign "^4.1.1" + signal-exit "^3.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.2" + +gauge@^4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce" + integrity sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg== + 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" + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.1, get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.0.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.2.tgz#336975123e05ad0b7ba41f152ee4aadbea6cf598" + integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.3" + +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +get-stream@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@^7.0.0, glob@^7.1.3, glob@^7.1.4, glob@^7.2.0: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + 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" + +glob@^8.0.1: + version "8.0.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.0.3.tgz#415c6eb2deed9e502c68fa44a272e6da6eeca42e" + integrity sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^13.15.0: + version "13.17.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.17.0.tgz#902eb1e680a41da93945adbdcb5a9f361ba69bd4" + integrity sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw== + dependencies: + type-fest "^0.20.2" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +globby@^13.1.1: + version "13.1.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-13.1.2.tgz#29047105582427ab6eca4f905200667b056da515" + integrity sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ== + dependencies: + dir-glob "^3.0.1" + fast-glob "^3.2.11" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^4.0.0" + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: + version "4.2.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + +grapheme-splitter@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" + integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-unicode@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hexoid@1.0.0, hexoid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hexoid/-/hexoid-1.0.0.tgz#ad10c6573fb907de23d9ec63a711267d9dc9bc18" + integrity sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g== + +highlight.js@^10.7.1: + version "10.7.3" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" + integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +http-cache-semantics@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" + integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +http-proxy-agent@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== + dependencies: + "@tootallnate/once" "1" + agent-base "6" + debug "4" + +https-proxy-agent@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + +human-signals@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" + integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +humanize-ms@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" + integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== + dependencies: + ms "^2.0.0" + +iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@^0.6.2: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +ieee754@^1.1.13, ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" + integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== + +import-fresh@^3.0.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-local@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +infer-owner@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.1, inherits@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== + +inherits@2.0.4, inherits@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inquirer@7.3.3: + version "7.3.3" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" + integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.19" + mute-stream "0.0.8" + run-async "^2.4.0" + rxjs "^6.6.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + +inquirer@8.2.4: + version "8.2.4" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.4.tgz#ddbfe86ca2f67649a67daa6f1051c128f684f0b4" + integrity sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg== + 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" + +interpret@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== + +interpret@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" + integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== + +ip@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" + integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-core-module@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" + integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== + dependencies: + has "^1.0.3" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + +is-lambda@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" + integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" + integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== + +istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz#31d18bdd127f825dd02ea7bfdfd906f8ab840e9f" + integrity sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A== + 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" + +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.1.3: + version "3.1.5" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" + integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +iterare@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/iterare/-/iterare-1.2.1.tgz#139c400ff7363690e33abffa33cbba8920f00042" + integrity sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q== + +jest-changed-files@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-28.1.3.tgz#d9aeee6792be3686c47cb988a8eaf82ff4238831" + integrity sha512-esaOfUWJXk2nfZt9SPyC8gA1kNfdKLkQWyzsMlqq8msYSlNKfmZxfRgZn4Cd4MGVUF+7v6dBs0d5TOAKa7iIiA== + dependencies: + execa "^5.0.0" + p-limit "^3.1.0" + +jest-circus@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-28.1.3.tgz#d14bd11cf8ee1a03d69902dc47b6bd4634ee00e4" + integrity sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow== + dependencies: + "@jest/environment" "^28.1.3" + "@jest/expect" "^28.1.3" + "@jest/test-result" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^0.7.0" + is-generator-fn "^2.0.0" + jest-each "^28.1.3" + jest-matcher-utils "^28.1.3" + jest-message-util "^28.1.3" + jest-runtime "^28.1.3" + jest-snapshot "^28.1.3" + jest-util "^28.1.3" + p-limit "^3.1.0" + pretty-format "^28.1.3" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-cli@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-28.1.3.tgz#558b33c577d06de55087b8448d373b9f654e46b2" + integrity sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ== + dependencies: + "@jest/core" "^28.1.3" + "@jest/test-result" "^28.1.3" + "@jest/types" "^28.1.3" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + import-local "^3.0.2" + jest-config "^28.1.3" + jest-util "^28.1.3" + jest-validate "^28.1.3" + prompts "^2.0.1" + yargs "^17.3.1" + +jest-config@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-28.1.3.tgz#e315e1f73df3cac31447eed8b8740a477392ec60" + integrity sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ== + dependencies: + "@babel/core" "^7.11.6" + "@jest/test-sequencer" "^28.1.3" + "@jest/types" "^28.1.3" + babel-jest "^28.1.3" + chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-circus "^28.1.3" + jest-environment-node "^28.1.3" + jest-get-type "^28.0.2" + jest-regex-util "^28.0.2" + jest-resolve "^28.1.3" + jest-runner "^28.1.3" + jest-util "^28.1.3" + jest-validate "^28.1.3" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^28.1.3" + slash "^3.0.0" + strip-json-comments "^3.1.1" + +jest-diff@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-28.1.3.tgz#948a192d86f4e7a64c5264ad4da4877133d8792f" + integrity sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw== + dependencies: + chalk "^4.0.0" + diff-sequences "^28.1.1" + jest-get-type "^28.0.2" + pretty-format "^28.1.3" + +jest-docblock@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-28.1.1.tgz#6f515c3bf841516d82ecd57a62eed9204c2f42a8" + integrity sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA== + dependencies: + detect-newline "^3.0.0" + +jest-each@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-28.1.3.tgz#bdd1516edbe2b1f3569cfdad9acd543040028f81" + integrity sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g== + dependencies: + "@jest/types" "^28.1.3" + chalk "^4.0.0" + jest-get-type "^28.0.2" + jest-util "^28.1.3" + pretty-format "^28.1.3" + +jest-environment-node@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-28.1.3.tgz#7e74fe40eb645b9d56c0c4b70ca4357faa349be5" + integrity sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A== + dependencies: + "@jest/environment" "^28.1.3" + "@jest/fake-timers" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/node" "*" + jest-mock "^28.1.3" + jest-util "^28.1.3" + +jest-get-type@^28.0.2: + version "28.0.2" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-28.0.2.tgz#34622e628e4fdcd793d46db8a242227901fcf203" + integrity sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA== + +jest-haste-map@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-28.1.3.tgz#abd5451129a38d9841049644f34b034308944e2b" + integrity sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA== + dependencies: + "@jest/types" "^28.1.3" + "@types/graceful-fs" "^4.1.3" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^28.0.2" + jest-util "^28.1.3" + jest-worker "^28.1.3" + micromatch "^4.0.4" + walker "^1.0.8" + optionalDependencies: + fsevents "^2.3.2" + +jest-leak-detector@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-28.1.3.tgz#a6685d9b074be99e3adee816ce84fd30795e654d" + integrity sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA== + dependencies: + jest-get-type "^28.0.2" + pretty-format "^28.1.3" + +jest-matcher-utils@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz#5a77f1c129dd5ba3b4d7fc20728806c78893146e" + integrity sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw== + dependencies: + chalk "^4.0.0" + jest-diff "^28.1.3" + jest-get-type "^28.0.2" + pretty-format "^28.1.3" + +jest-message-util@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-28.1.3.tgz#232def7f2e333f1eecc90649b5b94b0055e7c43d" + integrity sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^28.1.3" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^28.1.3" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-mock@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-28.1.3.tgz#d4e9b1fc838bea595c77ab73672ebf513ab249da" + integrity sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA== + dependencies: + "@jest/types" "^28.1.3" + "@types/node" "*" + +jest-pnp-resolver@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" + integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== + +jest-regex-util@^28.0.2: + version "28.0.2" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-28.0.2.tgz#afdc377a3b25fb6e80825adcf76c854e5bf47ead" + integrity sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw== + +jest-resolve-dependencies@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.3.tgz#8c65d7583460df7275c6ea2791901fa975c1fe66" + integrity sha512-qa0QO2Q0XzQoNPouMbCc7Bvtsem8eQgVPNkwn9LnS+R2n8DaVDPL/U1gngC0LTl1RYXJU0uJa2BMC2DbTfFrHA== + dependencies: + jest-regex-util "^28.0.2" + jest-snapshot "^28.1.3" + +jest-resolve@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-28.1.3.tgz#cfb36100341ddbb061ec781426b3c31eb51aa0a8" + integrity sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ== + dependencies: + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^28.1.3" + jest-pnp-resolver "^1.2.2" + jest-util "^28.1.3" + jest-validate "^28.1.3" + resolve "^1.20.0" + resolve.exports "^1.1.0" + slash "^3.0.0" + +jest-runner@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-28.1.3.tgz#5eee25febd730b4713a2cdfd76bdd5557840f9a1" + integrity sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA== + dependencies: + "@jest/console" "^28.1.3" + "@jest/environment" "^28.1.3" + "@jest/test-result" "^28.1.3" + "@jest/transform" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.10.2" + graceful-fs "^4.2.9" + jest-docblock "^28.1.1" + jest-environment-node "^28.1.3" + jest-haste-map "^28.1.3" + jest-leak-detector "^28.1.3" + jest-message-util "^28.1.3" + jest-resolve "^28.1.3" + jest-runtime "^28.1.3" + jest-util "^28.1.3" + jest-watcher "^28.1.3" + jest-worker "^28.1.3" + p-limit "^3.1.0" + source-map-support "0.5.13" + +jest-runtime@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-28.1.3.tgz#a57643458235aa53e8ec7821949e728960d0605f" + integrity sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw== + dependencies: + "@jest/environment" "^28.1.3" + "@jest/fake-timers" "^28.1.3" + "@jest/globals" "^28.1.3" + "@jest/source-map" "^28.1.2" + "@jest/test-result" "^28.1.3" + "@jest/transform" "^28.1.3" + "@jest/types" "^28.1.3" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + execa "^5.0.0" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^28.1.3" + jest-message-util "^28.1.3" + jest-mock "^28.1.3" + jest-regex-util "^28.0.2" + jest-resolve "^28.1.3" + jest-snapshot "^28.1.3" + jest-util "^28.1.3" + slash "^3.0.0" + strip-bom "^4.0.0" + +jest-snapshot@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-28.1.3.tgz#17467b3ab8ddb81e2f605db05583d69388fc0668" + integrity sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg== + dependencies: + "@babel/core" "^7.11.6" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/traverse" "^7.7.2" + "@babel/types" "^7.3.3" + "@jest/expect-utils" "^28.1.3" + "@jest/transform" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/babel__traverse" "^7.0.6" + "@types/prettier" "^2.1.5" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^28.1.3" + graceful-fs "^4.2.9" + jest-diff "^28.1.3" + jest-get-type "^28.0.2" + jest-haste-map "^28.1.3" + jest-matcher-utils "^28.1.3" + jest-message-util "^28.1.3" + jest-util "^28.1.3" + natural-compare "^1.4.0" + pretty-format "^28.1.3" + semver "^7.3.5" + +jest-util@^28.0.0, jest-util@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-28.1.3.tgz#f4f932aa0074f0679943220ff9cbba7e497028b0" + integrity sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ== + dependencies: + "@jest/types" "^28.1.3" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-validate@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-28.1.3.tgz#e322267fd5e7c64cea4629612c357bbda96229df" + integrity sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA== + dependencies: + "@jest/types" "^28.1.3" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^28.0.2" + leven "^3.1.0" + pretty-format "^28.1.3" + +jest-watcher@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-28.1.3.tgz#c6023a59ba2255e3b4c57179fc94164b3e73abd4" + integrity sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g== + dependencies: + "@jest/test-result" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.10.2" + jest-util "^28.1.3" + string-length "^4.0.1" + +jest-worker@^27.4.5: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest-worker@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-28.1.3.tgz#7e3c4ce3fa23d1bb6accb169e7f396f98ed4bb98" + integrity sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest/-/jest-28.1.3.tgz#e9c6a7eecdebe3548ca2b18894a50f45b36dfc6b" + integrity sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA== + dependencies: + "@jest/core" "^28.1.3" + "@jest/types" "^28.1.3" + import-local "^3.0.2" + jest-cli "^28.1.3" + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +json5@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" + integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== + +jsonc-parser@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.0.0.tgz#abdd785701c7e7eaca8a9ec8cf070ca51a745a22" + integrity sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA== + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonwebtoken@8.5.1, jsonwebtoken@^8.2.0, jsonwebtoken@^8.5.1: + version "8.5.1" + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d" + integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w== + dependencies: + jws "^3.2.2" + lodash.includes "^4.3.0" + lodash.isboolean "^3.0.3" + lodash.isinteger "^4.0.4" + lodash.isnumber "^3.0.3" + lodash.isplainobject "^4.0.6" + lodash.isstring "^4.0.1" + lodash.once "^4.0.0" + ms "^2.1.1" + semver "^5.6.0" + +jwa@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" + integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== + dependencies: + buffer-equal-constant-time "1.0.1" + ecdsa-sig-formatter "1.0.11" + safe-buffer "^5.0.1" + +jws@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" + integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== + dependencies: + jwa "^1.4.1" + safe-buffer "^5.0.1" + +kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +libphonenumber-js@^1.9.43: + version "1.10.13" + resolved "https://registry.yarnpkg.com/libphonenumber-js/-/libphonenumber-js-1.10.13.tgz#0b5833c7fdbf671140530d83531c6753f7e0ea3c" + integrity sha512-b74iyWmwb4GprAUPjPkJ11GTC7KX4Pd3onpJfKxYyY8y9Rbb4ERY47LvCMEDM09WD3thiLDMXtkfDK/AX+zT7Q== + +light-my-request@5.4.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/light-my-request/-/light-my-request-5.4.0.tgz#bcd483a9157592b16101cb2042275ca89b79aec1" + integrity sha512-lWwUibGSDifLsCGKVy5mCktifWGYiZUCzuKqXgrb3Na7wHPl8aPShxjDhUGQE3MI8k2wJSuvSJh5lyHkMnOTMg== + dependencies: + cookie "^0.5.0" + process-warning "^2.0.0" + set-cookie-parser "^2.4.1" + +light-my-request@^5.0.0: + version "5.5.1" + resolved "https://registry.yarnpkg.com/light-my-request/-/light-my-request-5.5.1.tgz#566d90928b9b960d44b6b2b74e072eec1f7015e4" + integrity sha512-Zd4oZjF7axSyc5rYQsbB0qsgY4LFFviZSbEywxf7Vi5UE3y3c7tYF/GeheQjBNYY+pQ55BF8UGGJTjneoxOS1w== + dependencies: + cookie "^0.5.0" + process-warning "^2.0.0" + set-cookie-parser "^2.4.1" + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +loader-runner@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.includes@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" + integrity sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w== + +lodash.isboolean@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" + integrity sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg== + +lodash.isinteger@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" + integrity sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA== + +lodash.isnumber@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" + integrity sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw== + +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== + +lodash.isstring@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" + integrity sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw== + +lodash.memoize@4.x: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.once@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" + integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== + +lodash@^4.17.19, lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +macos-release@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.5.0.tgz#067c2c88b5f3fb3c56a375b2ec93826220fa1ff2" + integrity sha512-EIgv+QZ9r+814gjJj0Bt5vSLJLzswGmSUbUpbi9AIr/fsN2IWFBl2NucV9PAiek+U1STK468tEkxmVYUtuAN3g== + +magic-string@0.26.1: + version "0.26.1" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.26.1.tgz#ba9b651354fa9512474199acecf9c6dbe93f97fd" + integrity sha512-ndThHmvgtieXe8J/VGPjG+Apu7v7ItcD5mhEIvOscWjPF/ccOiLxHaSuCAS2G+3x4GKsAbT8u7zdyamupui8Tg== + dependencies: + sourcemap-codec "^1.4.8" + +make-dir@^3.0.0, make-dir@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +make-error@1.x, make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +make-fetch-happen@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz#53085a09e7971433e6765f7971bf63f4e05cb968" + integrity sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg== + 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" + +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== + dependencies: + tmpl "1.0.5" + +memfs@^3.4.1: + version "3.4.7" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.4.7.tgz#e5252ad2242a724f938cb937e3c4f7ceb1f70e5a" + integrity sha512-ygaiUSNalBX85388uskeCyhSAoOSgzBbtVCr9jA2RROssFL9Q19/ZXFqS+2Th2sr1ewNIWgFdLzLC3Yl1Zv+lw== + dependencies: + fs-monkey "^1.0.3" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +methods@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +micromatch@^4.0.0, micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12, mime-types@^2.1.27: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.0.tgz#1717b464f4971b144f6aabe8f2d0b8e4511e09c7" + integrity sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.0, minimist@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" + integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== + +minipass-collect@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" + integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== + dependencies: + minipass "^3.0.0" + +minipass-fetch@^1.3.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-1.4.1.tgz#d75e0091daac1b0ffd7e9d41629faff7d0c1f1b6" + integrity sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw== + dependencies: + minipass "^3.1.0" + minipass-sized "^1.0.3" + minizlib "^2.0.0" + optionalDependencies: + encoding "^0.1.12" + +minipass-flush@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" + integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== + dependencies: + minipass "^3.0.0" + +minipass-pipeline@^1.2.2, minipass-pipeline@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" + integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== + dependencies: + minipass "^3.0.0" + +minipass-sized@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70" + integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== + dependencies: + minipass "^3.0.0" + +minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3: + version "3.3.4" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.4.tgz#ca99f95dd77c43c7a76bf51e6d200025eee0ffae" + integrity sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw== + dependencies: + yallist "^4.0.0" + +minizlib@^2.0.0, minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +mkdirp@^1.0.3, mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +mnemonist@0.39.2: + version "0.39.2" + resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.39.2.tgz#7e6a0bd5c7199460ee12a651103c7007adc6225a" + integrity sha512-n3ZCEosuMH03DVivZ9N0fcXPWiZrBLEdfSlEJ+S/mJxmk3zuo1ur0dj9URDczFyP1VS3wfiyKzqLLDXoPJ6rPA== + dependencies: + obliterator "^2.0.1" + +ms@2.0.0, ms@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3, ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +mz@^2.4.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +negotiator@^0.6.2: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +node-addon-api@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.3.0.tgz#52a1a0b475193e0928e98e0426a0d1254782b77f" + integrity sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ== + +node-addon-api@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-5.0.0.tgz#7d7e6f9ef89043befdb20c1989c905ebde18c501" + integrity sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA== + +node-emoji@1.11.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.11.0.tgz#69a0150e6946e2f115e9d7ea4df7971e2628301c" + integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A== + dependencies: + lodash "^4.17.21" + +node-fetch@^2.6.1, node-fetch@^2.6.7: + version "2.6.7" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" + +node-gyp@8.x: + version "8.4.1" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-8.4.1.tgz#3d49308fc31f768180957d6b5746845fbd429937" + integrity sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w== + 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" + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== + +node-releases@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.5.tgz#280ed5bc3eba0d96ce44897d8aee478bfb3d9666" + integrity sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q== + +nodemailer@^6.7.8: + version "6.7.8" + resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-6.7.8.tgz#9f1af9911314960c0b889079e1754e8d9e3f740a" + integrity sha512-2zaTFGqZixVmTxpJRCFC+Vk5eGRd/fYtvIR+dl5u9QXLTQWGIf48x/JXvo58g9sa0bU6To04XUv554Paykum3g== + +nopt@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" + integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== + dependencies: + abbrev "1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +notp@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/notp/-/notp-2.0.3.tgz#a9fd11e25cfe1ccb39fc6689544ee4c10ef9a577" + integrity sha512-oBig/2uqkjQ5AkBuw4QJYwkEWa/q+zHxI5/I5z6IeP2NT0alpJFsP/trrfCC+9xOAgQSZXssNi962kp5KBmypQ== + +npm-run-path@^4.0.0, npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +npmlog@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-5.0.1.tgz#f06678e80e29419ad67ab964e0fa69959c1eb8b0" + integrity sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw== + dependencies: + are-we-there-yet "^2.0.0" + console-control-strings "^1.1.0" + gauge "^3.0.0" + set-blocking "^2.0.0" + +npmlog@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830" + integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg== + dependencies: + are-we-there-yet "^3.0.0" + console-control-strings "^1.1.0" + gauge "^4.0.3" + set-blocking "^2.0.0" + +object-assign@^4.0.1, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-hash@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" + integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== + +object-inspect@^1.9.0: + version "1.12.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" + integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== + +obliterator@^2.0.1: + version "2.0.4" + resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-2.0.4.tgz#fa650e019b2d075d745e44f1effeb13a2adbe816" + integrity sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ== + +on-exit-leak-free@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/on-exit-leak-free/-/on-exit-leak-free-2.1.0.tgz#5c703c968f7e7f851885f6459bf8a8a57edc9cc4" + integrity sha512-VuCaZZAjReZ3vUwgOB8LxAosIurDiAW0s13rI1YwmaP++jvcxP77AWoQvenZebpCA2m8WC1/EosPYPMjnRAp/w== + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +once@1.4.0, once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.0, onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + +ora@5.4.1, ora@^5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== + 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" + +os-name@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/os-name/-/os-name-4.0.1.tgz#32cee7823de85a8897647ba4d76db46bf845e555" + integrity sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw== + dependencies: + macos-release "^2.5.0" + windows-release "^4.0.0" + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2, p-limit@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-json@^5.0.0, parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + 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" + +parse5-htmlparser2-tree-adapter@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6" + integrity sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA== + dependencies: + parse5 "^6.0.1" + +parse5@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" + integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== + +parse5@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + +passport-jwt@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/passport-jwt/-/passport-jwt-4.0.0.tgz#7f0be7ba942e28b9f5d22c2ebbb8ce96ef7cf065" + integrity sha512-BwC0n2GP/1hMVjR4QpnvqA61TxenUMlmfNjYNgK0ZAs0HK4SOQkHcSv4L328blNTLtHq7DbmvyNJiH+bn6C5Mg== + dependencies: + jsonwebtoken "^8.2.0" + passport-strategy "^1.0.0" + +passport-local@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/passport-local/-/passport-local-1.0.0.tgz#1fe63268c92e75606626437e3b906662c15ba6ee" + integrity sha512-9wCE6qKznvf9mQYYbgJ3sVOHmCWoUNMVFoZzNoznmISbhnNNPhN9xfY3sLmScHMetEJeoY7CXwfhCe7argfQow== + dependencies: + passport-strategy "1.x.x" + +passport-strategy@1.x.x, passport-strategy@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/passport-strategy/-/passport-strategy-1.0.0.tgz#b5539aa8fc225a3d1ad179476ddf236b440f52e4" + integrity sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA== + +passport@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/passport/-/passport-0.6.0.tgz#e869579fab465b5c0b291e841e6cc95c005fac9d" + integrity sha512-0fe+p3ZnrWRW74fe8+SvCyf4a3Pb2/h7gFkQ8yTJpAO50gDzlfjZUZTO1k5Eg9kUct22OxHLqDZoKUWRHOh9ug== + dependencies: + passport-strategy "1.x.x" + pause "0.0.1" + utils-merge "^1.0.1" + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-to-regexp@0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.2.5.tgz#0b426991e387fc4c675de23557f358715eb66fb0" + integrity sha512-l6qtdDPIkmAmzEO6egquYDfqQGPMRNGjYtrU13HAXb3YSRrt7HSb1sJY0pKp6o2bAa86tSB6iwaW2JbthPKr7Q== + +path-to-regexp@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-3.2.0.tgz#fa7877ecbc495c601907562222453c43cc204a5f" + integrity sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA== + +path-to-regexp@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.2.1.tgz#d54934d6798eb9e5ef14e7af7962c945906918e5" + integrity sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pause@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/pause/-/pause-0.0.1.tgz#1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d" + integrity sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pino-abstract-transport@v1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pino-abstract-transport/-/pino-abstract-transport-1.0.0.tgz#cc0d6955fffcadb91b7b49ef220a6cc111d48bb3" + integrity sha512-c7vo5OpW4wIS42hUVcT5REsL8ZljsUfBjqV/e2sFxmFEFZiq1XLUp5EYLtuDH6PEHq9W1egWqRbnLUP5FuZmOA== + dependencies: + readable-stream "^4.0.0" + split2 "^4.0.0" + +pino-std-serializers@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-6.0.0.tgz#4c20928a1bafca122fdc2a7a4a171ca1c5f9c526" + integrity sha512-mMMOwSKrmyl+Y12Ri2xhH1lbzQxwwpuru9VjyJpgFIH4asSj88F2csdMwN6+M5g1Ll4rmsYghHLQJw81tgZ7LQ== + +pino@^8.0.0: + version "8.4.2" + resolved "https://registry.yarnpkg.com/pino/-/pino-8.4.2.tgz#5de76e81b36e173d74244e0af4543e7ae241dbfd" + integrity sha512-PlXDeGhJZfAuVay+wtlS02s5j8uisQveZExYdAm9MwwxUQSz9R7Q78XtjM2tTa4sa5KJmygimZjZxXXuHgV6ew== + dependencies: + atomic-sleep "^1.0.0" + fast-redact "^3.1.1" + on-exit-leak-free "^2.1.0" + pino-abstract-transport v1.0.0 + pino-std-serializers "^6.0.0" + process-warning "^2.0.0" + quick-format-unescaped "^4.0.3" + real-require "^0.2.0" + safe-stable-stringify "^2.3.1" + sonic-boom "^3.1.0" + thread-stream "^2.0.0" + +pirates@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" + integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== + +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +pluralize@8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" + integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== + +pngjs@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-5.0.0.tgz#e79dd2b215767fd9c04561c01236df960bce7fbb" + integrity sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw== + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== + dependencies: + fast-diff "^1.1.2" + +prettier@^2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64" + integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== + +pretty-format@^28.0.0, pretty-format@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-28.1.3.tgz#c9fba8cedf99ce50963a11b27d982a9ae90970d5" + integrity sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q== + dependencies: + "@jest/schemas" "^28.1.3" + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +process-warning@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-2.0.0.tgz#341dbeaac985b90a04ebcd844d50097c7737b2ee" + integrity sha512-+MmoAXoUX+VTHAlwns0h+kFUWFs/3FZy+ZuchkgjyOu3oioLAo2LB5aCfKPh2+P9O18i3m43tUEv3YqttSy0Ww== + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== + +promise-retry@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" + integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== + dependencies: + err-code "^2.0.2" + retry "^0.12.0" + +prompts@^2.0.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +proxy-addr@^2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +qrcode@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.5.1.tgz#0103f97317409f7bc91772ef30793a54cd59f0cb" + integrity sha512-nS8NJ1Z3md8uTjKtP+SGGhfqmTCs5flU/xR623oI0JX+Wepz9R8UrRVCTBTJm3qGw3rH6jJ6MUHjkDx15cxSSg== + dependencies: + dijkstrajs "^1.0.1" + encode-utf8 "^1.0.3" + pngjs "^5.0.0" + yargs "^15.3.1" + +qs@6.9.3: + version "6.9.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.3.tgz#bfadcd296c2d549f1dffa560619132c977f5008e" + integrity sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw== + +qs@^6.10.3: + version "6.10.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" + integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== + dependencies: + side-channel "^1.0.4" + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +quick-format-unescaped@^4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz#93ef6dd8d3453cbc7970dd614fad4c5954d6b5a7" + integrity sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +react-is@^18.0.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" + integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== + +readable-stream@^3.4.0, readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readable-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.1.0.tgz#280d0a29f559d3fb684a277254e02b6f61ae0631" + integrity sha512-sVisi3+P2lJ2t0BPbpK629j8wRW06yKGJUcaLAGXPAUhyUxVJm7VsCTit1PFgT4JHUDMrGNR+ZjSKpzGaRF3zw== + dependencies: + abort-controller "^3.0.0" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +real-require@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/real-require/-/real-require-0.2.0.tgz#209632dea1810be2ae063a6ac084fee7e33fba78" + integrity sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg== + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== + dependencies: + resolve "^1.1.6" + +rechoir@^0.7.0: + version "0.7.1" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.1.tgz#9478a96a1ca135b5e88fc027f03ee92d6c645686" + integrity sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg== + dependencies: + resolve "^1.9.0" + +reflect-metadata@^0.1.13: + version "0.1.13" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" + integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== + +regexpp@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve.exports@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9" + integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== + +resolve@^1.1.6, resolve@^1.20.0, resolve@^1.9.0: + version "1.22.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +ret@~0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.2.2.tgz#b6861782a1f4762dce43402a71eb7a283f44573c" + integrity sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ== + +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rfdc@^1.2.0, rfdc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" + integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== + +rimraf@3.0.2, rimraf@^3.0.0, rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +run-async@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rxjs@6.6.7, rxjs@^6.6.0: + version "6.6.7" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" + integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== + dependencies: + tslib "^1.9.0" + +rxjs@^7.5.5, rxjs@^7.5.6: + version "7.5.6" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.6.tgz#0446577557862afd6903517ce7cae79ecb9662bc" + integrity sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw== + dependencies: + tslib "^2.1.0" + +safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-regex2@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/safe-regex2/-/safe-regex2-2.0.0.tgz#b287524c397c7a2994470367e0185e1916b1f5b9" + integrity sha512-PaUSFsUaNNuKwkBijoAPHAK6/eM6VirvyPWlZ7BAQy4D+hCvh4B6lIG+nPdhbFfIbP+gTGBcrdsOaUs0F+ZBOQ== + dependencies: + ret "~0.2.0" + +safe-stable-stringify@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.3.1.tgz#ab67cbe1fe7d40603ca641c5e765cb942d04fc73" + integrity sha512-kYBSfT+troD9cDA85VDnHZ1rpHC50O0g1e6WlGHVCz/g+JS+9WKLj+XwFYyR8UbrZN8ll9HUpDAAddY58MGisg== + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax@>=0.6.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +schema-utils@^3.1.0, schema-utils@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" + integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.0.tgz#60331e9e3ae78ec5d16353c467c34b3a0a1d3df7" + integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== + dependencies: + "@types/json-schema" "^7.0.9" + ajv "^8.8.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.0.0" + +secure-json-parse@^2.4.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/secure-json-parse/-/secure-json-parse-2.5.0.tgz#f929829df2adc7ccfb53703569894d051493a6ac" + integrity sha512-ZQruFgZnIWH+WyO9t5rWt4ZEGqCKPwhiw+YbzTwpmT9elgLrLcfuyUiSnwwjUiVy9r4VM3urtbNF1xmEh9IL2w== + +semver@7.x, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7: + version "7.3.7" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" + integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== + dependencies: + lru-cache "^6.0.0" + +semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^6.0.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +send@^0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + 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" + +serialize-javascript@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== + dependencies: + randombytes "^2.1.0" + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + +set-cookie-parser@^2.4.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.5.1.tgz#ddd3e9a566b0e8e0862aca974a6ac0e01349430b" + integrity sha512-1jeBGaKNGdEq4FgIrORu/N570dwoPYio8lSoYLWmX7sQ//0JY08Xh9o5pBcgmHQ/MbsYp/aZnOe1s1lIsbLprQ== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +sha.js@^2.4.11: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shelljs@0.8.5: + version "0.8.5" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" + integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slash@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" + integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== + +smart-buffer@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== + +socks-proxy-agent@^6.0.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz#2687a31f9d7185e38d530bef1944fe1f1496d6ce" + integrity sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ== + dependencies: + agent-base "^6.0.2" + debug "^4.3.3" + socks "^2.6.2" + +socks@^2.6.2: + version "2.7.0" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.0.tgz#f9225acdb841e874dca25f870e9130990f3913d0" + integrity sha512-scnOe9y4VuiNUULJN72GrM26BNOjVsfPXI+j+98PkyEfsIXroa5ofyjT+FzGvn/xHs73U2JtoBYAVx9Hl4quSA== + dependencies: + ip "^2.0.0" + smart-buffer "^4.2.0" + +sonic-boom@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-3.2.0.tgz#ce9f2de7557e68be2e52c8df6d9b052e7d348143" + integrity sha512-SbbZ+Kqj/XIunvIAgUZRlqd6CGQYq71tRRbXR92Za8J/R3Yh4Av+TWENiSiEgnlwckYLyP0YZQWVfyNC0dzLaA== + dependencies: + atomic-sleep "^1.0.0" + +source-map-support@0.5.13: + version "0.5.13" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-support@0.5.21, source-map-support@^0.5.21, source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@0.7.3: + version "0.7.3" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" + integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== + +source-map@^0.6.0, source-map@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +sourcemap-codec@^1.4.8: + version "1.4.8" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + +split2@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/split2/-/split2-4.1.0.tgz#101907a24370f85bb782f08adaabe4e281ecf809" + integrity sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +sqlite3@^5.0.11: + version "5.0.11" + resolved "https://registry.yarnpkg.com/sqlite3/-/sqlite3-5.0.11.tgz#102c835d70be66da9d95a383fd6ea084a082ef7f" + integrity sha512-4akFOr7u9lJEeAWLJxmwiV43DJcGV7w3ab7SjQFAFaTVyknY3rZjvXTKIVtWqUoY4xwhjwoHKYs2HDW2SoHVsA== + dependencies: + "@mapbox/node-pre-gyp" "^1.0.0" + node-addon-api "^4.2.0" + tar "^6.1.11" + optionalDependencies: + node-gyp "8.x" + +ssri@^8.0.0, ssri@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" + integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== + dependencies: + minipass "^3.1.1" + +stack-utils@^2.0.3: + version "2.0.5" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5" + integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA== + dependencies: + escape-string-regexp "^2.0.0" + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +stream-wormhole@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/stream-wormhole/-/stream-wormhole-1.1.0.tgz#300aff46ced553cfec642a05251885417693c33d" + integrity sha512-gHFfL3px0Kctd6Po0M8TzEvt3De/xu6cnRrjlfYNhwbhLPLwigI2t1nc6jrzNuaYg5C4YF78PPFuQPzRiqn9ew== + +string-length@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" + integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== + dependencies: + char-regex "^1.0.2" + strip-ansi "^6.0.0" + +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string_decoder@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +superagent@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/superagent/-/superagent-8.0.0.tgz#2ea4587df4b81ef023ec01ebc6e1bcb9e2344cb6" + integrity sha512-iudipXEel+SzlP9y29UBWGDjB+Zzag+eeA1iLosaR2YHBRr1Q1kC29iBrF2zIVD9fqVbpZnXkN/VJmwFMVyNWg== + dependencies: + component-emitter "^1.3.0" + cookiejar "^2.1.3" + debug "^4.3.4" + fast-safe-stringify "^2.1.1" + form-data "^4.0.0" + formidable "^2.0.1" + methods "^1.1.2" + mime "2.6.0" + qs "^6.10.3" + readable-stream "^3.6.0" + semver "^7.3.7" + +supertest@^6.2.4: + version "6.2.4" + resolved "https://registry.yarnpkg.com/supertest/-/supertest-6.2.4.tgz#3dcebe42f7fd6f28dd7ac74c6cba881f7101b2f0" + integrity sha512-M8xVnCNv+q2T2WXVzxDECvL2695Uv2uUj2O0utxsld/HRyJvOU8W9f1gvsYxSNU4wmIe0/L/ItnpU4iKq0emDA== + dependencies: + methods "^1.1.2" + superagent "^8.0.0" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.0.0, supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-hyperlinks@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb" + integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== + dependencies: + has-flag "^4.0.0" + supports-color "^7.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +symbol-observable@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-4.0.0.tgz#5b425f192279e87f2f9b937ac8540d1984b39205" + integrity sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ== + +tapable@^2.1.1, tapable@^2.2.0, tapable@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +tar@^6.0.2, tar@^6.1.11, tar@^6.1.2: + version "6.1.11" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" + integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA== + 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" + +terminal-link@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" + integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== + dependencies: + ansi-escapes "^4.2.1" + supports-hyperlinks "^2.0.0" + +terser-webpack-plugin@^5.1.3: + version "5.3.3" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz#8033db876dd5875487213e87c627bca323e5ed90" + integrity sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ== + 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" + +terser@^5.7.2: + version "5.14.2" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.14.2.tgz#9ac9f22b06994d736174f4091aa368db896f1c10" + integrity sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA== + dependencies: + "@jridgewell/source-map" "^0.3.2" + acorn "^8.5.0" + commander "^2.20.0" + source-map-support "~0.5.20" + +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +text-decoding@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/text-decoding/-/text-decoding-1.0.0.tgz#38a5692d23b5c2b12942d6e245599cb58b1bc52f" + integrity sha512-/0TJD42KDnVwKmDK6jj3xP7E2MG7SHAOG4tyTgyUCRPdHwvkquYNLEQltmdMa3owq3TkddCVcTsoctJI8VQNKA== + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + +thirty-two@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/thirty-two/-/thirty-two-1.0.2.tgz#4ca2fffc02a51290d2744b9e3f557693ca6b627a" + integrity sha512-OEI0IWCe+Dw46019YLl6V10Us5bi574EvlJEOcAkB29IzQ/mYD1A6RyNHLjZPiHCmuodxvgF6U+vZO1L15lxVA== + +thread-stream@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/thread-stream/-/thread-stream-2.1.0.tgz#d560dd8b9d09482b0e2e876a96c229c374870836" + integrity sha512-5+Pf2Ya31CsZyIPYYkhINzdTZ3guL+jHq7D8lkBybgGcSQIKDbid3NJku3SpCKeE/gACWAccDA/rH2B6doC5aA== + dependencies: + real-require "^0.2.0" + +through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + +tiny-lru@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/tiny-lru/-/tiny-lru-8.0.2.tgz#812fccbe6e622ded552e3ff8a4c3b5ff34a85e4c" + integrity sha512-ApGvZ6vVvTNdsmt676grvCkUCGwzG9IqXma5Z07xJgiC5L7akUMof5U8G2JTI9Rz/ovtVhJBlY6mNhEvtjzOIg== + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +tree-kill@1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + +ts-jest@^28.0.7: + version "28.0.8" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-28.0.8.tgz#cd204b8e7a2f78da32cf6c95c9a6165c5b99cc73" + integrity sha512-5FaG0lXmRPzApix8oFG8RKjAz4ehtm8yMKOTy5HX3fY6W8kmvOrmcY0hKDElW52FJov+clhUbrKAqofnj4mXTg== + dependencies: + bs-logger "0.x" + fast-json-stable-stringify "2.x" + jest-util "^28.0.0" + json5 "^2.2.1" + lodash.memoize "4.x" + make-error "1.x" + semver "7.x" + yargs-parser "^21.0.1" + +ts-loader@^9.3.1: + version "9.3.1" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.3.1.tgz#fe25cca56e3e71c1087fe48dc67f4df8c59b22d4" + integrity sha512-OkyShkcZTsTwyS3Kt7a4rsT/t2qvEVQuKCTg4LJmpj9fhFR7ukGdZwV6Qq3tRUkqcXtfGpPR7+hFKHCG/0d3Lw== + dependencies: + chalk "^4.1.0" + enhanced-resolve "^5.0.0" + micromatch "^4.0.0" + semver "^7.3.4" + +ts-node@^10.9.1: + version "10.9.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" + integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + +tsconfig-paths-webpack-plugin@3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-3.5.2.tgz#01aafff59130c04a8c4ebc96a3045c43c376449a" + integrity sha512-EhnfjHbzm5IYI9YPNVIxx1moxMI4bpHD2e0zTXeDNQcwjjRaGepP7IhTHJkyDBG0CAOoxRfe7jCG630Ou+C6Pw== + dependencies: + chalk "^4.1.0" + enhanced-resolve "^5.7.0" + tsconfig-paths "^3.9.0" + +tsconfig-paths-webpack-plugin@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.0.0.tgz#84008fc3e3e0658fdb0262758b07b4da6265ff1a" + integrity sha512-fw/7265mIWukrSHd0i+wSwx64kYUSAKPfxRDksjKIYTxSAp9W9/xcZVBF4Kl0eqQd5eBpAQ/oQrc5RyM/0c1GQ== + dependencies: + chalk "^4.1.0" + enhanced-resolve "^5.7.0" + tsconfig-paths "^4.0.0" + +tsconfig-paths@3.14.1, tsconfig-paths@^3.9.0: + version "3.14.1" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" + integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.1" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tsconfig-paths@^4.0.0, tsconfig-paths@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-4.1.0.tgz#f8ef7d467f08ae3a695335bf1ece088c5538d2c1" + integrity sha512-AHx4Euop/dXFC+Vx589alFba8QItjF+8hf8LtmuiCwHyI4rHXQtOOENaM8kvYf5fR0dRChy3wzWIZ9WbB7FWow== + dependencies: + json5 "^2.2.1" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tslib@2.4.0, tslib@^2.1.0, tslib@^2.3.1: + version "2.4.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" + integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== + +tslib@^1.8.1, tslib@^1.9.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-detect@4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +typeorm@^0.3.7: + version "0.3.7" + resolved "https://registry.yarnpkg.com/typeorm/-/typeorm-0.3.7.tgz#5776ed5058f0acb75d64723b39ff458d21de64c1" + integrity sha512-MsPJeP6Zuwfe64c++l80+VRqpGEGxf0CkztIEnehQ+CMmQPSHjOnFbFxwBuZ2jiLqZTjLk2ZqQdVF0RmvxNF3Q== + dependencies: + "@sqltools/formatter" "^1.2.2" + app-root-path "^3.0.0" + buffer "^6.0.3" + chalk "^4.1.0" + cli-highlight "^2.1.11" + date-fns "^2.28.0" + debug "^4.3.3" + dotenv "^16.0.0" + glob "^7.2.0" + js-yaml "^4.1.0" + mkdirp "^1.0.4" + reflect-metadata "^0.1.13" + sha.js "^2.4.11" + tslib "^2.3.1" + uuid "^8.3.2" + xml2js "^0.4.23" + yargs "^17.3.1" + +typescript@4.7.4, typescript@^4.7.4: + version "4.7.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.4.tgz#1a88596d1cf47d59507a1bcdfb5b9dfe4d488235" + integrity sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ== + +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== + dependencies: + imurmurhash "^0.1.4" + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +update-browserslist-db@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.4.tgz#dbfc5a789caa26b1db8990796c2c8ebbce304824" + integrity sha512-jnmO2BEGUjsMOe/Fg9u0oczOe/ppIDZPebzccl1yDWGLFP16Pa1/RM5wEoKYPG2zstNcDuAStejyxsOuKINdGA== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +util-deprecate@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +utils-merge@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +uuid@8.3.2, uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + +v8-compile-cache@^2.0.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== + +v8-to-istanbul@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz#b6f994b0b5d4ef255e17a0d17dc444a9f5132fa4" + integrity sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w== + dependencies: + "@jridgewell/trace-mapping" "^0.3.12" + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^1.6.0" + +validator@^13.7.0: + version "13.7.0" + resolved "https://registry.yarnpkg.com/validator/-/validator-13.7.0.tgz#4f9658ba13ba8f3d82ee881d3516489ea85c0857" + integrity sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw== + +walker@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== + dependencies: + makeerror "1.0.12" + +watchpack@^2.3.1, watchpack@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" + integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== + dependencies: + defaults "^1.0.3" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +webpack-cli@^4.10.0: + version "4.10.0" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.10.0.tgz#37c1d69c8d85214c5a65e589378f53aec64dab31" + integrity sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w== + dependencies: + "@discoveryjs/json-ext" "^0.5.0" + "@webpack-cli/configtest" "^1.2.0" + "@webpack-cli/info" "^1.5.0" + "@webpack-cli/serve" "^1.7.0" + colorette "^2.0.14" + commander "^7.0.0" + cross-spawn "^7.0.3" + fastest-levenshtein "^1.0.12" + import-local "^3.0.2" + interpret "^2.2.0" + rechoir "^0.7.0" + webpack-merge "^5.7.3" + +webpack-merge@^5.7.3: + version "5.8.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" + integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== + dependencies: + clone-deep "^4.0.1" + wildcard "^2.0.0" + +webpack-node-externals@3.0.0, webpack-node-externals@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/webpack-node-externals/-/webpack-node-externals-3.0.0.tgz#1a3407c158d547a9feb4229a9e3385b7b60c9917" + integrity sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ== + +webpack-sources@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + +webpack@5.73.0: + version "5.73.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.73.0.tgz#bbd17738f8a53ee5760ea2f59dce7f3431d35d38" + integrity sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA== + 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" + +webpack@^5, webpack@^5.74.0: + version "5.74.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.74.0.tgz#02a5dac19a17e0bb47093f2be67c695102a55980" + integrity sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA== + 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.7.1" + acorn-import-assertions "^1.7.6" + browserslist "^4.14.5" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.10.0" + 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.4.0" + webpack-sources "^3.2.3" + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== + +which@^2.0.1, which@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.2, wide-align@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" + integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== + dependencies: + string-width "^1.0.2 || 2 || 3 || 4" + +wildcard@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" + integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== + +windows-release@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/windows-release/-/windows-release-4.0.0.tgz#4725ec70217d1bf6e02c7772413b29cdde9ec377" + integrity sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg== + dependencies: + execa "^4.0.2" + +word-wrap@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write-file-atomic@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.1.tgz#9faa33a964c1c85ff6f849b80b42a88c2c537c8f" + integrity sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + +xml2js@^0.4.23: + version "0.4.23" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" + integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== + dependencies: + sax ">=0.6.0" + xmlbuilder "~11.0.0" + +xmlbuilder@~11.0.0: + version "11.0.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" + integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== + +y18n@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^1.10.0: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yargs-parser@21.0.1, yargs-parser@^21.0.0: + version "21.0.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.0.1.tgz#0267f286c877a4f0f728fceb6f8a3e4cb95c6e35" + integrity sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg== + +yargs-parser@^18.1.2: + version "18.1.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-parser@^21.0.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^15.3.1: + version "15.4.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" + integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== + dependencies: + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^4.2.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^18.1.2" + +yargs@^16.0.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yargs@^17.3.1: + version "17.5.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.5.1.tgz#e109900cab6fcb7fd44b1d8249166feb0b36e58e" + integrity sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA== + 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" + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==